可视 C/C++ — 使用 __funcsig__ 宏获取函数签名

visual C/C++ — use the __funcsig__ macro to get a function signature?

本文关键字:获取 函数 funcsig 可视 C++ 使用      更新时间:2023-10-16

我正在尝试查找从 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__通常返回包含它的函数的签名。

您不能为此使用 __FUNCSIG__:正如您所说,它会产生封闭函数的签名。

无法获取任意模块导出的任意函数的签名。 这些信息根本不存在:您需要某种形式的附加元数据来描述函数的类型。