你知道为什么我hook其中一个kernel32函数时程序运行不了吗?我正在编写反作弊程序并希望对其进行更多优化,因为目前它在线程中,但有些地方不对...
写有OpenProcess,因为我之前试过hook它,同样的问题。
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 );
}
最佳答案
“//我在这里的操作”会很有趣,也许你正在破坏堆栈。 或者错误可能出在您的 DetourFunction 中。 你的程序怎么会失败?可能存在访问冲突?
您也不必使用裸函数。您可以 Hook 一个与您的目标具有完全相同签名的函数。 不需要汇编。
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 的返回值,如果那是正确的,则您的 DetourFunction 中的某些地方可能会出错。
你也可以使用像 beaengine 这样的反汇编器,绕道后转储你的目标函数,看看 hook 是否被正确应用
关于c++ - Hook kernel32.dll 函数使我的程序无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033200/