调试软件使用速查手册

虽然古话云“工欲善其事必先利其器”,但无论是 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
2
3
4
5
6
7
8
9
10
// 基本条件
i > 100
name == "admin"

// 复合条件
x > 50 && y < 20 && isValid == true

// 字符串操作(C++)
strcmp(filename, "config.xml") == 0
strlen(buffer) > 255

支持的内置函数如下:

  • strlen(str):获取字符串长度
  • strcmp(str1, str2):比较两个字符串
  • strncmp(str1, str2, n):比较前n个字符
  • strstr(haystack, needle):查找子字符串
  • GetLastError():获取系统错误代码

断点筛选器

当调试多线程或分布式应用时,筛选器能确保断点只在特定环境中触发。支持如下筛选字段:

  • MachineName
  • ProcessId
  • ProcessName
  • ThreadId
  • ThreadName
1
2
3
4
ThreadId = 1234
ProcessName = "MyApp.exe"
MachineName = "Development-PC"
ThreadName = "WorkerThread"

<原文出自: jiangxueqiao.com,请尊重原创>
筛选器的逻辑运算与条件断点有些不一样,逻辑等号使用=,逻辑与使用&,逻辑或使用||,逻辑非使用!,没有不等号。

示例:

1
2
3
4
5
MachineName = "MyPC"
ProcessId = 1234
ThreadId = 1234 & MachineName = "DevPC"
ThreadId = 1234 || ProcessId = 4
!ThreadId = 5678

跟踪器

跟踪器用于在触发时输出相关调试信息。在“断点”中选择“操作”,输入跟踪指令即可。通常,为了不影响程序执行流,建议同时勾选 ​​“继续执行”​,这样程序运行到此处时就不会中断,而是直接输出信息后继续运行。支持如下格式的指令:

  • 直接输入字符串,例如 “循环到了这里”。
  • 使用变量名,用大括号 {} 括起来,例如 “当前 i 的值为: {i}”。输出时,{i}会被替换为变量 i的实际值。
  • 使用一些预定义的关键字​(以 $开头),例如:
    1
    2
    3
    4
    5
    $ADDRESS 当前指令地址
    $CALLER 调用当前函数的函数名称
    $FUNCTION 当前函数名称
    $TID 当前线程 ID
    $PID 当前进程 ID