2014-06-18 3 views
0

원래 함수의 시작 부분에 JMP 명령을 쓸 때 win32 API 함수에 trampoline 후크를 쓰려고합니다. 함수를 호출하는 대신 코드 캐브 (codecave).C++에서 간단한 어셈블리 코드를 함수없이 실행하려고합니다.

PUSH 14 
MOV EAX, 12345678 
... 

그리고 나는 그것을 패치 :

원래 기능의 시작은 올리 디버그에서 다음과 같습니다

JMP 87654321 
NOP 
NOP 

다음 함수의 주소 :

int HookFunc(int param) 
{ 
    DoStuff(param); 
    return ExecuteOriginal(param); 
} 

ExceuteOriginal 모습 이렇게 :

unsigned long address = AddressOfOriginalFunction + 7; 

int ExceuteOriginal(int param) 
{ 
    __asm 
    { 
     PUSH 0x14 
     MOV EAX, 0x12345678 
     JMP address 
    } 
} 

오버라이드 된 코드를 실행하고 패치 된 코드 바로 다음에 원래 함수로 이동합니다. 문제는 함수이므로 호출자가이를 정리해야하고 반환 대신 함수가 다른 함수의 코드로 점프하기 때문에 스택이 엉망이 될 것이라는 점입니다. 그리고 그것이 프로그램이 충돌하는 이유입니다.

Visual C++ 컴파일러를 사용하여 프로그램의 코드 섹션에 어셈블리 코드를 배치하는 방법이 있습니까? 그 방법으로 나는 거기로 뛰어 올라서 무엇이든 실행하고 스택을 망칠 위험없이 되돌아 갈 수 있습니다.

답변

6

해결 방법 : 벌거 벗은 특성으로 선언 함수의 __declspec(naked)

, 컴파일러는 프롤로그와 에필로그 코드없이 코드를 생성합니다. 이 기능을 사용하여 인라인 어셈블러 코드를 사용하여 자신의 프롤로그/에필로그 코드 시퀀스를 작성할 수 있습니다.

예 :

__declspec(naked) int ExceuteOriginal(int param) 
{ 
    __asm 
    { 
     PUSH 14 
     MOV EAX, 0x12345678 
     JMP address 
    } 
} 
+0

감사 alot을! 이것은 내가 찾고 있었던 바로 그 것이다! +1 간단한 솔루션 – UnTraDe