按地址获取功能名称

时间:2014-12-18 12:33:34

标签: c windows winapi dll

使用此代码,我可以通过其名称获取函数的地址:

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

1 个答案:

答案 0 :(得分:3)

使用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的字符串。