第二站:分解BIOS
注意:本站点讨论的部分内容不详,还没了解透,定义为:不清昕,可能有错误的。
这里主要以Intel平台的BIOS文件讨论,辅助参考AMD平台的BIOS文件。要分解的BIOS文件选了当下较新的X38芯片组平台的ex38dq6.f2 这个BIOS文件,而BIOS的文件是ma79xds4.f4,这是AMD的最新的7系芯片组其中的790X芯片组平台。
好,下面开始进行分解ex38dq6.f2这个BIOS文件。
一、工具的使用
1、Ex38dq6.f2是Award Bios,有一个图形化的BIOS编辑软件awdbedit,可以很方便的将BIOS的组件分解出来。
2、通用的BIOS编辑软件cbrom,这里使用的是cbrom182版本。下面是使用cbrom182显示BIOS组件的清单,命令行下使用:Cbrom182 ex38dq6.f2 /D,结果如下(部分):
******** ex38dq6.f2 BIOS component ********
No. Item-Name Original-Size Compressed-Size Original-File-Name
================================================================================
0. System BIOS 20000h(128.00K)15478h(85.12K)ex38dq6.BIN
1. XGROUP CODE 0FC40h(63.06K)0B0ECh(44.23K)awardext.rom
2. ACPI table 04E16h(19.52K)0193Ch(6.31K)ACPITBL.BIN
3. EPA LOGO 0168Ch(5.64K)0030Dh(0.76K)AwardBmp.bmp
4. GROUP ROM[18] 031D0h(12.45K)0225Ah(8.59K)ggroup.bin
5. YGROUP ROM 0C180h(48.38K)066E4h(25.72K)awardeyt.rom
6. GROUP ROM[ 0] 08210h(32.52K)0303Dh(12.06K)_EN_CODE.BIN
7. PCI ROM[A] 10000h(64.00K)09DBEh(39.44K)ICH9RAID.BIN
8. PCI ROM 03600h(13.50K)02553h(9.33K)ICH8AHCI.BIN
9. PCI ROM[C] 07A00h(30.50K)04479h(17.12K)JMB59.BIN
10. MINIT 08220h(32.53K)0824Fh(32.58K)DDR2_MRC.X38
11. PCI ROM[D] 0C800h(50.00K)079FDh(30.50K)rtegrom.lom
12. LOGO1 ROM 00B64h(2.85K)00520h(1.28K)dbios.bmp
13. LOGO BitMap 4B30Ch(300.76K)07EEEh(31.73K)x48dq6.bmp
14. GV3 01EFDh(7.75K)00B66h(2.85K)PPMINIT.ROM
15. OEM0 CODE 028ABh(10.17K)01E1Bh(7.53K)SBF.BIN
(SP) NCPUCODE 1D000h(116.00K)1D000h(116.00K)NCPUCODE.BIN
Total compress code space = E5000h(916.00K)
Total compressed code size = 75C8Dh(471.14K)
Remain compress code space = 6F373h(444.86K)
清单: 2.1
整个ex38dq6.f2 文件1M大小,包含了16个组件,最后的NCPUCODE.BIN组件,是虚拟的或者说物理上不存在,用awdbedit软件分解不包括这个组件,实际上只有15个真实组件,这些组件全都是经过压缩的。
第2列是组件的名字,第3列是组件真实的大小,第4列是组件中部分压缩的数据在ex38dq6.f2文件中的大小,最后1列是分解后组件存在磁盘上的物理文件名,以ex38dq6.bin为例,这个组件真实的大小为128K,其中85.12K是压缩部分,其余的以纯代码形式分布在FE000 ~ FFFFF区域,典型地:第一条far jmp就分布在这个区域。
ex38dq6.BIN 是BIOS的主体组件。
awardext.rom、awardeyt.rom 是BIOS的扩展部分。
ACPITBL.BIN 是供ACPI所使用的低级部件,可供操作系统使用。
PCI ROM 是 PCI 设备的一些组件。
还有一些显示的BMP图片
其余组件不详,有待了解
3、使用cbrom182来分解组件的方法:
Cbrom182 ex38dq6.f2 /XGROUP extract 分解出 awardext.rom
Cbrom182 ex38dq6.f2 /ACPI extract 分解出 ACPITBL.BIN
如此类推,可以逐步分解出各个组件,但是,SYSTEM BIOS组件,也即是 ex38dq6.bin 这个组件,我怎么试也没分解出来,所以用以下推荐的方法分解。
4、推荐分解BIOS组件的方法
使用图形化的BIOS编辑软件awdbedit可以很方便简单分解全部的组件。运行awdbedit软件,打开ex38dq6.f2,忽略掉一些警告信息,进入后,选择 [Actions] –> [Extract All] 就可以分解出全部的组件。
二、BIOS组件位置分析
1、ex38dq6.f2文件共1M大小,除了包含各个BIOS组件外,还充斥着大量的“填充码”,这些“填充码”是FF字节以及00字节,主要用来分隔各个组件,以及填充文件。
2、压缩组件是以LZH形式压缩,每个压缩组件以“-lh5-”开头,十六进制码形式为 2D 6C 68 35 2D,这是压缩组件的戳记,因此,在BIOS文件中只要寻找到这个戳记就可以区分开每个组件。
seg000:0000 24 F7
2D 6C 68 35 2D 50 54 01 00 00 00 02 00 00 $?
lh5-PT.....
seg000:0010 00 00 50 20 01 0B 65 78 33 38 64 71 36 2E 42 49 ..P ex38dq6.BI
seg000:0020 4E 24 D3 20 00 00 2D 20 8F 77 BF 74 89 29 BB AA N$?..- 弚縯?华
seg000:0030 7F 33 33 37 37 4D 07 73 55 45 55 78 35 91 D5 66 3377MsUEUx5懻f
seg000:0040 85 B7 54 49 34 52 21 0E 9B A5 10 91 11 BC 1D 28 叿TI4R!洢??(
seg000:0050 B1 2A 66 A0 DD 5B BB BA 9C 0D 51 0C C5 17 AA F2 ?f犦[缓?Q?
seg000:0060 FB DD BC AC AD 34 F1 55 DB 53 CC 03 DD A6 86 30 棘?馯跾?荭?
seg000:0070 2A CF 42 B5 DC 53 52 22 43 F0 75 84 66 40 00 77 *螧弟SR"C饀刦@.w
seg000:0080 7F FE 66 83 37 77 79 E7 9E BC F6 FF BD 7A FD EE ?wy鐬荐絲
seg000:0090 BE FF 04 3E F7 76 B2 49 1B 6D C9 D1 4B 2D 15 A0 ?>鱲睮m裳K-?
seg000:00A0 AE 84 C4 52 58 5F FF CF ED 24 AC C1 42 64 1F F0 畡腞X_享$Bd?
seg000:00B0 BF 45 55 49 0A A2 CE C2 97 58 58 AF 0E 62 22 84 縀UI⑽聴XX?b"?
seg000:00C0 7E CF 94 2F E7 24 F7 E3 CE 0F 55 B8 E0 94 E0 D5 ~蠑/?縻?U膏斷?
seg000:00D0 D1 BE E0 9E FB 99 C1 F8 3B 86 C5 B8 86 6C 6B 85 丫酁麢柳;喤竼lk?
seg000:00E0 88 B3 F7 05 5A F0 BA CB C3 2E 5F 89 F8 AF ED B2 埑?Z鸷嗣._夬?
seg000:00F0 91 9C 42 50 B7 CA 60 34 B6 4A 55 8C 65 D3 8E EA 憸BP肥`4禞U宔訋?
seg000:0100 6A 5D E1 4F 7E DB 97 7F 4C A0 AE 9E 15 B7 8E 86 j]酧~蹢L牣?穾?
清单 2.2
3、以ex38dq6.f2为例,用十六制编辑软打开,从00000000开始到000FFFFF共1M的大小,每个压缩组件在ex38dq6.f2的物理位置如下:
0. 0 ~ 15477: System Bios (ex38dq6.bin)
1.15478 ~ 20563: XGROUP CODE(awardext.rom)
2.20564 ~ 21E9F: ACPI table(ACPITBL.BIN)
3. 21EA0 ~ 221AC: EPA LOGO(awardBmp.bmp)
4.221AD ~ 24406: GROUP ROM[18](ggroup.bin)
5.24407 ~ 2AAEA: YGROUP ROM(awardeyt.rom)
6.2AAEB ~ 2DB27: GROUP ROM[0](_EN_CODE.BIN)
7.2DB28 ~ 378E5: PCI ROM[A](ICH9RAID.BIN)
8.378E6 ~ 39E38: PCI ROM(ICH8AHCI.BIN)
9.10. 39E39 ~ 46500: PCI ROM[C]、MINIT(JMB59.BIN、DDR2_MRC.X38)
11.46501 ~ 4DEFD: PCI ROM[D](rtegrom.lom)
12.4DEFE ~ 4E41D: LOGO1 ROM(dbios.bmp)
13.4E41E ~ 5630B: LOGO BIGMAP(X48DQ6.bmp)
14.5630C ~ 56E71: GV3(PPMINIT.ROM)
15.56872 ~ 58C8C: OME0 CODE(SBF.BIN)
以上是各个压缩组件在BIOS文件中的物理位置,从58C8D ~ FDFFF 这段区间中混合着一些数据,还在大量充斥着“填充码”,没有什么实际的意义,或者说:没看到什么实际意义。
从 FE000 ~ FFFFF 这段区间中,包含一些非压缩的纯二进制代码,其中有重要的BOOTBLOCK,以及一些初始化代码。也包含着大量的“填充码”。这些纯代码分散分布在这个区间,纯代码与部分压缩组件的混合在一起,几乎很难区分哪些是纯代码,哪些是压缩数据,指令:jmp far ptr 0F000:0E05B 与其它数据混合在一起,如下清单2.2所示:
seg000:FFB25 db 0C3h ; ?
seg000:FFB26 db 66h ; f
seg000:FFB27 db 0EFh ; ?
seg000:FFB28 db 8Bh ; ?
seg000:FFB29 db 0D7h ; ?
seg000:FFB2A db 8Eh ; ?
seg000:FFB2B db 0D9h ; ?
seg000:FFB2C ; ---------------------------------------------------------------------------
seg000:FFB2C jmp far ptr 0F000h:0E05Bh
seg000:FFB2C ; ---------------------------------------------------------------------------
seg000:FFB31 db 0
seg000:FFB32 db 0
seg000:FFB33 db 0
seg000:FFB34 db 0
seg000:FFB35 db 0
seg000:FFB36 db 0
seg000:FFB37 db 0
seg000:FFB38 db 0
seg000:FFB39 db 0
清单 2.3
4、BIOS的主体文件 ex38dq6.BIN的大小是128K,正好映射到系统地址空间的FFFE_0000 ~ FFFF_FFFF(E_0000 ~ F_FFFF)共128K的空间上。
当分解出BIOS主体组件ex38dq6.BIN后,这条指令就在F000:FFF0 的位置上,如下清单2.3所示:
seg000:FFFEC db 80h ;
seg000:FFFED db 1
seg000:FFFEE db 0Ch
seg000:FFFEF db 89h ; ?
seg000:FFFF0 ; ---------------------------------------------------------------------------
seg000:FFFF0 jmp far ptr 0F000h:0E05Bh
seg000:FFFF0 ; ---------------------------------------------------------------------------
seg000:FFFF5 db 30h ; 0
seg000:FFFF6 db 32h ; 2
seg000:FFFF7 db 2Fh ; /
seg000:FFFF8 db 32h ; 2
seg000:FFFF9 db 37h ; 7
seg000:FFFFA db 2Fh ; /
seg000:FFFFB db 30h ; 0
seg000:FFFFC db 38h ; 8
seg000:FFFFD &nb