Условная точка останова, которая проверяет несколько переменных стека
-
09-09-2020 - |
Вопрос
Я отлаживаю приложение на этапе, когда оно использует диалоговое окно для получения некоторой информации от пользователя, а затем выполняет некоторую обработку этой информации.Установив точку останова в USER32!CreateDialogParamW, я нашел адрес его диалоговой процедуры.
Сначала я просто хотел прервать работу, когда процедура получит сообщение WM_COMMAND, поэтому я использовал следующую команду:bp 00cfa1c0 "j (dwo(esp+8) == 0x111)";"gc""
К сожалению, этого недостаточно, поскольку диалоговая процедура по какой-то причине получает сообщения WM_COMMAND даже при нажатии ALT-TABbing между WinDbg и приложением.Итак, теперь я хочу, чтобы он прерывался, когда он получает WM_COMMAND с кодом уведомления BN_CLICKED от кнопки OK в диалоговом окне.Идентификатор элемента управления кнопки в шаблоне диалогового окна равен 1, а BN_CLICKED определяется как 0 в winuser.h.Это означает, что аргумент WPARAM диалоговой процедуры должен быть равен 1 при нажатии кнопки OK.
Я попробовал следующую команду:bp 00cfa1c0 "j (dwo(esp+8) == 0x111 && dwo(esp+ 12) == 0x1)";"гк"".Изначально это принимается, но при оценке точки останова она выдает ошибку:Числовое выражение отсутствует в '& dwo(esp+12) == 0x1) ";"гк"
Окружение 2 выражений с помощью () 's не помогло.Я просмотрел файл справки, но, честно говоря, это смущает меня еще больше.Я довольно новичок в WinDbg, и английский не является моим родным языком.Кто-нибудь может указать мне правильное направление?
Заранее благодарю.
PS:Это 32-разрядное приложение, для которого у меня нет исходного кода.
Решение
Используйте один &
- синтаксисом по умолчанию для выражений является MASM. &&
является частью синтаксиса C ++.
Следующие выражения будут работать для вас:
(dwo(@esp+8) == 0x111 & dwo(@esp+12) == 0x1)
или
@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)