2015-01-21 6 views
1

:이 코드는 아무런 문제가 없습니다본론 - JMP 00000000 이것은 내가 사용하고 코드입니다

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <detours.h> 
#include <fstream> 

#define real_sendto 0x152942C6 
void(__cdecl* originalFunction)(); 

void tompa_sendto() { 
    printf("Hellooo"); 
    return originalFunction(); 
} 

void hook() { 
    originalFunction = (void(__cdecl*)())DetourFunction((PBYTE)real_sendto, (PBYTE)tompa_sendto); 
} 


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { 
    switch (ul_reason_for_call) { 
     case DLL_PROCESS_ATTACH: hook(); break; 
     case DLL_PROCESS_DETACH: return FALSE; break; 
    } 
    return TRUE; 
} 

, 그것은 후크가 0x152942C6에 배치하고 나는 그것이 (내 tompa_sendto 점프있어 볼 수 있습니다)는 그리고 다시. 내가 후크로 대신이 코드를 사용하는 경우

그것은 내가 0x152942C6에서 볼 수있는 메모리에 제대로
를 후크를 설정하지 않습니다 : JMP 내가 tompa_sendto에 배치 무엇이든간에 코드 00000000

void tompa_sendto() { 
    char buffer[] = {'x', 'y', 'z'}; 
    return originalFunction(); 
} 

() 나쁜 jmp 때문에 프로그램을 충돌, 거기에 넣어 관리했습니다 유일한 2 코드 printf 및 messageBoxA 있습니다.

+1

아마도'DetourFunction'이 실패하고'NULL' 포인터를 반환했기 때문일 수 있습니까? –

+0

**'tompa_sendto'가 호출되기 전에'originalFunction'가 적절히 초기화되었는지 확신합니까? –

+0

@barakmanos 전역 변수이므로 0으로 초기화해야합니다. –

답변

1

나는 문제를 재현 할 수 있었지만 (단지 1.5의 우회 도로 만 가능), 그래서 나는 파고 들었다. 문제는 단지 귀하의 우회 기능이 비어있는 것입니다.

다른 호출에서 복귀하여 호출을 종료하면 컴파일러에서 함수를 호출하지 않고 호출 대신 점프하여 직접 함수를 호출하지만 특정 최적화를 수행합니다. 이것은 리턴 주소를 푸시하지 않으므로 다음 함수가 리턴 할 때 이전 함수 리턴 주소를 사용하고 동시에 둘 다 리턴합니다. 길게만 말하면 함수는 call func; ret 대신 jmp func으로 끝납니다.

이제 함수가 비어있을 때이 점프 만 함수에서 사용할 수 있습니다. 또 다른 사실은 변수를 통해 원래의 함수를 호출하고 이것은 간접적 인 점프로 변환된다는 것입니다. Detours 1.5는 사용자의 함수가 간접 점프로 시작하는지 여부를 구체적으로 확인하고 발견 된 경우 간접 점프를 기반으로 직접 점프로 대상 함수를 후크합니다. 왜 ? DLL 호출과 같은 많은 함수가 간접 점프 테이블을 통해 호출되기 때문에 Detours는이를 찾으면 바로 가기를 시도합니다.

대상 함수는 originalFunction으로 점프하여 연결되지만 후크를 설치할 때이 변수는 0이므로 jmp 0입니다. 후크 앞에 originalFunction을 3으로 설정하려고하면 볼 수 있습니다. 함수가 비어 있지 않으면이 문제가 발생하지 않으므로 걱정하지 마십시오. 간단히 __nop();을 반환하면 비어있는 경우에도 작동합니다.

+0

Yup! 네가 옳아. 함수에 몇 가지 매개 변수를 추가하고 비어있는 함수 (그냥 호출)를 남겼지 만 이번에는 효과가있었습니다. 나는 __nop을 시도하지 않았지만 그것이 효과가 있었을 것이라고 확신한다! – Tompina