Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение описания адреса с помощью DebugAPI 
V
    Опции темы
586
Дата 10.12.2006, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Дан адрес (к примеру) 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;
}
Может какие нибудь настройки есть?
Помогите решить проблему.
PM   Вверх
W4FhLF
Дата 10.12.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Самый простой способ это перечислить все модули процесса с помощью 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 и радуйся.



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
586
Дата 10.12.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Меня только беспокоит то, что всю эту работу должна выполнять отладочная библиотека, и что она сделает это намного быстрее. 
ntdll!DbgBreakPoint
ntdll!DbgBreakPoint+1
Как это смещение получить?
PM   Вверх
W4FhLF
Дата 10.12.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата

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


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

Цитата

ntdll!DbgBreakPoint
ntdll!DbgBreakPoint+1


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


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
586
Дата 10.12.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



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

dbghelp

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

А как насчёт такого:
74e3b866   riched20!CTxtEdit::TxSendMessage
PM   Вверх
W4FhLF
Дата 10.12.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата

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


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


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
586
Дата 10.12.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



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

Об этом и идт речь. Описание этих функция и MSDN'е есть. Только какие функции использовать - вопрос.
PM   Вверх
W4FhLF
Дата 10.12.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



http://forum.web-hack.ru/index.php?showtopic=49187

Это сообщение отредактировал(а) W4FhLF - 10.12.2006, 17:55


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
586
Дата 11.12.2006, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



разобрался. спасибо.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0940 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.