Detours 3.0 hook GetProcAddresss()

时间:2013-06-02 12:38:37

标签: c++ hook detours

我正在使用:

MS VS 10

绕行v3.0 Express

完整的源代码 DLL

#include <windows.h>
#include <detours.h>
ofstream prclist ;
#pragma comment(lib,"detours.lib")
FARPROC (WINAPI * pGetProcAddress)(HMODULE hModule,LPCSTR lpProcName) = GetProcAddress;
FARPROC WINAPI  myGetProcAddress(HMODULE hModule,LPCSTR lpProcName);
FARPROC WINAPI  myGetProcAddress(HMODULE hModule,LPCSTR lpProcName)
{
    prclist << lpProcName << endl; // <- ACCESS_VIOLATION READ
    return pGetProcAddress( hModule, lpProcName);
}

BOOL APIENTRY DllMain(HINSTANCE hDLL, DWORD reason, LPVOID reserved)
{

switch(reason)
    {
        case DLL_PROCESS_ATTACH:
        {
            prclist.open("proclst.log",ios::out | ios::app );
            DisableThreadLibraryCalls(hDLL);
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)pGetProcAddress, myGetProcAddress);
            DetourTransactionCommit();
            break;
        }
        case DLL_PROCESS_DETACH:
        {
            prclist.close();
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourDetach(&(PVOID&)pGetProcAddress, myGetProcAddress);
            DetourTransactionCommit();
            break;
        }
   }
        return TRUE;
}

我尝试查看GetProcAddress接收的函数列表。但是在开始之后,该程序将关闭并显示错误:“ ACCESS_VIOLATION UNABLE_TO_READ

有人可以提示如何修复它吗?

2 个答案:

答案 0 :(得分:2)

来自GetProcAddress()参考页,lpProcName

  

函数或变量名称,或函数的序数值。如果此参数是序数值,则它必须在低位字中;高阶词必须为零。

这意味着可能不是指向字符串的指针,但替换函数总是将其处理。这可能是访问冲突的原因,因为它将使用整数值(例如182)作为空终止字符串的起始内存地址。

使用HIWORD()更正:

if (HIWORD(lpProcName))
{
    prclist << "name: " << lpProcName << std::endl;
}
else
{
    prclist << "ordinal: " << reinterpret_cast<DWORD>(lpProcName) << std::endl;
}

答案 1 :(得分:0)

查看我的评论。看起来只需要在插入运算符(&lt;&lt;)之前对其进