调试软件使用速查手册
虽然古话云“工欲善其事必先利其器”,但无论是 x64dbg 还是 IDA,他们都仅仅只是一个工具,还需要结合强大的内功,才能使其发挥更大的威力。
本文记录的快捷键、指令等内容可能适合我,但不适合你。
IDA Pro 快捷键
下面列举的快捷键很多不是必须的,在 UI 界面上通过鼠标点击、右键菜单等,可以实现同样的效果。
| 功能 | 快捷键 |
|---|---|
| 切换到流程图 | Space |
| 切换到伪代码视图 | Tab |
| 切换到字符串视图 | Shift + F12 |
| 跳转到操作数 | Enter |
| 跳转到操作数(新窗口) | Alt + Enter |
| 跳转到上一个位置 | Esc |
| 跳转到下一个位置 | Ctrl + Enter |
| 跳转到地址 | G |
| 跳转到名称 | Ctrl + L |
| 跳转到入口点 | Ctrl + E |
| 查找操作数的交叉引用 | X |
| 标记位置 | Alt + M |
| 跳转到标记 | Ctrl + M |
| 搜索字符串 | Ctrl + F |
| 添加注释 | :或; |
| 重命名位置标签 | N |
| 计算器 | ? |
x64dbg快捷键
下面列举的快捷键很多不是必须的,在 UI 界面上通过鼠标点击、右键菜单等,可以实现同样的效果。
| 功能 | 快捷键 |
|---|---|
| 打开文件 | F3 |
| 附加进程 | Alt + A |
| 重新运行 | Ctrl + F2 |
| 跳转到上一个位置 | - |
| 跳转到下一个位置 | + |
| 添加断点 | F2 |
| 启用/禁用断点(断点视图) | Space |
| 继续运行 | F9 |
| 单步步过 | F8 |
| 单步步进 | F7 |
| 暂停运行 | F12 |
| 结束运行 | Alt + F2 |
| 运行到函数返回 | Ctrl + F9 |
| 运行到用户代码 | Alt + F9 |
| 搜索汇编指令(当前区域) | Ctrl + F |
| 搜索机器码(当前区域) | Ctrl + B |
| 搜索字符串(当前模块) | Shift + D |
| 搜索对当前地址的引用 | Ctrl + R |
| 修改汇编指令 | Space |
| 复制机器码 | Shift + C |
| 粘贴机器码 | Shift + V |
| 恢复对选区的操作 | Ctrl + BackSpace |
| 添加注释 | ; |
| 切换到流程图 | G |
| CPU 视图 | Alt + C |
| 断点视图 | Alt + B |
| 内存布局视图 | Alt + M |
| 调用堆栈视图 | Alt + K |
| 模块视图 | Alt + E |
| 线程视图 | Alt + T |
| 计算器 | ? |
Visual Studio断点语法
Visual Studio 的断点系统远不止”在代码行上点击左侧边栏”那么简单。掌握其高级功能可以彻底改变你的调试体验,让你能精准定位问题,而不是在无尽的代码执行中盲目搜索。本文将带你全面了解 Visual Studio 断点系统的各项高级功能。
条件断点
条件断点允许你设置特定条件,只有满足这些条件时调试器才会暂停。支持如下格式的表达式:
1 | // 基本条件 |
支持的内置函数如下:
- strlen(str):获取字符串长度
- strcmp(str1, str2):比较两个字符串
- strncmp(str1, str2, n):比较前n个字符
- strstr(haystack, needle):查找子字符串
- GetLastError():获取系统错误代码
断点筛选器
当调试多线程或分布式应用时,筛选器能确保断点只在特定环境中触发。支持如下筛选字段:
- MachineName
- ProcessId
- ProcessName
- ThreadId
- ThreadName
1 | ThreadId = 1234 |
<原文出自: jiangxueqiao.com,请尊重原创>
筛选器的逻辑运算与条件断点有些不一样,逻辑等号使用=,逻辑与使用&,逻辑或使用||,逻辑非使用!,没有不等号。
示例:
1 | MachineName = "MyPC" |
跟踪器
跟踪器用于在触发时输出相关调试信息。在“断点”中选择“操作”,输入跟踪指令即可。通常,为了不影响程序执行流,建议同时勾选 “继续执行”,这样程序运行到此处时就不会中断,而是直接输出信息后继续运行。支持如下格式的指令:
- 直接输入字符串,例如 “循环到了这里”。
- 使用变量名,用大括号 {} 括起来,例如 “当前 i 的值为: {i}”。输出时,{i}会被替换为变量 i的实际值。
- 使用一些预定义的关键字(以 $开头),例如:
1
2
3
4
5$ADDRESS 当前指令地址
$CALLER 调用当前函数的函数名称
$FUNCTION 当前函数名称
$TID 当前线程 ID
$PID 当前进程 ID