2014-12-18 3 views
2

С помощью этого кода я могу получить адрес функции по его имени:Получить имя функции по адресу

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

Возможно, это [это] (http://stackoverflow.com/q/1128150/1810087) сообщение может помочь. – user1810087

ответ

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.

Смежные вопросы