一、编辑CPP文件并生成磁盘PE文件
1. 编辑CPP文件

2. 生成 → 清理解决方案 → 重新生成解决方案 → 生成磁盘PE文件


二、使用x64dbg打开磁盘PE文件



三、进入main函数代码块的反汇编指令集合
1. 方法一
点击F9,定位到main函数入口,选择上面的jmp <test_code.main> 。定位可见main函数地址和内部信息。双击,跳转到main函数代码块的反汇编指令集合。

2. 方法二
点击[符号] → 选择磁盘PE文件:test_code.exe → 右下角搜索:main → 双击符号[main] → 跳转到main函数代码块的反汇编指令集合

四、运行到选区:F4
正确进入main函数后,执行 [运行到选区:F4] , 可以调试对应某一条代码的指令。操作如下:
|--------------------------------------------------------------------------------------------------------|
| 1. 选中要想运行的代码的下一条代码对应的指令 2. 按F4,运行目标指令,定位到选中的指令 3. 终端执行了选中指令前面的所有指令,并显示运行结果 4. 如果选中已调试指令的前面指令,按F4,会结束调试 |
1. 选中要想运行的代码的下一条代码对应的指令
我想要调试第15行的代码:cout << "FuncB() = "<< FuncB(a,b) << endl; 那么我在x64dbg选中注释为:test2.cpp:16的指令。对应的就是第16行代码。

2. 按F4,运行目标指令并定位到选中的下一行指令
此时test2.cpp:16行代码对应的指令VA被标注成黑色,说明已经执行完该指令前面的所有指令,定位到此处

3. 终端执行了选中指令前面的所有指令,并显示运行结果
终端显示第15行代码的执行结果:

4. 如果选中已调试指令的前面指令,按F4,会结束调试


五、[断点:F2] 与 [运行:F9]
|--------------------------------------------------------------------------------------------------------------------------------|
| 1. 对某一指令设置了断点,按[运行:F9],会越过其余指令,直接执行到该断点指令。 2. 若下面已经没有断点指令,再次按[运行:F9],会结束程序。 3. 若下面还有断点指令,再次按[运行:F9],会越过其余指令,直接执行下面的断点指令。 |
1. 对某一指令设置了断点,按[运行:F9] , 会越过其余指令,直接执行到该断点指令
(1) 点击 [断点] 选项,看见反汇编指令:jmp <test_code.mainCRTStartup> 设置了一次性断点,意味着在[CPU]选项中,点击一次F9,就越过其余指令,直接执行到该断点指令:jmp <test_code.mainCRTStartup>


2. 若下面已经没有断点指令,再次按[运行:F9],会结束程序
从[断点]选项中可知,断点指令:jmp <test_code.mainCRTStartup>下面已经无可运行的断点,所以在[CPU]选项中点击第二次F9,会结束程序

3. 若下面还有断点指令,再次按[运行:F9],会越过其余指令,直接执行下面的断点指令
(1) 点击重新运行
(2) 点击[符号] → 选择磁盘PE文件:test_code.exe → 右下角搜索:main → 点击F2设置断点,标注为红色

(3) 点击 [断点] 选项 ,发现多了一个 <test_code.exe.main>的断点,它的反汇编指令处于上一个断点指令:jmp <test_code.mainCRTStartup>的下面

(4) 点击 [CPU] 选项,第一次点击F9,跳转到第一个断点指令:jmp <test_code.mainCRTStartup>

(5) 第二次点击F9,跳转到符号标注为:<test_code.main>的第二个断点指令:push rbp;此处正是main函数反汇编指令集合的入口处。

六、运行到用户代码 (Alt+F9)
如果你仅仅想调试代码部分的反汇编指令,操作如下:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1. 文件→打开Test_Code.exe 2. [符号]选项→点击左边的Test_Code.exe→右下角搜索:main→双击进入main函数 3. 菜单:调试→运行到用户代码 (Alt+F9),此操作仅运行代码相关的指令,跳过无关代码的指令 4. 每次Alt+F9,你会发现终端出现执行代码指令后的结果。 |
1. 文件→打开Test_Code.exe



2. 点击[符号] → 选择磁盘PE文件:test_code.exe → 右下角搜索:main → 双击符号[main] → 跳转到main函数代码块的反汇编指令集合

3. 菜单:调试→运行到用户代码 (Alt+F9),此操作仅运行代码相关的指令,跳过无关代码的指令


4. Alt+F9步行到相应代码的指令,你会发现终端出现执行代码指令后的结果

七、通过调用函数时的 [跳板地址] 跳转到函数入口处的 [起始地址]
- 打开Test_Code.exe

- F9,定位到main函数入口,选择上面的jmp <test_code.main> 。定位可见main函数地址和内部信息。双击 ,跳转到main函数内部

- 找到call test_code.[地址],鼠标定位,看看里面是否有jmp 到FuncA或者FuncB的。若有,则说明该地址是[跳板地址]。
以FuncA为例,有:

- 双击进去,就是跳板地址:0000000140011078

- 再次双击,跳转到FuncA入口处,此时00000001400122A0就是FuncA的起始VA。FuncA(int)作为符号进行标注

- 右键 → 复制 → 地址,可得到FuncA函数的起始VA

- 如果你想直接获取FuncA的VA,点击菜单栏的[符号],左边定位到test_code.exe,右下角搜索:FuncA。选中匹配信息,右键→复制→地址。
