Detours를 사용하여 실행 파일의 메시지 함수에 연결하지만 자체 코드를 실행 한 다음 원래 코드를 호출해야합니다. Detours의 문서에서 보았던 것에서는 자동적으로 일어나는 것처럼 들립니다. 원래 기능은 화면에 메시지를 인쇄하지만, 우회로를 부착하자 마자 코드가 실행되고 인쇄가 중지됩니다.detoured 함수에서 원래 함수를 호출해야합니다.
원래의 기능 코드는 대략 다음과 같습니다
void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB);
내 기능은 다음과 같습니다
void CGuiObject_AppendMsgToBuffer([same params, with names]);
내가 원래 기능에있는 메모리 위치를 알고, 그래서 사용 :
DWORD OrigPos = 0x0040592C;
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer);
나를 기능으로 데려 간다. 이 코드는 거의 완벽하게 작동합니다. 즉, 함수가 적절한 매개 변수로 호출됩니다. 그러나 실행은 내 함수를 떠나고 원래 코드는 호출되지 않습니다. 나는 jmping을 다시 시도했지만, 프로그램을 충돌시킨다. (나는 Detours 코드가 후크에 맞게 움직 였다고 가정하고있다.)
편집 : 프로그램 실행으로 돌아 가지 않고 첫 번째 문제를 해결할 수있었습니다. OrigPos 값을 함수로 호출하면 "trampoline"함수로 이동하여 원래 코드로 이동할 수 있습니다. 그러나 어딘가에있는 라인을 따라 레지스터가 변경되고있어 원래 코드로 돌아 가면 바로 프로그램이 segfault로 중단됩니다.
Edit2가 : 최종 작업 코드 :
class CGuiObject
{
public:
void MyFunc([params]);
};
DWORD TrueAddr = 0x0040592C;
CGuiObject::MyFunc([params])
{
_asm { pushad }
// process
_asm {
popad
leave
jmp TrueAddr
}
}
및 DetourAttach의 첫 PARAM에 대한 TrueAddr를 사용하여.
역 분해기에서이 단계를 수행 할 수 있습니까? –
예, 디버그를 빌드하고 내 기능의 시작 부분에 중단 점을 설정했습니다. 코드 누락, pushad, 일부 로깅을 수행합니다 (<< 연산자), popad 및 jmp를 사용하여 fstream에 메시지를 보내고 Detours가 반환 한 주소로 보내십시오. 실행은 복사 된 내용을 통해 원래의 실행 파일로 되돌아갑니다. 그것은 몇 라인을 실행하지만, 내가 볼 수있는 한 ECX는 0으로 재설정되고 포인터로 사용되므로 segfault가 사용됩니다. 그게 도움이되지 않으면, 나는 asm으로 전체 코드를 게시 할 수 있습니다. – ssube