测试多个堆栈变量的条件断点
-
09-09-2020 - |
题
我正在调试一个应用程序,它使用一个对话框从用户那里获取一些信息,然后对该信息进行一些处理。通过在 USER32!CreateDialogParamW 上设置断点,我找到了其对话框过程的地址。
起初我只是想在程序收到 WM_COMMAND 消息时中断,所以我使用了以下命令:bp 00cfa1c0 "j (dwo(esp+8) == 0x111) '';'GC'”
遗憾的是,这还不够,因为即使在 WinDbg 和应用程序之间进行 ALT-TAB 操作时,对话过程也会因某种原因接收 WM_COMMAND 消息。所以,现在我希望它在从对话框上的“确定”按钮接收到带有 BN_CLICKED 通知代码的 WM_COMMAND 时中断。对话框模板中按钮的控件ID为1,在winuser.h中BN_CLICKED定义为0。这意味着单击“确定”按钮时对话框过程的 WPARAM 参数应为 1。
我尝试了以下命令:bp 00cfa1c0 "j (dwo(esp+8) == 0x111 && dwo(esp+12) == 0x1) '';'GC'”。这最初被接受,但是当评估断点时,它会抱怨:'& dwo(esp+12) == 0x1) '' 中缺少数字表达式;'GC''
用 () 包围这 2 个表达式并没有帮助。我查看了帮助文件,但说实话,这让我更加困惑。我对 WinDbg 还很陌生,英语不是我的母语。有人能指出我正确的方向吗?
提前致谢。
附:这是一个 32 位应用程序,我没有源代码。
解决方案
使用单个 &
- 表达式的默认语法是 MASM。 &&
是 C++ 语法的一部分。
以下表达式适合您:
(dwo(@esp+8) == 0x111 & dwo(@esp+12) == 0x1)
或者
@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
不隶属于 StackOverflow