可视 C/C++ — 使用 __funcsig__ 宏获取函数签名
visual C/C++ — use the __funcsig__ macro to get a function signature?
我正在尝试查找从 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__
:正如您所说,它会产生封闭函数的签名。
无法获取任意模块导出的任意函数的签名。 这些信息根本不存在:您需要某种形式的附加元数据来描述函数的类型。
相关文章:
- 具有默认值的引用获取函数
- 如何从"decltype()"获取函数参数的数量<funtion>?
- C++ 获取函数在常量引用中按值返回的结果
- 如何从参数中获取函数签名?
- 获取函数的地址?
- 如何从不同的类中获取函数来调用在 Main 中声明的对象?
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 如何使用 std::invoke_result_t 获取函数的返回类型
- 获取函数中基元类型的指针
- 如何从 lambda 表达式中获取函数指针?
- 如何从核密度估计中获取函数?
- 如何在函数内部使用 zmq(以非阻塞方式)在客户端请求时获取函数的状态?
- 具有获取函数的无限循环
- 使用 decltype(this) 获取函数引用
- 在编译时使用可变参数模板在 c++ 中使用参数类型检查获取函数的参数数
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 从C 中的PHP扩展中获取函数参数值
- 从返回绑定中获取函数失败
- 从 Rcpp c++ 函数获取 r 函数参数
- 获取函数调用方的地址?