控制线程指令
~ 显示当前进程下所有线程
~线程号 n 增加线程的挂起计数
~线程号 m 减少线程的挂起计数
~线程号 F 冻结线程Frozen
~线程号 U 解冻线程UnFrozen
~线程号 g 只恢复指定线程
多进程调试
.attach 进程号 先建立1个回话,然后再附加第2个进程。 例如 .attach 0nX //(0nX十进制数的表示)
|<进程号> S 切换进程,|为查看当前进程
~<线程号> S 切换线程
堆栈命令堆栈命令都是K开头
k 使用K命令进行栈回溯
kL 和上面一样,只是省略了源代码段 L 一定要大写
kb L 还是回溯,显示前3个参数(只是机械的按ebp+8,ebp+0xC,ebp+0x10取三字值,不判断),L意思和上面一样。
kp;kP 把参数和参数值都以函数原型的格式显示出来。P大写表示参数占用一行。
kv 在kb的基础上增加显示FPO(栈指针省略)
kn 显示序号。
kn f 可以知道相邻栈帧的距离。(也就是看上父函数使用了多少栈空间,适用于检测栈溢出)
观察栈变量
dv 观察栈上的局部变量 dv /i/t/V 表示格式
.frame <栈帧序号> 切换栈帧
du 观察特定值。 例如 du ebp-4
!for_each_local 枚举当前所有的局部变量
!for_each_frame dv 切换到所有栈帧,并显示局部变量
分析内存
d系列命令用来显示指定地址的内存区域
d {a | b | c | d | D | f | p | q | u | w | W} [Options] [Range]
dy {b | d} [Options] [Range]
d [Options] [Range]
//大括号内为显示方式
a ASCII
b 字节和ASCII码
c DWORD和ASCII码
d 表示DWORD
D 双精度浮点数
f 单精度浮点数
p 表示按指针宽度显示
q 4字(8字节)
u UNICODE字符
w 字
W 字和ASCII码
yb 二进制和字节
yd 二进制和双字
Range 指定要显示的内存范围
1. 例如: dd 0012fd9c 0012fda8
用DWORD表示0012fd9c 到0012fda8之间的内存
2. dd 0012fd9c L4
用DWORD表示0012fd9c后的4个DWORD
3. dd 0012fda8 L-4
0012fda8是结束地址,显示在他前面的内存
显示字符串
以0结尾的字符串可以使用
da 适用单字节字符集
du 适用UNICODE字符集
UNICODE_STRING
dt _UNICODE_STRING = dS
ds 显示(STRING)
显示数据类型
dt 按指定数据类型来显示内存中的数据
dt [模块名!] 类型名
* 类型名可以用通配符
-b 递归显示所有子类型
-r 指定显示深度 -r0 不显示子类型 -r1显示1级子类型
-ny 附加搜索选项,显示某些字段
枚举函数符号
dt dbgee!*wmain*
搜索内存 s命令
搜索字符串 ASCII 和 UNICODE
s -[[Flags]] sa | su Range
s -[[Flags]] v Range Object
搜索指定范围内的指定内容
s [-[[Flags]] Type] Range Pattern
type用来指定要搜索内容的数据类型(宽度)
b 字节
w 字
d 双字
q 4字
a ASCII
u UNICODE
pattern 指定的搜索内容,可以多个
例:
s -w 0x400000 12a000 4164 76 44 62 67
s -w 0x400000 12a000 'A' 'd'
可以借助 !for_each_module 子当前进程中所有模块中进行搜索
!for_each_module s -a @#Base @#End "Debugger"
修改内存 e命令
e {a | u | za | zu} Address "String"
Address 要修改内存的起始地址
za 以0结尾的ASCII
zu 以0结尾的UNICODE
e{ b | d | D | f | p | q | w } Address [Values]
values 修改成多首
ew 12fc94 41 41 41 41 41
修改12fc94 后的5个word为41
修改物理内存地址 只有内核模式有效
!d {b | c | d | p | u | w}
!e {b | d}
观察内存属性
!address [Address] 显示某一个内存地址的特征信息
!process 0 0 显示所有进程
!PROCESS XXXXXXX 2 2代表只显示线程的状态信息