Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Точка останова (бряк) в WinDbg

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В SoftIce можно поставить такой бряк:
bpx SendMessageA if (*(esp+4)==дескриптор)&&(*(esp+8)==WM_GTTEXT).
 
Как это сделать в WinDbg?
Попробовал два варианта (приведены ниже), но они работают не так, как надо.
bp SendMessageA "j (r esp+0x4)=0x7031e & (r esp+0x8)=WM_GETTEXT 'bp SendMessageA;'gc'"
bp SendMessageA "j (r esp+0x4)=0x7031e & (r esp+0x8)=WM_GETTEXT '~.f';'gc'"

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 16:55 31-05-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix, что значит работают не так как надо? Символы сконфигурированы, а из какого модуля идентификатор sendmessagea, что в окне вывода после выполнения команды? Под рукой windbg нет, но, на сколько я помню, так бряк вообще не должен поставиться...

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 20:42 31-05-2015 | Исправлено: NeoAnomaly, 20:42 31-05-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WinDbg работает из-под IDA (т.е. подключается только движок WinDbg). Точка останова срабатывает, но не в том месте в котором должна сработать. Логи IDA по этому поводу отмалчиваются. В поля формы при срабатывании точки останова ничего нельзя ввести. Никакие кнопки нажать нельзя. И это при нстарте отладки програмы, когда поля формы пустые. Такое впечатление, что перехватываются все подряд вызовы SendMessage. А нужен только один определённый.  
 
Согласно Windows SDK прототип SendMessage такой:
 
LRESULT SendMessage( HWND hWnd,  UINT Msg, WPARAM wParam, LPARAM lParam);
 
Идея в том, что бряк должен сработать при определённом дескрипторе (первый параметр прототипа)
 и определённом оконном сообщении (второй параметр прототипа). Нужна условная точка останова. Поэтому выражение "j (r esp+0x4)=0x7031e & (r esp+0x8)=WM_GETTEXT '~.f';'gc'" является условием останова, которое проверяет состояние стека.
 
Как правильно поставить бряк?
 
 
 
 

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 22:18 31-05-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix, не знаю, как там IDA взаимодействует с WinDbg, но в WinDbg я бы сделал:

  • Явное указание модуля для функции, чтобы неоднозначностей не допускать.
  • (r esp+0x4) - даст адрес, надо что-то вроде: *(HWND*)(@esp+0x4) = <значение идентификатора>
  • WM_GETTEXT заменил бы на константу.
  • Меня смущает команда ~.f.
  • &/&& - разные вещи.

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 22:55 31-05-2015 | Исправлено: NeoAnomaly, 23:15 31-05-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly, цитата справки по WinDbg:
 
Команда r выводит или изменяет регистры, регистры с плавающей запятой, флаги, псевдорегистры и псевдонимы.
 
Поэтому выражение (r esp+0x4) должно дать содержание стека. А команды HWND в WinDbg нет.
 
 
Константы для WM_GETTEXT в  Windows SDK я не нашел.
 
Команда ~.f замораживает текущий поток (насколько я понял из хелпа WinDbg). Если вместо поставить команду bp SendMessageA то поведение не изменяется.
 
 
 
Добавлено:
&/&& - побитовое и логическое AND соответственно. Первое работает медленнее, а второе быстрее. Вобщем в итоге - приводит к одному и тому же.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 23:31 31-05-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Только сейчас заметил: =/== так же разные вещи
 

Цитата:
Команда r выводит или изменяет регистры, регистры с плавающей запятой, флаги, псевдорегистры и псевдонимы.  

StillPhelix регистр esp содержит указатель на вершину стека.
 

Цитата:
А команды HWND в WinDbg нет.

здесь HWND не команда, а приведение типа, HWND - platform specific, если приложение x86, тогда можно приводить к типу int.
 

Цитата:
Константы для WM_GETTEXT в  Windows SDK я не нашел.


Код:
#define WM_GETTEXT                      0x000D

 

Цитата:
Команда ~.f замораживает текущий поток (насколько я понял из хелпа WinDbg)

Да, но зачем это надо? Кто потом размораживает поток? А в другом предложенном варианте(bp SendMessageA) что по твоему должно произойти?
 

Цитата:
&/&& - побитовое и логическое AND соответственно. Первое работает медленнее, а второе быстрее. Вобщем в итоге - приводит к одному и тому же.

Побитовые и логические операторы - разные вещи, я бы не сравнивал их только лишь, как: "Первое работает медленнее, а второе быстрее". В данном случае результат будет одинаковый, в других нет.
 

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 06:06 01-06-2015 | Исправлено: NeoAnomaly, 06:14 01-06-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Аргументы в API-функцию передаются через стек. В данном случае интерес представляет содержание ячеек стека esp+0x4 и esp+0x8. Т.к. в данном случае параметры в функцию будут передаваться с права на лево, то два крайних левых аргумента (дескриптор и оконное сообщение) функции SendMessage будут на вершине стека со смещением 4 и 8 байт соответственно. И когда содержание первой ячейки (4 байта) будет равно определённому дескриптору, а содержание второй ячейки (8 байт) оконному сообщению WM_GETTEXT, то при попаданию в API-функцию SendMessage , то должна сработать точка останова.
 
Вот последний вариант останова, до которого я додумался:
 
j (@esp+0x4)=0x7031e & (@esp+0x8)=WM_GETTEXT 'bp SendMessageA;'gc'.
 
IDA на это пишет, что не может преоброзовать имена WM_GETTEXT и bp SendMessageA.
 
Поэтому у меня два вопроса:
1) Как правильно поставить останов?
2) В какой документации (заголовочных файлах visual studio) можно посмотреть соответствие оконных сообщений (например WM_GETTEXT) их константам?
 
Добавлено:
На второй вопрос ответ нашел уже сам.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 11:34 01-06-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bu USER32!SendMessageA "j poi(@esp+4)=7031e & poi(@esp+8)=0d ''; 'gc' "

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 12:44 01-06-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, ne_viens, останов сработал. Этому форуму повезло, что на нём есть такой спец как ты. На всех остальных форумах, на которых я создавал такие же темы, никаких ответов я не получил (несчитая этого форума ещё на 4-х форумах каждую тему).
 
 
Добавлено:
Я имею ввиду все темы поднятые мной на этом форуме.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 13:19 01-06-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Точка останова (бряк) в WinDbg


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru