2016-08-06 9 views
0

Я пытаюсь использовать обходные узлы MS, и я не знаю, делаю ли я что-то неправильно; Кажется, я не могу найти ответ на свой вопрос.Почему процесс рушится при попытке объединить winapi?

Я попытался объединить несколько функций в процессе, используя мою вложенную DLL, но каждая попытка заставляет процесс сбой.

Одна из функций я пытаюсь подключить это WinAPI DirectDrawCreate:

DetourTransactionBegin(); 
DetourUpdateThread(GetCurrentThread()); 
DetourAttach((PVOID *)DirectDrawCreate, hkDirectDrawCreate); 
DetourTransactionCommit(); 

hkDirectDrawCreate определяется как:

HRESULT __stdcall hkDirectDrawCreate(GUID *p1, LPDIRECTDRAW *p2, IUnknown *p3) 
{ 
    if(!pDDC) 
     return 0x00; 

    printf("A call to hkDirectDrawCreate was made\n"); 

    return DirectDrawCreate(p1, p2, p3); 
} 

На призыв DetourAttach сбои процесса; стек трассировки:

Кодекса перерывы в 'detour_skip_jmp' в '0x68B028BD':

// First, skip over the import vector if there is one. 
    if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [imm32] 
68B028B2 mov   ecx,1 
68B028B7 imul  edx,ecx,0 
68B028BA mov   eax,dword ptr [pbCode] 
68B028BD movzx  ecx,byte ptr [eax+edx] 
68B028C1 cmp   ecx,0FFh 
68B028C7 jne   detour_skip_jmp+82h (68B02912h) 
68B028C9 mov   edx,1 
68B028CE shl   edx,0 
68B028D1 mov   eax,dword ptr [pbCode] 
68B028D4 movzx  ecx,byte ptr [eax+edx] 
68B028D8 cmp   ecx,25h 
68B028DB jne   detour_skip_jmp+82h (68B02912h) 

Edit: ppGlobals является NULL, и pbCode выдает ошибку 'Ошибка чтения символов из строки'

Возвращаясь к DetourCodeFromPointer, ppGlobals также является NULL, но я предполагаю, что это должно быть; здесь находится звонок:

pDetour = DetourCodeFromPointer(pDetour, NULL); 

ответ

2

Нет сомнений, что таблица импорта была перемещена или вычищена в качестве метода предотвращения зацепов. Просто добавьте прыжок в начале DirectDrawCreate в hkDirectDrawCreate, а затем, когда вы вызываете исходный переход обратно в DirectDrawCreate, но будьте уверены, что это после вашего перехода к вашему крюку, иначе вы застряли в бесконечном рекурсивном цикле.