【问题标题】:Get function name by address通过地址获取函数名
【发布时间】:2015-02-17 05:57:39
【问题描述】:

通过这段代码,我可以通过函数名获取函数的地址:

DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandleA("user32.dll"), "MessageBoxA");

但是可以做相反的过程吗?从函数地址找到函数名?

假设MessageBoxA 地址是0x1234abcd。我想要的是这样的:

char *func_name = this_is_what_i_want(0x1234abcd);
printf("%s", func_name); // this will print "MessageBoxA"

操作系统:Windows

【问题讨论】:

  • 也许this 的帖子可以提供帮助。

标签: c windows winapi dll


【解决方案1】:

使用SymFromAddr ,它采用SYMBOL_INFO 结构。该结构将包含Name 成员中的名称。

为 SYMBOL_INFO 分配内存很棘手,请务必阅读文档。

如何分配SYMBOL_INFO:

const size_t array_size = 256 ;
const size_t size = sizeof( SYMBOL_INFO ) + ( array_size-1 )*sizeof( TCHAR ) ;
SYMBOL_INFO* symbol = calloc( 1 , size ) ;
if( !symbol )
{
    //deal with it
}
symbol->SizeOfStruct = sizeof( *symbol ) ;  //both values must
symbol->MaxNameLen = array_size ;           //be set by user

请注意,我们在这里减去了 1:( array_size-1 ),因为结构已经给了我们一个字节,我们希望我们的字符串数组的大小为 256 而不是 257。

结构现在有足够的空间容纳长度为 255 的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2020-06-10
    相关资源
    最近更新 更多