WinDBG 支持Script,这样用户可以通过编程来实现一些自动控制。本文介绍的就是一个读取 RTC (CMOS)的 Script。
先介绍一下如何使用,将 Script 文件放在 c:\asl\ 下面,文件名是 cmos.txt。在 WinDBG 停下来目标机之后输入 $><c:\asl\cmos.txt 即可运行【参考1】。 WinDBG端结果如下:
kd> $><c:\asl\cmos.txt
0 1 2 3 4 5 6 7 8 9 A B C D E F
===================================================
0| 8 0 47 0 16 0 2 1 12 20 26 2 0 80 0 0
1| 0 0 F0 0 E 80 2 FF FF 2F 0 0 0 0 0 4
2|FF FF FF FF FF 3F 0 0 0 0 0 0 0 0 8 EB
3|FF FF 20 0 0 7F 0 20 20 0 0 0 0 31 0 0
4| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6| 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7| 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
8|38 0 48 0 16 0 2 1 12 20 26 2 0 80 0 0
9| 0 0 F0 0 E 80 2 FF FF 2F 0 0 0 0 0 4
A|FF FF FF FF FF 3F 0 0 0 0 0 0 0 0 8 EB
B|FF FF 20 0 0 7F 0 20 20 0 0 0 0 31 0 0
C| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
D| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
E| 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
F| 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
在虚拟机中使用 RW_Everything 可以看到同样的结果:
具体的代码如下:
$$********************************************
$$* WinDBG Script from www.lab-z.com *
$$* *
$$* Read CMOS *
$$* 2020 DEC 1st *
$$********************************************
.printf " "
.for (r $t0=0; @$t0 < 10;r $t0=$t0+1) {.printf "%2X ",$t0}
.printf "\n"
.for (r $t0=0; @$t0 < 11;r $t0=$t0+1) {.printf "==="}
.printf "\n"
.for (r $t0=0; $t0 < 10;r $t0=$t0+1) {
.printf "%2X|",$t0
.for (r $t1=0; $t1 < 10;r $t1=$t1+1) {
r $t2=$t0*10+$t1
ob 70 $t2
.foreach /pS 1 (vv {!ib 71}) {r $t3=${vv}}
.printf "%2X ",$t3
}
.printf "\n"
}
简单介绍一下代码意思:
“$$” 表示注释,所以最开始几行只是用于标记
下面几行是用于输出一个表格头
“.for (r $t0=0; $t0 < 10;r $t0=$t0+1) ” 这是一个 for 循环,其中使用到了 $t0 这是 WinDBG 内置的虚拟寄存器,在 WinDBG 中有 t0-t19个
计算当前的 Index r $t2=$t0*10+$t1
代码中所有的数值都是十六进制,所以看到 10 意思是0x10, 表示 16(十进制)
ob 70 $t2 这是 outport 命令,将 $t2 值送到 0x70 Port 中
前面对 70 Port输出 Index, 接下来需要从 71 Port上读取。端口读取命令是 ib ,但是无法直接取得读到的值。因此这里使用 .foreach 来解析命令返回值。在这里,ib返回值是 00000070: XXXXXX 这种形式。因为空格的存在,解析结果会分为两次出现在后面的大括号中。/pS 1 的意思是忽略返回值中的第一个,使用这个参数之后我们只能收到 XXXXXX 这个结果,我们将其放入 $t3 中
.foreach /pS 1 (vv {!ib 71}) {r $t3=${vv}}
8.文件文件使用ASCII 格式,因此文件中最好不要出现中文
上面只是实现了CMOS 的读取,配合 WinDBG 的断电能够实现更多的功能,另外最新的 WinDBG Script 支持 JavaScript 有兴趣的朋友可以更深入的研究。
本文提到的 Script 文件下载:
参考:
- https://www.cnblogs.com/softfair/p/windbg-command-ii.html Windbg 脚本命令简介 二, Windbg script command
- https://blog.csdn.net/hgy413/article/details/9073157 50.windbg-.foreach循环输入(windbg script)
- https://www.cnblogs.com/awpatp/archive/2010/06/16/1758929.html 在WinDBG中使用foreach
- https://www.jianshu.com/p/56ff0bc43d3d Windbg调试笔记