2011-10-07 3 views
3

리버스 엔지니어링 중에 eax (매우 이상한 컴파일러)에서 하나의 인수를 전달하는 호출 규칙을 사용하는 매우 이상한 프로그램이 있습니다. 내가 지금 그 함수를 호출 할 내가 그것을 선언하는 방법을 모른다, IDA는 PARAM1가 EAX 레지스터에 전달됩니다C++ 사용자 지정 호출 규칙

bool __usercall foo<ax>(int param1<eax>, int param2); 

로 정의합니다. 나는 그러나

bool MyFoo(int param1, int param2) 
{ 
    __asm mov eax, param1; 
    return reinterpret_cast<bool(__stdcall *)(int)>(g_FooAddress)(param2); 
} 

뭔가를 시도, 불행히도 내 컴파일러는 스택에 PARAM2을 밀어 때, 나는 인라인 어셈블러와 전체 호출을 작성하지 않고이 깨끗하게 만들 수있는 방법 어떤 방법이있는 EAX 레지스터를 사용한다? (저는 Visual Studio를 사용하고 있습니다.)

답변

2

레지스터를 통해 인수를 전달하는 "일반적인"호출 규칙이 있습니다. 예를 들어 MSVC를 사용하는 경우 __fastcall.

http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

당신은 당신의 자신의 호출 규칙을 정의 할 수 없습니다,하지만 난 당신이 인라인 어셈블리를 통해 자신의 전화/정리 작업을 수행하는 래퍼 함수를 ​​생성 할 것을 제안했다. __fastcall을 사용하고 약간의 레지스터 스와핑을 수행 한 다음 올바른 함수에 jmp을 사용하면이 효과를 얻는 데 가장 효과적 일 수 있습니다.

인자를 전달하는 것보다 호출 규칙이 더 많으므로 호출자의 작동 방식을 완전히 제어 할 수 있으므로 옵션 # 1이 가장 좋습니다.

+0

나는 MSVC fastcall이 ECX + EDX를 사용하고 EAX가 아니라는 것을 알고 있기 때문에 내가 필요로하는 것이 아님 :-( – Listing

+0

당신이 제안한 것처럼 인라인 어셈블러로 떨어지는 것을 의지 해 주셔서 감사합니다. 나는 항상 당신이 거의 항상 인라인을 피할 수 있다고 생각했습니다. 어셈블러는 내가 만나는 첫 번째 상황입니다. – Listing

관련 문제