2013-08-03 44 views
0

你知道为什么我挂钩kernel32函数时不能运行程序吗?我正在写反作弊,并希望更好地优化它,因为目前它在线程中,但有些错误...挂钩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的参数是在栈上传递后勾倾倒你的目标函数。你做的第一件事是改变堆栈。这不好。您的代码需要保存cpu寄存器*和*不会损坏堆栈。这是不重要的,最好不要自己写这个代码。已经完成了,你已经用[绕道]标记了这个问题,所以你已经知道了一个好的解决方案。期待另一个没什么意义。 –

+0

@HansPassant:尽管我完全同意没有理由编写自己的代码来执行此操作,但由于相同的PUSH操作与POP操作相匹配,所以堆栈正在被上面的消息提供的参数不适用 - 至少不适用于原始功能的调用。更有可能的是,“我的行为在这里”被破坏了(或者“原始”可能不包含正确的地址)。 –

+1

[当然假设这是为32位代码编译的 - 但我认为内联汇编程序在64位模式下不受支持,而内联汇编程序应该知道PUSHFD和POPFD,PUSHAD和POPAD不适用于X86-64。 –

回答

1

“//我的行动在这里”会很有趣,也许你正在破坏堆栈。 或者可能错误在您的DetourFunction中。 你的程序如何失败?也许与访问冲突?

你也不必使用裸体功能。你可以挂钩一个与你的目标具有完全相同签名的函数。 没有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); 
} 

如果doesn't工作,检查GetProcAddress的返回值,如果that's纠正,一些在你的DetourFunction可能会错误。

你也可以使用像beaengine反汇编和迂回,看是否被正确地使用