Windbg简单命令

 

__stdcall调用约定的栈结构
ebp+8  |函数的第一个参数
ebp+4  |函数的返回地址   
ebp        |ebp                         
ebp-4    |局部变量               

 


1.短命令
2.元命令(.)
3.扩展命令(!)

获得进程peb============================================================

!peb


获得线程teb============================================================

!teb


显示从系统函数中返回的错误=================================================

!gle


调试=================================================================

t: 单步执行
~.t:在当前线程处单步执行(防止线程切换)
p: 步过
pc: 执行到下一个子例程call处
g: 继续执行
g 地址: 继续执行到指定地址
gu : 执行到返回
~0 gu : 除了线程0外,冻结其他所有的线程
u .l4 : 对函数进行反汇编以找出一个合适的执行停顿点

 

伪寄存器==============================================================

r + 名字
名字:代码
$proc:当前的进程
$thread:当前的线程
$tpid:当前的进程标识
$tid:当前的线程标识
$peb:进程控制块
$teb:线程环境块

 

处理器当前执行的代码是什么=================================================
u(Unassaembly)反汇编命令
u.:反汇编当前$ip地址上的8条指令
uf.:反汇编包含当前$ip的整个函数
ub.:反汇编当前$ip之前的8条指令
u.L2:反汇编当前$ip之后的2条指令
ub.L2:反汇编当前$ip之后的2条指令
u..+a:反汇编在$ip+10之间的10条指令

 

当前的调用栈是什么=======================================================
k(Stack Back Trace)栈回溯命令
kp 5:显示在调用栈中前5个函数以及他们的参数
kf 5:显示前面的5个函数,第一个数字是函数使用的栈大小
k = 栈基指针 栈顶指针 指令指针:当k命令无法解析栈的时候可以手动指定

 

在代码中设置断点=========================================================
bp: 参数可以是1.设置断点的地址2.断点选项3.断点限制4.一个字符串表示断点触发时需要执行的命令(可以用;号隔开)
例子:~0 bp Program!CClass::Func "resp;g"
在线程0上设置断点,并在断点触发时执行"resp"命令和"g"命令
bl: 列出所有断点
bc: 清除所有断点
内核中使用断点:
bp ntdll!RtlAllocateHeap 所有进程都会触发的点
bp /p @$proc ntdll!RtlAllocateHeap "!process -1 0;g" :在ntdll!RelAllocateheap上设置断点,只有EPROCESS为@$proc时才会触发,并执行命令
用户态时使用断点:
bm Program!*class* : 在类class的所有方法上加上断点
bu ole32!CoInitializeEx没有加载的动态链接库上使用延迟断点,当链接库加载的时候自动设置

 

变量的值是什么===========================================================

dv:不带参数的dv显示局部变量的值
dv Program!gFun* :显示匹配模式的值
dv /i :在第2列显示符号类型(公私有?)和参数类型(局部变量,参数..)
dv /v 变量名:显示变量储存的地址

dt:解析变量的数据类型
dt this :解析this变量的类型(为某个类指针)
dt 类名 地址: 按照类名的类结构来解析指定地址的内存

 

如何查看内存============================================================
dc 地址 长度: 如 dc 0x005f0ea0 l4 : 转存出0x005f0ea0上4个双字数据
dd 地址: 查看地址上的数据
du 地址: 转存出地址上的unicode字符串
da 地址: 转存出地址上为ascii的字符串
db 地址 长度: 如 db 0x005f0ea0 l4 : 将4个字节转存为一个字节数组
dyb 地址 长度: 以二进制格式转存为4个字节;以二进制格式转存为4个双字
dyd 地址 长度: 转存出4个浮点数
dp* 地址: 重复以某种格式读取地址 , 如dpu就是用地址数组转换成unicode字符串输出

 

如何搜索内存============================================================
s -d L10000000/4 C0000005 :在地址空间前的256MB中搜索C0000005

 

设置内存访问断点=========================================================
ba w4 gGlobal+0: 在gGlobal+0地址处检测4个字节上的写入操作

 

在内存位置上包含的是什么===================================================
!address 地址/寄存器/堆/空: 为空时所有并且枚举所有的内存区域并给出详细的信息

 

怎么改变地址上的值=======================================================
ed 地址 值: