必备工具
一 OllyDbg
基本功能快捷键:
F8 单步执行 遇见 call 语句时不进入 call
F7 单步执行 遇见 call 语句时进入 call
F2 设置断点 在一条指令上按下 F2 将设置为断点 , 再次按下将取消断点
F4 执行到当前光标选中的指令
F9 运行程序,直到遇到断点
Ctrl + G 查看任意位置的数据
二 SoftICE
初始化命令的含义:
Faults off 关闭错误提示。SoftICE 在加载进程时总是会发出一些错误警告
set font 2 设置 2 号字体。SoftICE 有 3 种字体, 默认情况为小号字 , 2 号字体为 中号
Lines 44 Lines 命令用于设置界面显示的行数 , 显示范围是 25 ~ 128 , 这里总共显示 44 行
data 3 打开 3 号窗口
Dd 按照 DWORD 显示数据
dex 3 ss:esp 在 3 号窗口中显示栈信息
data 0 设置 0 号窗口(命令输入窗口) 为当前窗口
wc 20 代码窗口占 20 行
Code on 显示机器代码
X 显示调用界面
基础调试命令:
[单步执行]
t 或 F8 step into , 单步执行 , 遇到 call 函数进入执行
p 或 F10 step over , 单步执行 , 遇到函数不跟入
p ret 或 F12 step out , 执行到当前函数结束
[执行到指定位置 go]
g [内存虚拟地址] 如不跟地址 , 将把控制权交还进程持续执行 ; 如跟地址 , 则执行到指定地址所在的指令后停下
[断点命令]
bl 列出当前所有断点(breakpoint list)
be [断点 ID | * ] 激活断点,其中, 断点 ID 可以是多个, 用空格或逗号隔开 , 如果用 * , 则激活所有断点(breakpoint enable)
bd [断点 ID | * ] 禁用断点 , 参数同上 (breakpoint disable)
bc [断点 ID | * ] 清除断点 , 参数同上 (breakpoint clear)
bpx [地址 | 函数名] 为指定的地址 或 API 函数下断点
bpm [数据类型][地址][访问类型] 内存断点 。 数据类型可以是 b 字节 , w 字(双字节) , d 双字(四字节) ; 访问类型可以是 r(只读) , w(写) , rw(读写)
信息查看与编辑命令:
[数据显示(Display)]
db [地址] 按照字节模式显示内存数据(display byte)
dw [地址] 按照字(双字节) 模式显示内存数据(display byte)
dd 按照双字(四字节) 模式显示内存数据(display byte)
ds 按短整型模式显示内存数据(display byte)
dl 按照长整型模式显示内存数据(display byte)
[数据编辑(Edit)]
eb [地址][数据] 按字节模式将数据写入内存任意地址 (edit byte)
ew [地址][数据] 按字模式将数据写入内存任意地址 (edit word)
ed [地址][数据] 按双字模式将数据写入内存任意地址 (edit dword)
es [地址][数据] 按照短整型模式将数据写入内存任意地址 (edit short)
el [地址][数据] 按照整型模式将数据写入内存任意地址 (edit long)
[栈侦显示]
stack 显示当前栈侦信息
[编辑寄存]
r [寄存器名][值] 修改或查看寄存器的值 , 如 r eax 0
[反汇编]
u [地址] 对指定地址的二进制进行反汇编并显示
三 WinDbg
调试功能的命令:
[单步调试]
t 或 F11 单步 , 遇到函数(call) 跟进(step into)
p 或 F10 单步 , 遇到函数(CALL) 跳过 (step over)
Shift + F11 跳出当前函数(step out)
[执行到指定位置(Go)]
g [地址 | 函数名] 持续执行到指定位置的指令
gh [地址 | 函数名] 持续执行时 , 如果遇到异常则中断
gn [地址 | 函数名] 持续执行时 , 即使遇到异常也忽略
[断点功能(Break Point)]
bl 列出已设置的断点 , 显示结果中 , 第一列为断点的 ID , 第二列为断点当前状态 , e 表 示断点处活动状态(enable) , d 表示断点暂时被禁用 , 第三列为断点的位置(breakpoint list)
be [断点ID] 激活断点 (breakpoint enable)
bd [断点ID] 禁用断点 (breakpoint disable)
bc [断点ID] 清除断点 (break point clear)
bp [地址|函数名] 设置断点 . 如不指定地址, 则在当前指令上下断点 . 注意这里介绍的是最基础的断点方式, WinDbg 中可以结合地址 , 函数名 , 消息等各种条件设置很复杂的断点 . 此外 bu , bm 等命令也可以设置断点
[反汇编功能]
u 反汇编当前指令后的几条指令
u [起始地址] 从指定的地址开始反汇编
u [始址] [终止] 反汇编指定地址区间的机器代码
信息显示与编辑功能:
[数据显示(Display)]
d [地址] 显示内存数据. 默认情况下按照字节和ASCII显示, 即等同于 DB 命令. 如果修改了显示模式,再次使用时则与最后一次数据显示命令所使用的显示模式相同
db [地址] 按照字节模式显示内存数据 (display byte)
dd [地址] 按照双字节模式显示内存数据 (display dword)
dD 按双精度浮点数的模式显示内存数据. 注意这条命令和前面一条命令是区别大小写的
da 按 ASCII 模式显示
du 按 Unicode 模式显示
ds 按字符串模式显示. 注意在没有 "\0" 作为字符串结束时 , 不要轻易用这条命令打印内存,否则 WinDbg 会将遇到的第一个 NULL 前的东西都打印出来
dt 套用已知的数据结构模板显示内存,这个命令很有用,列如,在调试堆时可以直接用这个命令把内存按照堆表的格式显示出来
[数据编辑(Edit)]
e [地址] [数据] 修改任意内存地址的值
Eb 以字节形式写入
ed [地址][数据] 以双字节的形式写入
ea [地址][数据] 以 ASCII 字符形式写入,注意 ASCII 字符串需要加双引号
eu [地址][数据] 以 Unicode 字符形式写入, 注意 Unicode 字符串需要加引号
[栈侦的显示]
k [x] 由栈顶开始列出当前线程中的栈侦 , x 为需要回朔的栈侦数
kb [x] 栈侦回朔命令带上 'b' 后 , 可以额外显示 3 个传递给函数的参数
[寄存器的显示]
r [寄存器名] r 命令显示当前所有寄存器值 , 也可以用来显示指定寄存器的值
[模块显示]
lm 列出当前已经读入的所有模块
[反汇编功能]
u 反汇编当前指令后的几条指令并显示
u [起始地址] 从指定的地址开始反汇编
u [始址][终址] 反汇编指定的地址范围区间的机器代码
四 IDA Pro
常用的快捷命令:
; 为当前指令添加全文交叉引用的注释
n 定义或修改名称 , 通常用来标注函数名
g 跳转到任意地方观察代码
Esc 返回到跳转的位置
D 分别按字节 , 字(双字节) , 双字(四字节) 的形式显示数据
A 按照 ASCII 形式显示数据