WinDBG的伪寄存器
$ea
上一条指令中的有效地址(effective address)
$ea2
上一条指令中的第二个有效地址
$exp
表达式评估器所评估的上一条表达式
$ra
当前函数的返回地址(retrun address)。
例如,可以使用g @$ra返回到上一级函数,与gu(go up)具有同样的效果
$ip
指令指针寄存器。x86中即EIP,x64即eip
$eventip
当前调试事件发生时的指令指针
$previp
上一事件的指令指针
$relip
与当前事件关联的指令指针,例如按分支跟踪时的分支源地址
$scopeip
当前上下文(scope)的指令指针
$exentry
当前进程的入口地址
$retreg
首要的函数返回值寄存器。x86架构使用的是EAX,x64是RAX,安腾是ret0
$retreg64
64位格式的首要函数返回值寄存器,x86中是edx:eax寄存器对
$csp
帧指针,x86中即ESP寄存器,x64是RSP,安腾为BSP
$p
上一个内存显示命令(d*)所打印的第一个值
$proc
当前进程的EPROCESS结构的地址
$thread
当前线程的ETHREAD结构的地址
$peb
当前进程的进程环境块(PEB)的地址
$teb
当前线程的线程环境块(TEB)的地址
$tpid
拥有当前线程的进程的进程ID(PID)
$tid
当前线程的线程ID
$bpx
x号断点的地址
$frame
当前栈帧的序号
$dbgtime
当前时间,使用.formats命令可以将其显示为字符串值
$callret
使用.call命令调用的上一个函数的返回值,或者使用.fnret命令设置的返回值
$ptrsize
调试目标所在系统的指针类型宽度
$pagesize
调试目标所在系统的内存页字节数
可以直接用上表中的名称来使用伪寄存器,但是更快速的方法是在$前加上一个@符号。这样,WinDBG就知道@后面是一个伪寄存器,不需要搜索其他符号。
使用windbg在程序的入口点下断点
1、bp @$exentry
使用伪寄存器的方法,也是最常用的方法
2、bp poi(@$peb+8)+poi(poi(@$peb+8)+poi(poi(@$peb+8)+3c)+28)
3、bp $iment(poi(@$peb+8))