windbg常用命令1
!PROCESS 0 1 explorer.exe !process 2f72 1和!process 81b3a980 1 结果1一样 (2f72是explorer的PID
bp /p 820dbbe0 win32k!xxxxx
/t 就是线程
bp win32k!xxxxxx"
.if(@$tpid != 0x999) {
g;
}
"
bu kernel32!LoadLibraryExW ";as /mu ${/v:MyAlias} poi(@esp+4); .if ( $spat( \"${MyAlias}\", \"*MYDLL*\" ) != 0 ) { kn; } .else { g }"
1. $t-$t19 伪寄存器 使用 r $t0=123 /r? $t0=123 前者的$t0是默认整形,后者是自动获取类型
2. &可以用来取变量地址,例如r? $t1=&@$peb->ldr ,这样$t1就是ldr变量的地址(不是值)
3. dt 用来显示一个结构例如dt -r1 nt!_EPROCESS ,其中r是用用显示其下的子结构
dt nt!_EPROCESS -y ActiveProcess用来显示指定字段
dt l 用来显示链表,复杂,后面补上
4. !address xxx显示指定地址的内存类型,不指定地址参数则显示整个地址空间
5。修改内存(字符串) ea eu eza ezu xxxx "ffff",有没z的区别是不会自动在末尾补0。修改数值命令: eb ed eq
6。搜索
字符串(任意) s -[l33]sa startaddress llength ,搜索随意字符串,其中[l33]可以省略,省略后默认的长度好像是4个字节
搜索指定字符串,其中-a是批ascii,-u就是unicode
0:000> s -a 400000 l123 "MZ"
00400000 4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00 MZ........
搜索数值的有和上者一样,不过是-a 换成-d -b 或者-w
7。显示字符串
du 或者da显示一般的unicode和ascii类型字符串
dS和ds分别显示Unicode_String和string类型
8。显示数值的我一般用dps,dd ,!dd ,db,dps会像栈一样显示,一行4个字节,显示栈esp的时候有意思,其它的容易了!dd是显示物理内存
(补:poi用于取指针的值,这是有符号的
9。~显示当前进程所有线程,~1 n 挂起1号线程,n换成m就是唤醒线程 ,换成g,运行指定的线程(当所有线程挂起时)
10。bl显示断点列表,bc清除断点 bc 1 清除1号断点,bc *清除所有断点 bc 0-2,4清除0,1,2和4号断点,还有 be bd分别用于激活和禁止断点
11。下断点:
针对线程断点~0 bp xxxx针对0号线程,这个是用户程序调用才有的。
内核中是用/p和/t来指定的,如bp /p 0x8231231 NtOpenProcess,则当EPROCESS为0x8231231 的程序经过ntOpenProcess时就断下
ba r1 ba e ba w1 分别用来读,执行,写断点.有个叫做一次命中断点的是 bp /1 NtOpenProcess,命中后就清除这个断点,不晓得有什么用,手工删除不就行了吗?
bu module!xxxx这个断点可以用来下断指定模块的函数,本质区别是这个module还没加载的时候也可以下断
12。条件执行 ——有此后面可以加个数字参数,意思是命中多少回才中断下来,默认是1
p 单步步过 (后面加L参数可以去掉每一步都显示寄存器状态
t 单步步入
pa 123 单步执行到123
pc 执行到call指令停止
pt 执行到返回指令
tb 执行到分支 只能用于内核
gu 执行到函数返回
wt指令可以统计一个函数执行过的轨迹
13。ln 3123123用来搜距离地址最近的符号 ,x nt!* 用于显示符号,同时给出符号的值
14。lm用于显示加载的模块(模块后面如果有deferred)表示模块已经加载,但是还没加载符号
lkd> lm m nt 显示指定模块 可用*号来做通配符
lm l显示只加载了符号的,e 显示有问题的,o显示模块加载的,v显示更详细信息,如lm v m nt
!lmi nt显示nt模块的信息
.load xxx加载指定xxx模块
15。内核调试时上下文
进程的有.process 显示当前的上下文,后面加eprocess的地址表示切换过去,还有个.context和这个同意义,.context就是用来切换cr3
线程使用.thread,后面加参数用于切换,不加则表示恢复以前情况
16。hi,low by wo ,dwo分别取得指定值的高16,低16位,后面的是取指定地址的值,注意,是地址指向的值,分别是字节,2字节,4字节
还有个poi这个其实和dwo一样了,不过发现poi是符号的,而dwo是无符号的
17。tlist列出正在运行进程,.time显示系统时间,.ttime显示线程时间
vertarget也显示系统时间,