0

私は使用しています:

MS対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 "

誰かがそれを修正する方法を尋ねることができますか?

4

2 に答える 2

2

のGetProcAddress()リファレンス ページからlpProcName:

関数または変数の名前、または関数の序数値。このパラメーターが序数の値である場合は、下位ワードにある必要があります。上位ワードはゼロでなければなりません。

これは、文字列へのポインターではない可能性があることを意味しますが、置換関数は常にそのように扱います。182これは、null で終了する文字列の開始メモリ アドレスとして整数値 (たとえば) を使用するため、アクセス違反の原因となる可能性があります。

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 に答える