Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Получение описания адреса с помощью DebugAPI


Автор: 586 10.12.2006, 04:31
Дан адрес (к примеру) 0x7c901230. Нужно получить описание этого адреса, как в отладчике NTSD (WinDbg), т.е.
7c901230 == ntdll!DbgBreakPoint
7c901231 == ntdll!DbgBreakPoint+1
и т.д.

Вот написал функцию, но она выдает только название функции (а имя модуля не выдаёт):
Код
char* GetAdressInfo(char *_c, int cb, DWORD address)
{
  DWORD64 ds;
  DWORD64 offs=address;
  char *_b=new char[sizeof(SYMBOL_INFO)+cb];
  SYMBOL_INFO *syminf=(SYMBOL_INFO*)_b;
  syminf->SizeOfStruct= sizeof(SYMBOL_INFO)+cb;
  syminf->MaxNameLen= cb;
  
  if(SymFromAddr(pi.hProcess, offs, &ds, syminf))
   sprintf(_c, "%s (%.8X)", syminf->Name, address);
  else sprintf(_c, "(%.8X)", address);
  delete _b;
  return _c;
}
Может какие нибудь настройки есть?
Помогите решить проблему.

Автор: W4FhLF 10.12.2006, 10:25
Самый простой способ это перечислить все модули процесса с помощью CreateToolhelp32Snapshot(флаг TH32CS_SNAPMODULE), где функции Module32First и Module32Next возвращают структуру:

Код

typedef struct tagMODULEENTRY32 {  DWORD dwSize;  
 DWORD th32ModuleID;  
 DWORD th32ProcessID;  
 DWORD GlblcntUsage;  
 DWORD ProccntUsage;  
 BYTE* modBaseAddr;  
 DWORD modBaseSize;  
 HMODULE hModule;  
 TCHAR szModule[MAX_MODULE_NAME32 + 1];  
 TCHAR szExePath[MAX_PATH];
} MODULEENTRY32, *PMODULEENTRY32;


Так вот если твой адрес >= modBaseAddr && <= modBaseAddr+modBaseSize then szModule тебе в помощь.

Второй вариант(так делают системные функции) это выровнять твой адрес на нижнюю границу по значению 10000h(базы всех модулей в памяти находятся по адресам кратным этому значению), можешь поспользоваться этой функцией для выравнивания:

Код

;########################################
;Процедура GetAlignDown
;Получение выровненного-вниз значения
;Вход:  esi - значение для выравнивания (в твоём случае 7c901230)
;    edi - выравнивающий фактор (10000h)
;Выход:eax - выровненное значение
;########################################
GetAlignDown proc
    push esi
    push edi

    dec edi
    not edi
    and esi,edi
    mov eax,esi

    pop edi
    pop esi
    ret        
GetAlignDown endp
;########################################
;Конец процедуры GetAlignDown
;########################################    


Выравнил, теперь в цикле, отнимая каждый раз от выровненного адреса 10000h, проверяй не попал ли ты на начало какого-либо модуля(можешь по сигнатуре MZ, ибо если это начало какого-либо модуля, т.е. его hModule, то первыми двумя байтами там будет 'MZ' или 0x4D5A), если попал, то дальше вызывай с полученной базой функцию GetModuleBaseName и радуйся.

Автор: 586 10.12.2006, 16:17
Меня только беспокоит то, что всю эту работу должна выполнять отладочная библиотека, и что она сделает это намного быстрее. 
ntdll!DbgBreakPoint
ntdll!DbgBreakPoint+1
Как это смещение получить?

Автор: W4FhLF 10.12.2006, 16:28
Цитата

Меня только беспокоит то, что всю эту работу должна выполнять отладочная библиотека, и что она сделает это намного быстрее. 


Какая такая библиотека? В прицнипе твои действия итак в минимуму сведены, выровнять значение и максимум сделать пару иттераций в цикле после чего вызвав ещё одну API, тут минимальные затраты в скорости.

Цитата

ntdll!DbgBreakPoint
ntdll!DbgBreakPoint+1


offset = 0x7c901231 - GetProcessAddress(GetModuleHandle("ntdll.dll"), "DbgBreakPoint");

Автор: 586 10.12.2006, 16:50
Цитата(W4FhLF @  10.12.2006,  16:28 Найти цитируемый пост)
Какая такая библиотека

dbghelp

Цитата(W4FhLF @  10.12.2006,  16:28 Найти цитируемый пост)
offset = 0x7c901231 - GetProcessAddress(GetModuleHandle("ntdll.dll"), "DbgBreakPoint"); 

А как насчёт такого:
74e3b866   riched20!CTxtEdit::TxSendMessage

Автор: W4FhLF 10.12.2006, 17:19
Цитата

А как насчёт такого:
74e3b866   riched20!CTxtEdit::TxSendMessage


Почему бы тебе не посмотреть экспорт dbghelp или его заголовочный файл, там нек так много функций, может найдёшь для себя что-либо полезное. Вообще подобная инфа очень похожа на отладочную информацию, которая берётся из оталдочной директории отладчиком и обрабатывается соответствующим образом.

Автор: 586 10.12.2006, 17:29
Цитата(W4FhLF @  10.12.2006,  17:19 Найти цитируемый пост)
Почему бы тебе не посмотреть экспорт dbghelp или его заголовочный файл, там нек так много функций, может найдёшь для себя что-либо полезное. Вообще подобная инфа очень похожа на отладочную информацию, которая берётся из оталдочной директории отладчиком и обрабатывается соответствующим образом

Об этом и идт речь. Описание этих функция и MSDN'е есть. Только какие функции использовать - вопрос.

Автор: W4FhLF 10.12.2006, 17:52
http://forum.web-hack.ru/index.php?showtopic=49187

Автор: 586 11.12.2006, 03:17
разобрался. спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)