//断点相关

bp + 地址 设置断点
bl  显示已经设定的断点
bu + 地址 设置断点,但是这种类型断点再下一次启动时被记录
bc 清除断点
对于断点范围,可以用*匹配,-表示一个范围,表达多个可用,号隔开

程序入口伪寄存器
WinDbg里有个伪寄存器叫$exentry,里面记录了程序的入口点。所以我们只要在命令输入栏里输入
bp $exentry
(bp就是用来下断点的命令,详细用法可以参考WinDbg的帮助文档)

//调试符号

ld kernerl32 //加载kernerl32模块的符号
lm   m k*        //显示已经加载的,以k开头的模块
ln         //显示最近操作过的模块名
dt dbg2     //检测模块

[[[[[[[[[[[[]]]]]]]]]]]]
x kernerl32!k* 显示模块kernerl32中所有以k开头的函数
dv 显示局部变量值
dv /i/t/v 显示局部变量的类型,值相关信息。
x <module>!* / ? 显示指定模块的符号
x argc 查看变量argc的值。
dt argc 查看变量值
dt _PEB 7ffdd00 将内存地址7ffdd00开始的内容以PEB结构的方式显示出来。
dd 12000 L4 查看地址12000 后面的四个字
dds 12000 L100 查看堆栈上地址12000开始,后面的100个dword的内容,如果有调试符号,会将符号显示。此方法来追踪堆栈。(先看ebp,再用此方法)
dd ebp + 4, 返回地址, ebp + 8 第一个参数

[[[[[[[[[]]]]]]]]]
.kill 杀死调试进程
.restart 重新调试

[[[[[]]]]]]]]]]]]]]
k 显示调用堆栈
,kn加序号而已。
kb 显示前三个参数。第一个参数ebp+8;第二个ebp+0x0C;第三个ebp+0x10;dd ebp+0x14是第四个参数
kp 显示函数参数类型,数值
kp f f开关显示相邻栈基之差,从而可以推断出栈的健康状况。

[[[[[[[[[[]]]]]]]]]]
| 显示进程
~显示线程
~0 s 切换到 0号线程

[[[[[[[[[]]]]]]]]]
dv 显示函数参数&局部变量,注意,dv是跟栈帧相关的,对不同的栈帧显示不同的局部变量。
@1, kn 显示所有栈帧
@2, .frame选择想要查看的栈帧
@3, dv /i/v/t显示该栈帧里局部变量信息
@3, dv /i /V /t 显示变量基于栈帧的地址
如果没有私有符号,dv是不能显示变量信息的。
vc 生成的调试符号*.pdb windbg不认识,需要设置为c++/General/DebugInfo= C7 compatible
=====
sympath + c:\nasm 添加符号搜索路径
.sympath 显示符号搜索路径
//显示一定范围内存
!db L 32 : results in 32 bytes being displayed (as hexadecimal bytes), 
//查看pe信息
!dh [Options] Address : 查看模块pe信息
!dh -f : display file headers
!dh -s : section headers
!dh -a : all header informations
查看结构体成员
dt nt!_EPROCESS
查看当前的irql
!irql
查看Verifier 检测统计信息
!verifier
查看某个内存地址属于那一个模块
!pool 地址
!lmi Address  : 查看模块的主要信息
!pcr 可以查看当前执行的线程及irql, 等信息
//
Why doesn't the WinDBG command !irql always return the correct IRQL for my target?
[Answer by Jake Oshins, jakeo_at_windows_dot_microsoft_dot_com. Workaround provided by James Antognini, antognini_at_mindspring_dot_nospam_dot_com, 27 August 2003]
!irql currently only produces useful results on a crashdump, not a live system. To retrieve the current IRQL on a live system you should instead use the !pcr command.
!processfield:列出EPROCESS的成员
该命令前的!号,意味着它来自于调试器的扩展模块―kdextx86.dll。该命令可显示内核用来代表一个进程的EPROCESS结构(该结构并没有正式的说明文档)的成员及其偏移量。
尽管该命令仅列出了成员的偏移量,但你也能很容易的猜出其正确的类型。例如,LockEvent位于0x70处,其下一个成员的偏移量为0x80。则该成员占用了16个字节,这与KEVENT结构非常类似。

!threadfields:列出ETHREAD成员
这是kdextx86.dll提供的另一个强大的选项。和!processfields类似,它列出未文档化的ETHREAD结构的成员及其偏移量。内核使用它表示一个线程.

//进程信息
!tep
!peb ,显示peb(进程信息)

//显示相关
dt ntdll!*teb* 列出匹配通配符的结构名
dt -v -r ntdll!_TEB
列出结构_TEB的成员信息

//显示变量地址
r $peb 显示模块peb的地址

//查看错误信息
!gle

//设置断点的技巧
可以直接把断点设在: kernel32!BaseProcessStart
1), 先用lm 显示所有已经加载的模块
2), dt our_exe_name!*main*  //在我们的程序模块中搜索包含main的地址(注意:如果未加载symbol是不能显示的!)
3), 如果存在,在our_exe_name!*main 处设置断点
=======
Command     SoftICE OllyDbg 
Run         F5     F9 
Step Into     F11 F7 
Step Over     F10 F8 
Set Break Point F8 F2 
搜索内存

5、查找字符串
在步骤1我们运行程序时就记录了提示注册错误的字符串“Wrong Serial, try again!”,现在我们就要在内存找到该字符串的位置。
输入命令
s –a 00400000 L53000 “Wrong”
该命令的意思是以ASCII码形式在内存地址00400000往后53000个字节搜索字符串“Wrong”。
s,就是要调用查找的命令
-a,指定使用ASCII码的形式查找
00400000,指定要开始寻找的内存地址。
L53000,说明要在00400000往后的53000字节搜索。这个数值和00400000都可以从Stud_PE获得。00400000是程序的装 入地址,而53000是映像的大小,也就是程序载入内存后占用的内存大小。使用这两个数值,基本上可以搜索到程序使用的整个内存范围。
“Wrong”,就不用多解释了,就是我们要寻找的字符串。不过WinDbg不支持模糊搜索,所以这里输入的字符串必定要完全正确。
内存访问断点

6、下内存访问断点
WinDbg中,ba命令代表Break On Access,即访问时中断。
我们在命令行输入:
ba r 1 0044108c
命令的意思是在内存0044108c的位置下字节的读断点。命令中各元素的含义可以参考帮助文档,这里不啰嗦。
输入bl,查看断点使用情况:

地址运算
? 0x33 + 0x44
运行后将得到计算和

3.查看和修改数据
调试中不可避免的要查看和修改数据
查看内存:
db/dw/dd/dq [Address]       字节/字/双字/四字方式查看数据
da/du [Address]           ASCII字符串/Unicode字符串方式查看指定地址
其它常用的如查看结构
dt nt!_EPROCESS
dt nt!_EPROCESS 89330da0 (把0x89330da0作为对象指针)
修改内存:
eb/ew/ed/eq/ef/ep Address [Values] 
字节/字/双字/四字/浮点数/指针/
ea/eu/eza/ezu Address [Values] 
ASCII字符串/Unicode字符串/以NULL结尾的ASCII字符串/以NULL结尾的Unicode字符串
搜索内存:
s -[b/w/d/q/a/u] Range Target
搜索字节/字/双字/四字/ASCII字符串/Unicode字符串

2.断点
断点之于调试当然是非常重要的
常用命令:
bp [Address]or[Symbol] 在指定地址下断
可以使用地址或符号,如
bp 80561259(Windbg默认使用16进制)
bp MyDriver!GetKernelPath
bp MyDriver!GetKernelPath+0x12
bp [Address] /p eprocess 仅当当前进程为eprocess时才中断
这个很常用,比如你bp nt!NtTerminateProcess,但是只想在某一进程触发此断点时才断下来,那就加上这个参数吧,因为内核中的代码是各个进程共用的,所以此 命令很实用
bp [Address] /t ethread 仅当当前线程为ethread时才中断,用法跟/p参数类似
bu [Address]or[Symbol] 下一个未解析的断点(就是说这个断点需要延迟解析)
这个也很常用,比如我们的驱动名为MyDriver.sys,那么在驱动加载之前下断bu MyDriver!DriverEntry,
然后加载这个驱动时就可以断在驱动入口,并且这个是不需要调试符号支持的
bl 列出所有断点,L=List
bc[id] 清除断点,c=Clear,id是bl查看时的断点编号
bd[id] 禁用断点,d=Disable,id即断点编号
be[id] 启用断点,e=Enable,id为断点编号

 
 
 
 

WinDbg 命令集锦的更多相关文章

  1. WinDbg 命令三部曲:(一)WinDbg 命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  2. WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  3. WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  4. windbg命令学习3

    3.进程与线程: 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1. 进程命令 进程命令包括以下:显示进程 ...

  5. Windows命令行命令集锦

    原文:Windows命令行命令集锦 转自:http://www.me2wg.com/bbs/forum.php?mod=viewthread&tid=15830 winver--------- ...

  6. WinDbg 命令手册

    WinDbg 命令三部曲:(一)WinDbg 命令手册   本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部 ...

  7. WinDbg命令三部曲

    WinDbg 命令三部曲:(一)WinDbg 命令手册 WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册 WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册

  8. windows常用命令集锦

    开始→运行→输入的命令集锦 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 lo ...

  9. Windbg命令脚本流程控制语句详解

    在Windbg命令脚本一文里,我们介绍了命令脚本语言的的组成要素,在本文里将对语句进行展开的讲解.这些语句主要是流程控制的语句,比如我们常见的条件分子和循环语句等. ; (命令分隔符) 分号(:)字符 ...

随机推荐

  1. What's New in C# 6.0

    Static Types as using So, we are all quite familiar with this notion of accessing static class membe ...

  2. 我使用中的Linux命令和快捷键(For Ubuntu)

    虽然自己工作一直都在MS的平台体系,自然很多的工作都需要在windows上完成,自己的电脑也一直使用windows操作系统,但是笔记本配置不是很好,导致装windows 8后,笔记本卡的难以忍受.想想 ...

  3. 在sqlServer中把数据导出为insert脚本

    有时候为了把数据导出为insert脚本,不得不用一些小工具,或者通过自己写存储过程来完成这一操作.其实SqlServer本身就有这种功能.以下是详细步骤:

  4. c# 高效读写文件

    一.同步读写文件(在并发情况下不会发生文件被占用异常) static void Main(string[] args) { Parallel.For(0, 10000, e => { strin ...

  5. Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置

    上次介绍了<Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示> 以及如何配置自定义审批流的按钮:<Dynamic CRM 2013学习笔记(二十一)自定义 ...

  6. Xperf Analysis Basics(转)

      FQ不易,转载 http://randomascii.wordpress.com/2011/08/23/xperf-analysis-basics/ I started writing a des ...

  7. [BTS] WCF-OracleDB

    When I insert some data to Oracle, BizTalk WCF-OracleDB throw this error. A message sent to adapter ...

  8. 【Android】应用程序Activity启动过程分析

    在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity:应用程序的默认Activity启动起来后,它又可以 ...

  9. Javascript入门学习

    编程之道,程序员不仅仅要精通一门语言,而是要多学习几门. 本学习之源出自柠檬学院http://www.bjlemon.com/,特此声明. 第一课1:javascript的主要特点解释型:不需要编译, ...

  10. 地图源改变之后mxd文件打开很慢的问题

    在使用ArcGIS开发电子地图程序时,有时候需要更换服务器地址,这时打开MXD文件就会非常慢,一直没有找到有效的方法,下面是从网上搜到的方法,还没有验证,下次再碰到这个问题的时候,验证一下: (以下方 ...