0

我正在使用:

多发性硬化症 VS 10

Detours v3.0 速成版

完整的源代码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

有人可以提示如何解决它?

4

2 回答 2

2

GetProcAddress()参考页,对于lpProcName

函数或变量名,或函数的序数值。如果该参数为序数值,则必须在低位字中;高位字必须为零。

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

用于HIWORD()纠正:

if (HIWORD(lpProcName))
{
    prclist << "name: " << lpProcName << std::endl;
}
else
{
    prclist << "ordinal: " << reinterpret_cast<DWORD>(lpProcName) << std::endl;
}
于 2013-06-02T15:44:50.677 回答
0

看我的评论。看起来流只需要在使用插入运算符(<<)之前测试它是否打开。

于 2013-06-02T15:29:29.080 回答