学习使用常用的windbg命令(u、dt、ln、x)
http://blog.csdn.net/wesley2005/article/details/51501514
目录:
(1) u命令(反汇编)
(2) dt命令(查看数据结构)
(3) ln命令(查找就近的符号)
(4) x命令(显示模块的符号)
(5) k命令(显示调用栈)
(6) d命令(以数据方式显示)
(7) b命令(断点)
(8) lm lmvm (显示模块信息)
(9) .reload (重加载模块)
(10) !process !thread .process .thread (查看进程线程信息)
(11) !object (查看对象信息)
(12) !devnode (查看设备对象)
(13) g命令 (继续执行)
(14) operators (MASM)(汇编下的操作符,poi,by,&等,条件断点最有用)
(15) e命令 (写内存数据)
(16) !ca命令 (查看session的ControlArea)
(17) r命令 (查看修改寄存器)
详细
(1)u命令(反汇编)
uf ICSF!SfDirectoryControl
可以查看整个函数的汇编代码
u ICSF!SfDirectoryControl ICSF!SfDirectoryControl+0X30
可以看到30个字节的汇编指令
ub ICSF!SfDirectoryControl L30
可以查看SfDirectoryControl 之上的30字节的汇编指令
(2)dt命令(查看数据结构)
dt nt!_IRP -r2
可以查看二级结构,
从而知道IoGetCurrentIrpStackLocation宏实际取的是_IRP.Tail(0x040).Overlay(0x000).CurrentStackLocation(0x020)。
也就是说,IRP+0X60里存放的就是_IO_STACK_LOCATION的地址。
实例:
dt nt!_IRP poi(ebp+0x0c) -r2 *注释:dispatch中,ebp+0ch存放的就是IRP参数的地址
显示结果(省略一部分):
+0x040 Tail : __unnamed
+0x000 Overlay : __unnamed
+0x000 DeviceQueueEntry : _KDEVICE_QUEUE_ENTRY
+0x000 DriverContext : [4] (null)
+0x010 Thread : 0x822934d8 _ETHREAD
+0x014 AuxiliaryBuffer : 0x8225bc30 "???"
+0x018 ListEntry : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x020 CurrentStackLocation : _IO_STACK_LOCATION
+0x020 PacketType : 0x822f29ac
+0x024 OriginalFileObject : 0x822ecde8 _FILE_OBJECT
然后,就可以得到irpSp的地址0x822f29ac了。
(3)ln命令(查找就近的符号)
0: kd> ln 804e23a2
(804e23a2) nt!IopfCallDriver | (804e2417) nt!KiInsertTimerTable
Exact matches:
(4)x命令(显示模块的符号)
x nt!*
则显示nt的所有符号
(5)k命令(显示调用栈)
kd
直接显示所有的栈情况
kb
显示前3个参数
kp
显示调用栈,及所有参数值和它们的类型
kc
只显示调用栈的模块名和地址(不显示调用栈的地址)
(6)d命令(以数据方式显示)
da
显示ascii码
dc
按单字节显示字符
db
按单字节显示
dd
按4字节显示
dD
按8字节显示(64位下常用)
df
按浮点显示
dp
按4字节或者8字节显示(取决于是32位系统还是64位系统)
dw
按2字节显示
dW
按2字节显示字符
dyb
按二进制位显示(一字节一组)
dyd
按二进制位显示(4字节一组)
(7)b命令(断点)
bp 0040108c
bp Myexe!main+5c
bp source.c:31
在指定地址下断点
bp Myexe!main+5c "j 0!=eax 'dd @eax;gc';'gc'")
下条件断点,如何写表达式可参考本博文的operators (MASM)
bl
显示所有断点
bc 1
bc 1-4
bc *
删除断点
bd 1
bd 1-4
bd *
使断点失效
ba r4 DSPD!g_Global
下硬件断点
bu DSPD!DriverEntry
下延迟断点(在驱动镜像加载时,下断点)
bm DSPD!openf*
下模糊断点
(8)lm lmvm (显示模块信息)
lm
显示所有加载模块
lmvm DSPrivateData64
显示指定模块的详细信息
(9) .reload (重加载模块)
.reload DSPrivateData64.sys
.reload /f /i DSPrivateData64.sys (/f强制加载, /i忽略pdb不匹配)
.reload /u DSPrivateData64.sys (卸载模块)
(10) !process !thread .process .thread(查看进程线程信息)
!process 0 0
显示所有进程
!process 0x843423 0
显示进程信息
.process 0x843423
切换到指定进程
.process /i 0x843423
输入g命令后切换到指定进程
.thread 0x87668432
切换到指定线程
!thread 0x87668432 0
查看线程信息
(11) !object (查看对象信息)
!object \
查看指定对象的信息
(12) !devnode (查看设备对象)
!devnode 0 1
查看所有的设备对象
(13) g命令 (继续执行)
g
继续执行
gu
执行到本函数返回
(14)operators(MASM)(汇编操作符,poi,by,&等,条件断点最有用)
可查看windbg帮助的operators (MASM)
poi(@ebp)
地址(ebp)指向的指针。在kernel调试下,是目标机环境。user调试下,是编译环境。
by(0x8423D435)
地址指向的字节
$vvalid(Address, Length)
指定范围的内存是否有效
& ! | 等,$scmp等
(15)e命令 (写内存数据)
eb 0x838de64c 1
向指定地址内存按单字节写入
ew (2字节)
ed (4字节)
ep (指针)
eq (8字节)
ea (ASCII字符串)
eu (UNICODE字符串)
eza (ASCII字符串,NULL结尾)
ezu (UNICODE字符串,NULL结尾)
(16) !ca命令 (查看section的ControlArea)
kd> !ca ff8636e8
ControlArea @ff8636e8
Segment: e1b74548 Flink 0 Blink: 0
Section Ref 0 Pfn Ref 6c Mapped Views: 1
User Ref 1 Subsections 5 Flush Count: 0
File Object ff86df88 ModWriteCount 0 System Views: 0
WaitForDel 0 Paged Usage 380 NonPaged Usage e0
Flags (10000a0) Image File HadUserReference
(17) r命令 (查看修改寄存器)
kd>reax
eax=00000000
查看寄存器,也可以用,r@eax等
kd>reax=1
eax=00000001
设置寄存器的值
常在断点中使用,比如
kd> bp vDiskBus!InitManager+0xb3 " r@eax=0;gc"
学习使用常用的windbg命令(u、dt、ln、x)的更多相关文章
- Linux学习之常用权限管理命令(二)
(一)常用权限管理命令 (1)chmod命令 (2)chown (3)chgrp (4)umask (一)常用权限管理命令 (1)chmod命令 命令名称:chmod命令英文原意:change the ...
- Linux学习之常用文件处理命令(一)
(一)文件命名规则 (二)常用文件处理命令 1.ls命令 2.cd命令 3.pwd命令 4.mkdir命令 5.touch命令 6.cp命令 7.mv命令 8.rm命令 9.cat命令 10.more ...
- 入门学习Linux常用必会命令实例详解
Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...
- Linux学习之常用系统工作命令(一)
由于centos和RHEL互通,两个版本可以相互学习,所以截图有两个界面 Linux系统与win系列是两个几乎完全不同的操作系统,但是就应用范围来说,是win系统更胜一筹,然而,这反而也成为win系 ...
- docker学习笔记-常用镜像相关命令
docker images # 1.使用 [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED ...
- 一张图学习vim常用命令
一张图学习vim常用命令
- [基础学习]MySQL常用语句命令总结
前言 相信平时大家在开发时都会使用MySQL数据库,它是目前比较火的一款数据库工具,对于大多数企业的业务来说,MySQL可以很完美地支持了. 很多时候我们都是借助mysql可视化工具操作mysql,虽 ...
- goland学习-go常用命令使用
goland学习-go常用命令使用 1.跨平台编译:env GOOS=linux GOARCH=amd64 go build 2.获取go第三方包:go get -u github.com/go-sq ...
- 深度学习之常用linux命令总结
深度学习中常用linux命令总结 1.创建文件夹 mkdir 文件名2.删除文件 rm -d 目录名 #删除一个空目录 rmdir 目录名 #删除一个空目录 rm -r 目录名 #删除一个非空目录 r ...
随机推荐
- sql数据库的链接方式
今天看见了一个数据库的链接方法,给转载了,记得我刚刚学DAO的时候老是要记载这些东西,所以就上博客园上面看了看,就转过来了... MySQL: String Driver="com.mysq ...
- BigDecimal精度问题
介绍 1.商业计算使用BigDecimal. 2.使用参数为String的构造函数. 3.BigDecimal都是不可变的,每一步的运算时,都会产生一个新的对象.所以在做加减乘除后千万要保存操作后的值 ...
- Spring - IoC(2): 属性注入 & 构造注入
依赖注入是指程序运行过程中,如果需要另外的对象协作(访问它的属性或调用它的方法)时,无须在代码中创建被调用者,而是依赖于外部容器的注入. 属性注入(Setter Injection) 属性注入是指 I ...
- [BZOJ3238][Ahoi2013]差异解题报告|后缀数组
Description 先分析一下题目,我们显然可以直接算出sigma(len[Ti]+len[Tj])的值=(n-1)*n*(n+1)/2 接着就要去算这个字符串中所有后缀的两两最长公共前缀总和 首 ...
- Pycharm2017汉化包下载链接
https://github.com/ewen0930/PyCharm-Chinese/tree/f5a8dc4a8f34398e81a69c69bb046aa4eff27c90 1.首先下载PyCh ...
- linux驱动基础系列--Linux I2c驱动分析
前言 主要是想对Linux I2c驱动框架有一个整体的把控,因此会忽略协议上的某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型.sysfs等也不进行详细说明原理,涉及到i2c协议部分也只 ...
- ZJOI2006书架
追yql做题记录的时候做到的……一道Splay模版题…… 啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?) 其实说白了五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后 ...
- MYSQL是什么?
#转载请联系 数据库主要分为两大类,关系型数据库和非关系型数据库.MYSQL是关系型数据库. 一.什么是关系型数据库呢? 1.关系型数据库,本质上是使用一张二维表来表示关系,和Excel表类似. 2. ...
- Selenium2+python自动化-gird分布式(转载)
本篇转自博客:上海-小T 原文地址:http://blog.csdn.net/real_tino/article/details/53467406 Selenium grid是用来分布式执行测试用例脚 ...
- python3的leetcode题,两个数求和等于目标值,返回这两个数的索引组成的列表(三种方法)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为gai目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 ...