学习使用常用的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(AddressLength)

指定范围的内存是否有效

& ! | 等,$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

查看寄存器,也可以用,[email protected]等

kd>reax=1

eax=00000001

设置寄存器的值

常在断点中使用,比如

kd> bp vDiskBus!InitManager+0xb3 " [email protected]=0;gc"

时间: 2024-10-06 00:27:10

学习使用常用的windbg命令(u、dt、ln、x)的相关文章

常用的DOS命令和运行命令总结(不常用的不介绍,节省学习时间成本)【高手请绕道我怕写的不好丢人】

最初接触到DOS命令是因为学习Java时需要javac和java来编译运行java程序,所以顺便就把DOS常用命令都学了一遍.如果你以前没用过,刚好学习学习,给妹子修电脑的时候多敲几行命令可以让:妹子刮目相看. 下面就是常用的DOS命令和运行命令: 先从简单的运行命令说起:快捷键 win+R 命令            工具            单词 calc          打开计算器         (calculator) mspaint       打开画图工具       (Mic

一张图学习vim常用命令

一张图学习vim常用命令

c/c++unix/linux基础学习笔记-常用命令和vi的使用

linux 基本命令的使用-命令在ubuntu下面执行,有些命令通用其他linux,有些不通用. 多条命令间用;号隔开,回车后可以一起执行. clear-前屏,pwd显示当前目录,cd跳转目录. sudo [命令]  -ubuntu 下以管理员身份运行命令. 一般情况下,运行当前目录下的程序,要用 ./文件名 执行. 查看当前shell名称:ps 进入另外一个shell,直接输入shell名称:ksh/tcsh/sh/bash,退出一个shell用:exit. 切换shell命令,如:exec

Hadoop学习常用的Linux命令

我们以RHEL6.3为例说明. Linux的命令后面会有命令选项,有的选项还有选项值.选项的前面有短横线“-”,命令.选项.选项值之间使用空格隔开.有的命令没有选项,会有参数.选项是命令内置的功能,参数是用户提供的符合命令格式的内容. 1.1.1. 命令提示符 在桌面上点击鼠标右键,在弹出菜单中选择“Open in Terminal”, 系统会打开终端,类似于Windows下的命令行.Windows的命令行是dos环境,Linux下的命令行是shell环境.我们的所有命令都是在shell下运行的

[基础学习]MySQL常用语句命令总结

前言 相信平时大家在开发时都会使用MySQL数据库,它是目前比较火的一款数据库工具,对于大多数企业的业务来说,MySQL可以很完美地支持了. 很多时候我们都是借助mysql可视化工具操作mysql,虽然说是比较方便,但是记住一些常用的命令还是有必要的. 我们来总结一下,一些平时比较常用的语句命令: 1.更改root密码 mysqladmin -uroot password 'new_password' 2.登录MySQL服务器 mysql -h120.0.0.1 -uroot -p*** -p3

Linux学习之常用命令(二)

1.上次介绍了一些常用的系统命令,这次又总结了一些小命令,故分享一下: 网卡地址查询的命令: ifconfig #不同于Windows系统,它的是ifconfig而不是ipconfig ip -a #同样可以查询ip地址 2.查看系统的内核以及架构内容: uname #用于查询系统版本以及相关信息 先查询它的文档帮助: -a参数表示print all 查看系统的负载数,说句笑话,如果这个数超过5,就会睡不着觉了...,肯定是系统过载了,得想方法解决,否则严重会导致系统崩溃,今天新闻就报道了谷歌和

linux学习(2):linux服务器常用操作和命令

linux服务器常用操作和命令 目录 1. 什么是linux服务器load average?2. 如何查看linux服务器负载3. 服务器负载高怎么办?4. 如何查看服务器内存使用率?5. 如何查看单个进程占用的内存大小?6. 无法从linux服务器A登录到服务器B怎么办?7. 如何查看正在使用的服务和端口?8. 如何查看服务器进程信息?9. 如何杀死进程?10. 如何查找僵尸进程?11. 如何在内网服务器间传输数据?12. 为什么启动不了服务器端口?13. 常用的linux服务器性能查看命令有

WinDbg 命令集锦

//断点相关 bp + 地址 设置断点bl  显示已经设定的断点bu + 地址 设置断点,但是这种类型断点再下一次启动时被记录bc 清除断点对于断点范围,可以用*匹配,-表示一个范围,表达多个可用,号隔开 程序入口伪寄存器WinDbg里有个伪寄存器叫$exentry,里面记录了程序的入口点.所以我们只要在命令输入栏里输入bp $exentry(bp就是用来下断点的命令,详细用法可以参考WinDbg的帮助文档) //调试符号 ld kernerl32 //加载kernerl32模块的符号lm   

linux下要熟练掌握的常用快捷键和命令

请坚信这个道理:linux环境下的常用的快捷键和命令的熟练掌握,对之后的学习和工作会有莫大的帮助. 我在这里简单总结一些常用快捷键和命令,希望给大家带来一些帮助,也是自我的一次总结. 一.常用快捷键 1.终端 tab键:补齐系统中存在的文件名称.命令.命令参数或者路径.最常用的快捷键! Ctrl+A:将光标移动到命令行的行首. Ctrl+E:将光标移动到命行令的行尾. Ctrl+U:删除所在位置到行首的内容. Ctrl+K:删除所在位置到行尾的内容. Ctrl+Z:将当前进程送到后台处理. Ct