命令脚本,就是将完成某个特定任务的相关命令组合在一起,保存在脚本文件里,加载到Windbg里执行,达到我们的目的。你可以理解为脚本就是一种语言,就像c或者汇编,但是他不需要编译器将其编译为可执行文件,而是由解释器将其内容翻译为对应的动作。而Windbg的脚本就是利用Windbg作为解释器,将脚本内容翻译为实际的动作。
既然可以作为一种语言,那么它就具有一般语言通常包含的要素:数据类型、变量、表达式、语句、函数等,下面我们分别简单讲一下。
一、数据类型
关于数据类型,Windbg的帮助里没有明确列举,但是,在使用时一般会遇到,数值和字符串这两种。
二、变量
在windbg中变量的定义很特别,实际上,它并没有变量这个概念,所以,在学习的时候会觉得很别扭。不过,我们换个思路就容易了,变量实际上就是为了保存临时结果, 如果只想保存一些数值,那么伪寄存器(参考Windbg命令的语法规则系列)应该是比较好的选择,windbg提供了20个伪寄存器$t0-$t19,供命令保存临时数值变量。称他们为伪寄存器是有原因的,首先对他们的操作和寄存器一样,都是使用r命令,在C++表达式里都前面需要加@符,但是他们又不是真正的寄存器,只是windbg定义的名字而已。使用这些伪寄存器也是很方便的:
代码:
0:000> r $t0=0x123 0:000> r $t0 $t0=00000123 0:000> r eax eax=004c1b89 0:000> r $t0=@eax 0:000> r $t0 $t0=004c1b89
从上面的例子也可以看出r命令后面的@是可以省略的。
三、别名
别名和变量还有些区别,变量是在执行过程中取他的值,而别名更像是宏,在解释时直接用内容替换原始操作数。别名有两种,一种是固定名字的,一种是自定义的。
0:000> r $.u0 = "123" 0:000> .echo $u0 123
0:000> .dvalloc 10 Allocated 1000 bytes starting at 00010000 0:000> ea 00010000 "123456" 0:000> as /ma ${/v:test} 0x00010000 0:000> .echo test 123456
0:000> al Alias Value ------- ------- test 123456 0:000> ad ${/v:test} 0:000> al No aliases
四、表达式
Windbg提供了两种表达式:汇编表达式和C++表达式(参考Windbg命令的语法规则系列)。两种表达式的操作符和操作数都略有区别。
默认是汇编表达式,求汇编表达式的值用?,求C++表达式的值用??。
汇编表达式里能用的操作符除了+、-、*、/这些算数运算符以外还有一些类似转型运算符,比如poi,有时候大家断到一个函数,第一参数是个字符串指针,想打印这个字符串怎么办?可以这样 dd esp+4,然后再从结果中da一次,有了poi,一行命令就可以做到,dd poi(esp+4)。
C++表达式就更加丰富了,几乎所有的C++表达式都可以用,包括.和->操作符,想让Windbg将表达式按C++方式解释,需要在表达式前面加@@c++()。
五、语句
都说了脚本要按照编程的思想来写,既然是编程,怎么能少得了流程控制语句呢?Windbg支持以下流程控制语句:
.if
.else
.elif
.for
.while
.break
.continue
.do
.printf 格式化输出,熟悉吧。
.block 语句块
$$ 注释,长得好奇怪
这里面,.block要单独说说,所谓语句块,其实就是用{}括起开的一堆语句,包括.if、.else后面的语句其实都是语句块,语句块内部的别名(还记得吗)在进入块的时候会被翻译,进入块以后,如果修改了别名的定义,那么在本块内的后续语句中是无效的(还记得别名是原样替换吗),所以,如果需要在后续语句中生效,需要把后面的语句放到一个单独的语句块里,也就是用{}把他们包含起来,但是Windbg又不能识别直接用{}包含起来的东西,于是就出现了.block,看到这里,请切记,如果需要别名被翻译,一定要把他放到语句块里。
六、函数(内建)
这里只讲两个内建函数$scmp和$sicmp都是字符串比较,一个区分大小写,一个不区分大小写。这两个函数有一个毛病,那就是参数只接受字符串字面量,就是说,你只能写$scmp(“123”,”123”),不能写$scmp(poi(esp+4),”123”),好了,有人急了,不能这样写,要这两个函数有什么用?不急,我们可以利用别名(这就是别名最有用的地方),还是接着刚才那个例子:
代码:
0:000> as /ma ${/v:test} 00010000 0:000> ? $scmp("${test}","123456") Evaluate expression: 0 = 00000000 0:000> ? $scmp("${test}","123457") Evaluate expression: -1 = ffffffff
这样就可以比较变量字符串了。
好了,有了以上知识,写一个windbg脚本应该就有基础了,剩下的就是要看大家知道多少“API”了,更详细的信息需要在Windbg的帮助里挖掘了。
最后贴一个完整的例子,利用脚Hook CreateFileW,这个例子虽然不长,但是都是精华啊,哈哈。
代码:
.dvalloc /b 0x79990000 30 ew 0x79990000 0xc033 ed 0x79990002 0x00001cc2 bp kernel32!CreateFileW " as /mu ${/v:filename} poi(esp+4); .block{ .if ($sicmp(\"${filename}\", \"c:\\1.txt\") == 0){ .echo \"open 1.txt\"; r eip=0x79990000 } } ad ${/v:filename}; gc; "
七、执行
先来一段简单的脚本
代码:
.echo “hello windbg”
这条命令会显示“hello windbg”这个字符串,把它保存到c:\1.txt文件,然后在Windbg的命令窗口里输入:
$><c:\1.txt 回车,
看看屏幕上出现了什么?
Windbg将1.txt里的内容当做一条Windbg的命令执行了。这就是一个简单的脚本。$><,根据这个例子,很容易看出它的作用是将脚本文件交给Windbg解释,由他完成了将一个txt变成Windbg命令的关键转换。其实你知道了这个,Windbg脚本就算入门了,我们可以把很多命令写在这个文件里,然后用$><装载执行。
下面来说下Windbg脚本加载执行的相关命令,总共有5个相关命令,$ < , $ > < , $$ < , $$ > < ,并 $$ >< 命令读取指定的脚本的内容文件中并使用作为其内容调试器命令输入 。如下:
$<Filename $><Filename $$< Filename $$>< Filename $$>a< Filename [arg1 arg2 arg3 ... ]
参数:
环境:
模式 |
用户模式下,内核模式 |
目标 |
实时、 崩溃转储 |
平台 |
全部 |
详细说明:
$$ < 并 $ < 令牌执行按原义找到脚本文件中的命令。 但是,对于 $ < 可以指定任何文件名,其中包括一个包含分号。 因为 $ < 允许以文件的文件名中使用分号作为不能连接 $ < 与其他调试程序命令,因为为命令分隔符和文件名称的一部分,不能使用分号。
$$ > < 并 $ > < 令牌执行按字面意思找到脚本文件中的命令这意味着它们打开脚本文件,用分号,替换所有回车符和执行单个命令块为生成的文本。 如同 $ < 已经讨论过, $ > < 变体允许文件的名称包含分号,这意味着不能串联 $ > < 与其他调试程序命令。
$$ > < 并 $ > < 令牌是很有用,如果运行的脚本中包含调试器命令程序。
除非您有包含分号的文件名,不需要使用两种 $ < 或 $ > < 。
$$ >< 令牌使调试器能够在将参数传递给脚本。 如果文件名包含空格,则必须用引号引起来。 如果提供的参数太多了,将忽略多余的参数。 如果未提供的参数太少,任何令牌的窗体 $ 源文件中 {$argn} 位置n大于提供的参数数量将保留在其文本的形式,并且将不替换为任何内容。 可以按照此命令使用分号和其他命令;存在分号终止参数列表。
当调试器执行的脚本文件时中, 显示的命令和相应的输出调试器命令窗口。 当达到脚本文件的末尾时,控制权返回给调试器。
下表总结了如何使用这些令牌。
令牌 | 允许包含分号的文件名 | 允许其他命令之间用分号分隔的串联 | 会将到单个命令块 | 允许脚本参数 |
---|---|---|---|---|
$< |
是 |
否 |
否 |
否 |
$>< |
是 |
否 |
是 |
否 |
$$< |
否 |
是 |
否 |
否 |
$$>< |
否 |
是 |
是 |
否 |
$$>a< |
否 |
是 |
是 |
是 |
$ < , $ > < , $$ < ,和 $$ > < 命令回显的脚本中包含的命令文件,并显示这些命令的输出。 $$ >< 命令不会将回显在脚本文件中,找到的命令,但只显示其输出。可以嵌套的脚本文件。 如果调试器遇到其中一个令牌中的脚本文件,执行将移至新的脚本文件,并完成新的脚本文件时,返回到前一个位置。 也可以调用脚本以递归方式。在 WinDbg 中,你可以粘贴调试器命令窗口中的其他命令文本。
原文:https://www.cnblogs.com/yilang/p/11413230.html