WinDBG 读取 RTC 的 Script

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 可以看到同样的结果:

RW_EveryThing 读取 CMOS

具体的代码如下:

$$********************************************
$$* 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 文件下载:

参考:

  1. https://www.cnblogs.com/softfair/p/windbg-command-ii.html Windbg  脚本命令简介 二, Windbg  script command
  2. https://blog.csdn.net/hgy413/article/details/9073157  50.windbg-.foreach循环输入(windbg script)
  3. https://www.cnblogs.com/awpatp/archive/2010/06/16/1758929.html 在WinDBG中使用foreach
  4. https://www.jianshu.com/p/56ff0bc43d3d Windbg调试笔记

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注