Windbg 脚本命令简介 一
Windbg 脚本命令简介 一 Windbg command
r:
registers的简写,可以显示或修改寄存器的值、浮点寄存器的值、定义别名变量。
可以显示当前线程下的寄存器值。
The r command displays or modifies registers, floating-point registers, flags, pseudo-registers, and fixed-name aliases.
0:000> ~2 r
//显示 2号线程的寄存器值
0:000> ~* r eax
//显示所有线程的 eax寄存器值
n (Set Number Base)
设置默认显示的数字进制(Radix)
0:000> n
base is 16
//显示默认进制
0:000> n 10
base is 10
//改成10进制
|
Value |
Description |
|
8 |
Octal |
|
10 |
Decimal |
|
16 |
Hexadecimal |
In all MASM expressions, numeric values are interpreted as numbers in the current radix (16, 10, or 8). You can override the default radix by specifying the 0x prefix (hexadecimal), the 0n prefix (decimal), the 0t prefix (octal), or the 0y prefix (binary).
dc 00cc07c8 00cc07c8+0n4344
Windbg默认的数值进制一般是16, 可以通过n命令查看和设置当前进制,
, 0n(十进制), 0x(十六进制), 0t(8进制), 0y(2进制), 比如0n20表示20, 0x14表示20等
? Expression(Evaluate Expression)
计算表达式
0:000> as fn c:\dir\name.txt //定义一个别名,设置别名,Alias Set
0:000> $spat("c:\dir\name.txt","*name*") //没有输出
0:000> ?$spat("c:\dir\name.txt","*name*") //计算结果,\n被转义,所以结果是0.
Evaluate expression: 0 = 00000000`00000000
0:000> ?$spat(@"c:\dir\name.txt","*name*") //在字符串前面加 @符号
Evaluate expression: 1 = 00000000`00000001
0:000> ?$spat("c:\dir\","*name*")
Syntax error at '("c:\dir\","*name*")' //有错误,因为dir\” 这里被转义
0:000> ?$spat(@"c:\dir\","*name*") //使用@,防止被转义
Evaluate expression: 0 = 00000000`00000000
0:000> ?$spat(@"c:\\name","*name")
Evaluate expression: 1 = 00000000`00000001 //找到结果,输出1,表示true
0:000> ?$spat(@"c:\dir\","*d*")
Evaluate expression: 1 = 00000000`00000001
0:000> ?$spat(${fn},"*d*")
Syntax error at '(c:\dir\name.txt,"*d*")' //定义别名就是类似C++ 里的宏
0:000> ?$spat("${fn}","*d*")
Evaluate expression: 1 = 00000000`00000001
0:000> ?$spat("${fn}","*name*")
Evaluate expression: 0 = 00000000`00000000 // fn 中的\n 被转义,所以找不到
0:000> ?$spat(@"${fn}","*name*")
Evaluate expression: 1 = 00000000`00000001
$spat 是MASM里的一个命令,检查第一个string参数是否符合第二个参数的模式(大小写敏感),
要注意 转移字符 \n, \", \r, and \b
?? 是c++表达式格式的,对应MASM的 ? 功能。
Address and Address Range Syntax
下面的2个是等价的,dd是读取双字,即4个字节,2个字节(byte)为一个字(word)。
当一个存放于0x00123456 的指针指向地址0x00420000,我们想显示位于地址0x00420000的内容时,可以有如下选择:
0:000> dd 420000 //直接打印位于该地址的值
0:000> dd poi(123456)
//取得0x00123456地址上指针的值,以poi函数(point to int)取值,即32位平台取4字节,64位平台取8字节,取的都是一个完整指针大小的长度,32位平台指针长度为4字节,64位平台指针长度是8字节。额外一点,int/Int32无论在32还是64位平台都是4字节。
读取开始地址为0x00001000 的8字节:这里假设对象长度是1字节,L指定是对象个数,它跟对象的大小有关系
Dd 0x00001000 0x00001007 //指定开始地址,结束地址
Dd 0x00001000 L8 //指定开始地址,对象个数8,假设对象是1字节长度
Dd 0x00001000 L2 //指定开始地址,对象个数2,假设对象是双字长度(4字节)
Dd 80000000 L20 // the range from 0x80000000 through 0x8000001F
Dd 80000000 L-20 //specifies the range from 0x7FFFFFE0 through 0x7FFFFFFF.
MASM parser treats all symbols as addresses, the example must have the poi operator to dereference MyVar
MASM解析器把所有的symbol符号都用地址的方式来表示,所以必须用poi函数来解析出地址里面的值。
实例:
|
0:000> !do 0x0000000122a8b110 Name: InternalEntity.CityInfoEntity MethodTable: 000007ff00283908 EEClass: 000007ff00293c18 Size: 48(0x30) bytes File: C:\ SearchService.InternalEntity.dll Fields: |
||||||||||||||||
|
MT |
Field |
Offset |
Type |
VT |
Attr |
Value |
Name |
|||||||||
|
000007fee4abc7e8 |
4000534 |
10 |
System.Int32 |
1 |
instance |
30138 |
city |
|||||||||
|
000007fee4abc7e8 |
4000535 |
14 |
System.Int32 |
1 |
instance |
10082 |
province |
|||||||||
|
000007fee4abc7e8 |
4000536 |
18 |
Sstem.Int32 |
1 |
instance |
28 |
country |
|||||||||
|
000007fee4abd618 |
4000537 |
20 |
System.Boolean |
1 |
instance |
1 |
hasMemoryCacheConfig |
|||||||||
|
000007ff00463810 |
4000538 |
8 |
...ityTimeZoneEntity |
0 |
instance |
0000000122a8b140 |
<CityTimeZone>k__BackingField |
|||||||||
|
000007fee4abc7e8 |
4000539 |
1c |
System.Int32 |
1 |
instance |
0 |
<CityhotelCount>k__BackingField |
|||||||||
|
0:000> dc 0x0000000122a8b110 00000001`22a8b110 00283908 000007ff 22a8b140 00000001 .9(.....@..".... 00000001`22a8b120 000075ba 00002762 0000001c 00000000 .u..b'.......... 00000001`22a8b130 00000001 00000000 00000000 00000000 ................ 00000001`22a8b140 00463810 000007ff 000075ba 00000e10 .8F......u...... 00000001`22a8b150 00000e10 00000001 d266c000 08cffbb9 ..........f..... 00000001`22a8b160 9d264000 08d0a0be 20c3c000 08d119c2 .@&........ .... 00000001`22a8b170 eb834000 08d1bec6 00000000 00000000 .@.............. 00000001`22a8b180 00256438 000007ff 22a8b110 00000001 8d%........".... |
ß 这里一行的长度是0n16 4字节*4组=16字节 的计算方式。 这里看一下这里Offset=8的地方是CityTimeZone对象,确实是Offset在8字节处。 |
|||||||||||||||
|
0:000> dc 0x0000000122a8b110+0x10 //0x000075ba=0n30138 00000001`22a8b120 000075ba 00002762 0000001c 00000000 .u..b'.......... 00000001`22a8b130 00000001 00000000 00000000 00000000 ................ 00000001`22a8b140 00463810 000007ff 000075ba 00000e10 .8F......u...... 00000001`22a8b150 00000e10 00000001 d266c000 08cffbb9 ..........f..... 00000001`22a8b160 9d264000 08d0a0be 20c3c000 08d119c2 .@&........ .... 00000001`22a8b170 eb834000 08d1bec6 00000000 00000000 .@.............. 00000001`22a8b180 00256438 000007ff 22a8b110 00000001 8d%........".... 00000001`22a8b190 00000000 00000000 00000085 000075ba .............u.. |
ß 这根据上面的Offset 0x10来直接用内存看,得到的结果是一样的,0x000075ba = 0n30138,使用?0x75ba 直接计算表达式可以得到值,如下所示。 |
|||||||||||||||
|
0:000> n16 base is 16 0:000> ?0x75ba //? 计算表达式的值 Evaluate expression: 30138 = 00000000`000075ba |
||||||||||||||||
|
0:000> !do 0000000122a8b140 Name: CityTimeZoneEntity MethodTable: 000007ff00463810 EEClass: 000007ff00475880 Size: 64(0x40) bytes File: C:\Hotel.Product.SearchService.InternalEntity.dll Fields: |
||||||||||||||||
|
MT |
Field |
Offset |
Type |
VT |
Attr |
Value |
Name |
|||||||||
|
000007fee4abc7e8 |
4000490 |
8 |
System.Int32 |
1 |
instance |
30138 |
<City>k__BackingField |
|||||||||
|
000007fee4abc7e8 |
4000491 |
c |
System.Int32 |
1 |
instance |
3600 |
<DstOffset>k__BackingField |
|||||||||
|
000007fee4abd618 |
4000492 |
14 |
System.Boolean |
1 |
instance |
1 |
<IsSupportDst>k__BackingField |
|||||||||
|
000007fee4ad96d8 |
4000493 |
18 |
System.DateTime |
1 |
instance |
0000000122a8b158 |
<CurDstStartDate>k__BackingField |
|||||||||
|
000007fee4ad96d8 |
4000494 |
20 |
System.DateTime |
1 |
instance |
0000000122a8b160 |
<CurDstEndDate>k__BackingField |
|||||||||
|
000007fee4ad96d8 |
4000495 |
28 |
System.DateTime |
1 |
instance |
0000000122a8b168 |
<NextDstStartDate>k__BackingField |
|||||||||
|
000007fee4ad96d8 |
4000496 |
30 |
System.DateTime |
1 |
instance |
0000000122a8b170 |
<NextDstEndDate>k__BackingField |
|||||||||
|
000007fee4abc7e8 |
4000497 |
10 |
System.Int32 |
1 |
instance |
3600 |
<UTCOffset>k__BackingField |
|||||||||
|
0:000> dd 0000000122a8b140 00000001`22a8b140 00463810 000007ff 000075ba 00000e10 00000001`22a8b150 00000e10 00000001 d266c000 08cffbb9 00000001`22a8b160 9d264000 08d0a0be 20c3c000 08d119c2 |
<-- 查看offset=8的地方,发现值确实是30138,查看offset=12,16进制 0xc的地方值确实为3600 |
|||||||||||||||
|
0:000> ?0x75ba Evaluate expression: 30138 = 00000000`000075ba 0:000> ?0xe10 Evaluate expression: 3600 = 00000000`00000e10 |
||||||||||||||||
|
0:000> dd poi(0x0000000122a8b110+8) 00000001`22a8b140 00463810 000007ff 000075ba 00000e10 00000001`22a8b150 00000e10 00000001 d266c000 08cffbb9 00000001`22a8b160 9d264000 08d0a0be 20c3c000 08d119c2 00000001`22a8b170 eb834000 08d1bec6 00000000 00000000 00000001`22a8b180 00256438 000007ff 22a8b110 00000001 00000001`22a8b190 00000000 00000000 00000085 000075ba 00000001`22a8b1a0 00000000 00000000 4aea67f9 08d0b971 00000001`22a8b1b0 00000000 00000000 e4ab6900 000007fe 0:000> !do poi(0x000000122a8b110+8) Name: Hotel.Product.SearchService.InternalEntity.CityTimeZoneEntity MethodTable: 000007ff00463810 EEClass: 000007ff00475880 Size: 64(0x40) bytes |
<--直接将CityInfoEntity 对象Offset=8位置处的地址通过poi函数得到该地址上的值0000000122a8b140 ,运行!do <object address> 看到的是CityTimeZoneEntity这个对象的内容。如果不加poi函数,dd 看到的还是CityInfoEntity对象的内容, 运行 !do 0x000000122a8b110+8 看到的将不是一个有效的对象。 |
|||||||||||||||
|
下面来看看如果不小心输入了下面的命令会是什么结果: |
||||||||||||||||
|
0:000> dd poi(0x0000000122a8b110)+8 000007ff`00283910 00050011 00000004 e4ab5a58 000007fe 000007ff`00283920 0025ed18 000007ff 00283978 000007ff 000007ff`00283930 00293c18 000007ff 00000000 00000000 000007ff`00283940 00000000 00000000 00283958 000007ff |
<--这里右括号括号的位置与上面的命令位置不一样。 看到前面正确命令的基地址是00000001`22a8b140,而这里变成了000007ff`00283910 ,差距很大。 |
|||||||||||||||
|
原因是什么呢? Poi命令把0x0000000122a8b110地址上的值作为另外一个地址,0x0000000122a8b110 后续的几个字节的那一段东西其实是内容,而不是地址。它表示的是CityInfoEntity这个对象的有实际意义的内容,而不是地址。Poi命令简单粗暴的将内容作为地址来对待。 |
||||||||||||||||
|
0:000> dd 0x0000000122a8b110 00000001`22a8b110 00283908 000007ff 22a8b140 00000001 00000001`22a8b120 000075ba 00002762 0000001c 00000000 |
<--通过dd 查看到以16进制表示的一串数字,这些数字是代表了CityInfoEntity的内容,00283908 000007ff 是内容,而poi把它作为地址来使用了。 |
|||||||||||||||
|
0:000> dd 000007ff00283908 000007ff`00283908 00080000 00000030 00050011 00000004 000007ff`00283918 e4ab5a58 000007fe 0025ed18 000007ff 000007ff`00283928 00283978 000007ff 00293c18 000007ff |
<--通过查看00283908 000007ff 这个地址的内容,我们找到offset=8的地方的内容,可以发现下划线的东西是一样的。 |
|||||||||||||||
Windbg 脚本命令简介 一的更多相关文章
- Windbg 脚本命令简介 二, Windbg command
Windbg 脚本命令简介 二, Windbg script command $<, $><, $$<, $$><, $$>a< (Run Scri ...
- Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)
目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本 ...
- perf 高级命令简介
perf 高级命令简介 1.使用 tracepoint 当 perf 根据 tick 时间点进行采样后,人们便能够得到内核代码中的 hot spot. 使用ls命令来演示 sys_enter 这个tr ...
- window脚本命令学习(转)
批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现 ...
- Windbg脚本和扩展工具开篇
好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465603 Android系统Recovery工作原理之使用update.zip ...
- WinDBG 调试命令大全
转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html #调试命令窗口 ++++++++++++++++++++++++ ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- linux 基础 shell脚本命令
#########shell脚本命令#### 1.diff diff file file1 ####比较两个文件的不同 -c ####显示周围的行 -u ####按照一格式统一输出生成补丁 -r ## ...
随机推荐
- 4.iptables 网络防火墙
[1] #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文. [2] #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启 c ...
- 动态sql语句和动态传入参数个数
1.可以将要传入的几个参数封装成一个实体类,然后将实体类作为一个参数传入到相应的方法中,这时候就需要这sqlMapper.xml文件中对传入的字段利用<if test=""& ...
- PyQt5(1)——Qt Designer初探
相关环境配置我们就不介绍了(网上有很多教程) Qt Designer 是一款十分强大的GUI工具,生成的文件为 .UI文件 可以通过命令转化为Py文件,简单来说我们可以通过拖拽方式生成界面,在通过简 ...
- 数学 CF1068B LCM
CF1068B LCM 给定一个正整数\(b (1\leq b \leq 10^{10})\). 把一个正整数a从1枚举到\(10^{18}\),求有多少种不同的\(\large \frac{[a,b ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- vue,下级页面刷新导致路由跳转带过来的数据消失的解决方法
if(typeof(this.$route.query.result)=='string'){ //刷新时走这 }else{ //正常路由跳转过来后就把数据塞到 localStorage let ob ...
- 用selenium工具做软件自动化测试的面试题及答案
1.selenium中如何判断元素是否存在? 答:isElementPresent 2.selenium中hidden或者是display = none的元素是否可以定位到? 答:不可以定位到 3.s ...
- html5在手机熄屏后倒计时会出现延迟情况
今天开发了一个手机端的倒计时,然后同事说出现了Bug,怎么回事呢?Bug很简单,就是在手机返回主界面或者熄屏后倒计时会暂停在熄屏前的时间(注意时间是页面加载时获取的服务器的时间),问题很简单,知道问题 ...
- es第二篇:Document APIs
文档CRUD API分为单文档API和多文档API.这些API的索引名参数既可以是一个真正的索引的名称,也可以是某个索引的别名alias. 单文档API有:Index API.Get API.Dele ...
- Unity QualitySettings.SetQualityLevel 设置质量级别
QualitySettings.SetQualityLevel 设置质量级别 public static void QualitySettings.SetQualityLevel(int index) ...