目录第一步生成exe循环文件第二步打开 x32dbg第三步找到你的 main 函数第四步找到你的 for 循环第五步设置条件断点第六步运行程序观察条件断点第一步生成exe循环文件首先是理由vs去运行出一个exe格式的32位文件#include stdio.h int main() { int sum 0; for (int i 0; i 10; i) { sum i; printf(i %d, sum %d\n, i, sum); } printf(Final sum %d\n, sum); return 0; }配置管理器设置如下然后CtrlShiftB生成exe文件第二步打开 x32dbg在你的电脑上找到x32dbg.exe32 位版本的 x64dbg双击打开它。打开后你会看到一个灰色的窗口里面有反汇编窗口、寄存器窗口、堆栈窗口等。找到你刚才生成的exe文件在 VS 项目的Debug文件夹里。用鼠标左键点住exe直接把它拖进 x32dbg 的窗口里然后松开鼠标。拖进去之后x32dbg 会加载这个程序并自动停在一个地方。你看到的应该是类似这样的画面ntdll.dll 里的某个位置比如 jmp xxxxxxxx这不是你的代码是 Windows 的系统代码。这完全正常在之前的文章已经提到过。第三步找到你的 main 函数按键盘上的Ctrl键和G键同时按下。会弹出一个输入框在框里输入_main注意前面有个下划线因为 VS 编译 32 位程序会自动加这个下划线。按回车。反汇编窗口会跳到_main函数的位置。你应该能看到类似这样的几行指令push ebp mov ebp, esp sub esp, 0xC0这就是你写的 main 函数。然后点击f2进行断点设置f9让程序之间运行到main函数入口处第四步找到你的 for 循环用鼠标滚轮慢慢往下翻大概翻十几行。注意看反汇编窗口找一条往回跳的指令看起来像这样jmp 0x00401050后面那个地址0x00401050比当前行地址小说明它往上跳了。这个jmp以及它上面的那一段代码就是你的for循环。什么叫“往回跳”如果地址从0x00401080跳到0x00401050这就是往回跳。循环的本质是“执行一段代码然后跳回开头”。所以一定会有一个往回跳的指令。找到这个jmp后往上几行找到循环体开始的位置。通常它会从内存里取变量i的值mov eax, dword ptr [ebp-14]记下这一行的地址比如0x00401050等会要用。(在x32中旁边有箭头可以辅助定位)好的。找到了循环开始的位置接下来我们要做最关键的一步让程序在循环到第 5 次时自动停下来。第五步设置条件断点用鼠标点击循环开始的那一行比如mov eax, dword ptr [ebp-0Ch]把光标放在这一行上。按一下F2这一行会变成红色。这是一个普通断点。按键盘上的ShiftF2在输入框里输入条件[ebp-14] 5解释[ebp-14]这是变量i在内存中的位置之前我们用 IDA 看到的偏移是ebp-0C两个写法是一个意思。 5当i等于 5 时条件成立。注意如果你在 IDA 里看到i的偏移是ebp-8或其他值就换成你看到的那个偏移。点击OK确定。设置好后这一行仍然是红色但它现在带着一个条件——只有当i 5时才会中断。第六步运行程序观察条件断点按一下键盘上的F9运行程序。观察控制台窗口那个黑色的命令行窗口不是 x32dbg 的窗口。你会看到i 0, sum 0 i 1, sum 1 i 2, sum 3 i 3, sum 6 i 4, sum 10 i 5sum15然后控制台停止打印了程序卡住了。回到 x32dbg 窗口你会发现程序停在红色断点那一行。此时看右侧寄存器窗口找到EAX它的值应该是5因为刚把i的值加载到eax。看右下角堆栈窗口找到地址EBP-0C那一行它的值也变成了5。发生了什么程序在i 0到i 4时条件[ebp-0Ch] 5不成立所以没有中断。当i变成5时条件成立了CPU 自动把程序停住了。你不需要手动按 5 次F8条件断点帮你自动停在了第 6 次循环。现在按F9程序会继续打印剩下的输出并结束。注意此时的栈在结束一次循环之前会把i的值push到栈里面实验结束