现在的位置: 首页 > 综合 > 正文

SMBIOS debug

2013年02月06日 ⁄ 综合 ⁄ 共 3555字 ⁄ 字号 评论关闭

 
SMBIOS debug 

SMBIOS 信息是由 Entry Point Structure (EPS) 表来定位的, 所以我们首先要找到 EPS. EPS 的位置规定在 F000:0000 - F000:FFFF 之间 (20 位地址格式), 而其特征是:

A. 起始 4 个字母为 '_SM_'(引号中的部分), 注意大小写
B. 起始地址偏移 10H (16 进制) 的位置开始的 5 个字母为 '_DMI_'

根据这个, 我们就可以找到 EPS 了:

* 点击 "开始" -> "运行", 输入 "cmd", 点 "确定"
* 在弹出的窗口中输入 "debug", 回车, 这样就进入了 debug 环境, 它的命令提示符为 -, 以后出现在 - 后面的内容都为将要输入的命令
* -s f000:0 ffff '_SM_'
 以我的电脑为例, 响应可能是下面这样的, 
 -s f000:0 ffff '_SM_'
 F000:6C00
 这个地址因人而异. 也有可能你的电脑会显示多个查找结果, 不妨先随意选择一个进行下面的操作
 -d F000:6C00
 可能的响应:
 -d F000:6C00
 F000:6C00 5F 53 4D 5F 16 1F 02 1F-4B 01 00 00 00 00 00 00 _SM_....K.......
 F000:6C10 5F 44 4D 49 5F 3D 98 09-10 30 0E 00 3C 00 00 00 _DMI_=...0..<...
 F000:6C20 52 53 44 20 50 54 52 20-DE 4E 45 43 20 20 20 00 RSD PTR .NEC .
 F000:6C30 34 95 F7 0D 00 00 00 00-00 00 00 00 00 00 00 00 4...............
 F000:6C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
 F000:6C50 24 46 53 58 56 0C F8 00-B1 00 E0 00 00 00 00 00 $FSXV...........
 F000:6C60 5F 33 32 5F 20 D7 0F 00-00 01 D6 00 00 00 00 00 _32_ ...........
 F000:6C70 24 50 44 4D 01 0B 1A 5D-88 00 F0 00 00 00 00 00 $PDM...]........
 注意到了吗, _SM_, 还有 10H 偏移的 _DMI_, 如果你在上一步中有多个结果, 那么只要某个结果通过 d 命令查看的结果符合这两个特征, 我们就可以用它来继续下面的操作
 至这一步, EPS 已经找到了

了, 有了 EPS 表, 我们就可以找到 SMBIOS 信息的位置. 具体来说, 就是 EPS 的偏移 18H 开始的 4 字节, 在我的例子
中, 就是 10 30 0E 00. 那么如何通过它来得到 SMBIOS 的地址呢? 这 4 个地址是 SMBIOS 的 32 位地址, 显然写
成 "高位 低位" 的格式就是 000E 3010, 转换成 20 位格式就把高位左移 12位, 变成 E000:3010 的形式, 这样

* -d E000:3010
 可能的响应:
 -d e000:3010
 E000:3010 00 14 00 00 01 02 F5 E4-03 07 90 DF 99 7C 00 00 .............|..
 E000:3020 00 00 05 03 4E 45 43 20-20 20 20 20 00 4E 4F 54 ....NEC .NOT
 E000:3030 45 20 42 49 4F 53 20 56-65 72 73 69 6F 6E 20 2F E BIOS Version /
 E000:3040 33 36 39 41 30 36 30 30-20 00 30 39 2F 31 30 2F 369A0600 .09/10/
 E000:3050 32 30 30 33 00 00 01 19-01 00 01 02 03 04 8B B0 2003............
 E000:3060 DE 65 92 46 40 EB 86 FE-56 28 BD 80 79 13 06 4E .e.F@...V(..y..N
 E000:3070 45 43 20 43 6F 6D 70 75-74 65 72 73 20 49 6E 74 EC Computers Int
 E000:3080 65 72 6E 61 74 69 6F 6E-61 6C 00 50 43 2D 43 56 ernational.PC-CV
 如果嫌显示的行数太少, 可以
 -d
 可能的响应:
 E000:3090 32 32 53 4E 58 55 4C 34-47 49 00 20 20 20 20 20 22SNXUL4GI.
 E000:30A0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
 E000:30B0 20 20 20 20 20 20 20 20-20 20 20 00 33 5A 30 30 .3Z00
 E000:30C0 39 39 35 31 41 00 00 02-08 02 00 01 02 03 04 4E 9951A..........N
 E000:30D0 45 43 20 20 20 20 20 20-20 20 20 20 20 20 20 20 EC
 E000:30E0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 00 .
 E000:30F0 4C 45 34 4E 2D 31 00 30-2E 36 00 39 43 33 42 31 LE4N-1.0.6.9C3B1
 E000:3100 38 37 31 39 00 00 03 11-03 00 01 0A 02 03 04 02 8719............

 至此, SMBIOS 的位置已经确定了, 可以进一步获得相关信息了
在上一步操作中, 我们最后获得了一大堆乱七八糟的信息, 不过这些信息中就隐藏着我们这次演示中所要寻找的信息. 在下面的说明, 请仔细对照我提到的偏移和偏移处的数值

* 首
先, 第一个字节 (零偏移处) 是 00, 根据规定, 这说明从这里开始的信息为 TYPE 0 信息, 也即 BIOS 的信息区. 第二个字
节 (偏移 01H) 是 14, 说明 TYPE 0 区域的基本大小是 14H. 根据规定, TYPE 0 的偏移 05H 处即为主版的版本信息
的字符串编号, 一般为 02.
* 刚才已经从偏移 01H 处得到 TYPE 0 区的基本大小为 14H, 那么下面请看偏
移 14H 处, 是 4E, 右面对应的 ASCII 字符是 N. 这里开始, 即为 TYPE 0 的字符串区, 它们是不包括在 TYPE 的大
小计算中的. 字符串不定长, 由 00H 做为字符串的结束标志, 熟悉 C/C++ 的人应该对这一标志符比较亲切吧. 从第一个字符串依次编号
为 01, 02... 刚才提到的主版信息为 02 即是说这里的第二个字符串, 也即
是 "NOTE BIOS Version / 369A0600 ", 这样我们的第一个目标, 主版版本就找到了
* 字符串区的结束
用 00 来标志, 又根据字符串的结束符为 00, 所以找到 00 00, 从 00 00 的下一个地址开始就是下一个信息区了, 这个例子
中, 就是 3056 处, 内容是 01. 做为一个区域的第一个字节, 它标志着此 TYPE 的类型, 这里就是 TYPE 1, 也
即 System Information.
* 根据与 TYPE 0 类似的方法, 我们从 TYPE 1 的偏移 01H 处得到 TYPE 1 的大小 为 19H, 而手册中说明, TYPE 1 的 偏移 04H 处即为 Manufacturer 信息的字符串编号, 这里即为 01
* 打到 TYPE 1 的偏移 19H 处, 即为 TYPE 1 的字符串区的开始, 由于我们要找的信息编号为 01, 所以从这里开始的信息 "NEC Computers International" 即为厂商的信息

抱歉!评论已关闭.