2013-08-03 4 views
0

Знаете ли вы, почему я не могу запустить программу при подключении одной из функций kernel32? Я пишу анти-чит и хочу оптимизировать его больше, потому что в настоящее время он в потоке, но что-то не так ...Hooking kernel32.dll перестает работать с моей программой

Написано OpenProcess, потому что я попытался прежде, чем подключить его и ту же проблему.

typedef HANDLE (WINAPI * pOpenProcess)( _In_ HANDLE hProcess, 
             _In_ LPSECURITY_ATTRIBUTES lpThreadAttributes, 
             _In_ SIZE_T dwStackSize, 
             _In_ LPTHREAD_START_ROUTINE lpStartAddress, 
             _In_ LPVOID lpParameter, 
             _In_ DWORD dwCreationFlags, 
             _Out_ LPDWORD lpThreadId); 

pOpenProcess original; 

__declspec(naked) void hOpenProcess() 
{ 
    __asm PUSHAD 
    __asm PUSHFD 
     //my actions here 
    __asm POPFD 
    __asm POPAD 
    __asm JMP[original] 
}; 

void ZPerformHook() 
{ 
    DWORD Address = (DWORD)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateRemoteThread"); 
    original = (pOpenProcess)DetourFunction((PBYTE)Address, (PBYTE)hOpenProcess); 
} 
+0

Аргументы для OpenProcess передаются в стек. Самое первое, что вы делаете, это изменить стек. Это не хорошо. Ваш код должен как сохранить регистры процессора *, так и * не повредить стек. Это нетривиально, лучше не писать этот код самостоятельно. Это было сделано, вы уже отметили вопрос с помощью [обходных путей], чтобы вы уже знали хорошее решение. Нет смысла ожидать другого. –

+0

@ HansPassant: Несмотря на то, что я искренне согласен с тем, что для этого не существует оснований для написания собственного кода, аргумент о том, что стек представляет собой сообщение выше, не применяется, поскольку те же операции PUSH сопоставляются с операциями POP - по крайней мере а не для вызова исходной функции. Более вероятно, что '// мои действия здесь 'как-то сломаны (или' original' не содержит правильный адрес, возможно). –

+1

[Предполагая, что это скомпилировано для 32-битного кода, но я думаю, что встроенный ассемблер в любом случае не поддерживается в 64-битном режиме, а встроенный ассемблер должен знать, что PUSHFD и POPFD, PUSHAD и POPAD не работают для x86-64. –

ответ

1

"// Мои действия здесь" были бы интересными, возможно, вы развращаете стек. или, может быть, ошибка в вашей функции DetourFunction. Как ваша программа не работает? возможно, с нарушением прав доступа?

Также вам не нужно использовать голые функции. вы можете просто подключиться к функции, которая имеет ту же самую подпись, что и ваша цель. no asm необходимо.

HANDLE __stdcall hOpenProcess( HANDLE hProcess, 
           LPSECURITY_ATTRIBUTES lpThreadAttributes, 
           SIZE_T dwStackSize, 
           LPTHREAD_START_ROUTINE lpStartAddress, 
           LPVOID lpParameter, 
           DWORD dwCreationFlags, 
           LPDWORD lpThreadId) 
{ 
    // do your stuff here 
    std::cout << "From hook" << std::endl; 

    return original(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId); 
} 

если это не распространяется работа, проверьте возвращаемое значение GetProcAddress, если that's исправить, что-то в вашем DetourFunction может идти неправильно.

вы также можете использовать дизассемблер как beaengine и сваливать свою целевую функцию после объезда, чтобы увидеть, если крючок был применен правильно

 Смежные вопросы

  • Нет связанных вопросов^_^