원래 함수의 시작 부분에 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++ 컴파일러를 사용하여 프로그램의 코드 섹션에 어셈블리 코드를 배치하는 방법이 있습니까? 그 방법으로 나는 거기로 뛰어 올라서 무엇이든 실행하고 스택을 망칠 위험없이 되돌아 갈 수 있습니다.
감사 alot을! 이것은 내가 찾고 있었던 바로 그 것이다! +1 간단한 솔루션 – UnTraDe