0

DLLからエクスポートされた関数のシグネチャを見つけて、フック用にまったく同じコールバック関数を定義しようとしています。

それは私が取り組んでいる現在のプロジェクトの必要性です。

以下は、関数の場所を見つけるために私が行ったことです。

HMODULE hModd = LoadLibraryEx("xxx.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);

dosHeader = ((PIMAGE_DOS_HEADER)hModd);
    /*if(((PIMAGE_DOS_HEADER)hModd)->e_magic == IMAGE_DOS_SIGNATURE)
        MessageBoxA(NULL,"wow","exe",MB_OK);/**/
    ntHeader = (PIMAGE_NT_HEADERS)((PBYTE)hModd + ((PIMAGE_DOS_HEADER)hModd)->e_lfanew);
    PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE *)hModd + ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    PVOID names = (BYTE *)hModd + exports->AddressOfNames;
    WORD *pOrds = (WORD*)((BYTE*)hModd + exports->AddressOfNameOrdinals);
    DWORD* addr = (DWORD*)((BYTE*)hModd + exports->AddressOfFunctions); 
    for (int i = 0; i < exports->NumberOfNames; ++i,addr++)
        {
            char funcName[255];
            char const *target = "Test";
            ZeroMemory(funcName,sizeof(funcName));
            //strcpy(funcName,(char*)((BYTE *)hModd + ((DWORD *)names)[i]));
            if(strcmp((char*)((BYTE *)hModd + ((DWORD *)names)[i]),target))
            {
                printf("Export: %s Address: %X \n", (char*)((BYTE *)hModd + ((DWORD *)names)[i]),*addr);
                offsetTarget = *addr;
            }
        }

__funcsig__マクロを使用してDLL関数の署名を取得するにはどうすればよいですか?

__funcsig__通常、それを囲む関数のシグネチャを返します。

4

1 に答える 1

1

これには使用できません__FUNCSIG__。あなたが言ったように、それは囲んでいる関数のシグネチャを生成します。

任意のモジュールによってエクスポートされた任意の関数のシグネチャを取得する方法はありません。情報は単に存在しません。関数のタイプを説明する何らかの形式の追加メタデータが必要になります。

于 2012-08-16T05:40:58.830 に答える