0

你知道为什么我在挂钩 kernel32 函数之一时无法运行程序吗?我正在写反作弊并希望对其进行更多优化,因为目前它在线程中,但是有问题...

有写 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 );
}
4

1 回答 1

1

“//我的操作”会很有趣,也许你正在破坏堆栈。或者错误可能在您的 DetourFunction 中。你的程序是怎么失败的?也许有访问冲突?

你也不必使用裸函数。您可以挂钩到与您的目标具有完全相同签名的函数。不需要汇编。

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 这样的反汇编程序,并在绕道后转储您的目标函数,以查看是否正确应用了钩子

于 2013-08-03T14:09:22.037 回答