【我所认知的BIOS】->反汇编BIOS之准备工作
LightSeed
3/11/2010
上海
在我们进入反汇编的旅途之前,我想我应该把一些大家应该准备的东西都列一下,只有有了这样的针对性准备嘛,我想我写的文章才更能引起大家的共鸣。我用的主板是915GS+ICH6+Winbond83627HF的主板。Bios也就是用awardflash.exe读出来的bin文件。
关于PCI的操作,在
http://blog.csdn.net/lightseed/archive/2009/05/27/4219244.aspx
这个章节中有对PCI bus操作的示例。至于PCI bus的总线操作嘛,我想目前我们还可以不用了解地那么深入。
为什么要专门加上这个呢?因为在之前的文章中,有人提问问到过一个问题,说当板子刚刚上电的时候,CPU不是说从FFFF_FFF0H处去读指令么?怎么又和BIOS的F000段扯上关系了哦?这个问题可以用一种比较好理解的通俗的方法来看。把北桥看做一个开关,在上电的时候它会忽略FFFF_FFF0H这个地址中的高12个bit。就是FFFE_0000H-FFFF_FFFFH其实对应的就是000E_0000H-000F_FFFFH这面的地址访问。这样理解虽然不太正确,但是比较容易懂。
比如说一些比较古老的IO port在后续的BIOS中会比较多的操作,他们应该大多都能够在ICH6的datasheet里面找到。比如说,70H,71H,61H,92H,CF9H等等。如果您不知道的话,到是可以google一下。或者留言也行,(原本以为这里比较简单,所以就没列出来。)
【70H】的详细说明在ICH6中的10.7.2 NMI_EN—NMI Enable (and Real Time Clock Index)
【61H】的详细说明在ICH6中的10.7.1 NMI_SC—NMI Status and Control Register
【92H】的详细说明在ICH6中的10.7.3 PORT92—Fast A20 and Init Register
上面只是列了一个简单的列表,详细地您自己去看。
IDA Freeware Version 4.3它是用来反汇编的利器,功能相当强大,它也是我们反汇编过程中用的最多的工具。
CBROM.EXE任何一个版本都可以,是用来查看AWARD bios的模块结构的。
MODBIN6.EXE还是比较高的比较好。主要是用来解压缩systembios这个模块的。(当然用AwardEditor也可以做到。)
Ultraedit.EXE能够查看二进制文件就OK了。因为在BIOS的执行过程中,有时候会查看一些特殊的标志符号(ASCII的),这样就可以很方便地找到偏移,方便进一步反汇编。
当然一个平台的信息很重要了,那么在BIOS run的过程中,显然配置的信息需要不时地查看各个寄存器的只以及其对应的function。915的chipset的datasheet可以从intel的官网上下到。地址如下:
http://www.intel.com/Assets/PDF/datasheet/305264.pdf
ICH6
http://www.intel.com/assets/pdf/datasheet/301473.pdf
当然这些都是datasheet,还有一些资料也应该是必须的,intel programming guide。
http://www.intel.com/products/processor/manuals/
在
http://blog.csdn.net/lightseed/archive/2009/10/27/4735101.aspx
这个章节中,和大家详细探讨了CPU第一条指令的地址,BIOS其实也就是从FFFF_FFF0H这个地方去取指令的。(当然BIOS并不是完全的纯二进制代码,有一部分是压缩过的。其中没有压缩过的就是现在说的bootblock这部分了。这部分代码可以直接执行。而压缩过的bios会在bootblock跑完了以后被全部解压缩出来,继续跑。解压的过程在
http://blog.csdn.net/lightseed/archive/2009/06/03/4239127.aspx
有比较多的论述,当时我只是和大家从算法和架构上与大家进行了探讨,之后我会在BIOS代码中让大家看看加压缩的真实面目。)
BIOS的运行,正如上面说的一样,主要分成了三个阶段。
第一个阶段是bootblock阶段,这个阶段比较特殊,因为memory还不使用。所以很特殊,在调用函数的时候就不能用平常的call来做了。会用到一个叫做ROM_CALL的宏来做。
第二个阶段和第三个阶段合起来叫做POST(Power-On Self Test)的阶段。其实就是bootblock阶段后的一个阶段都叫做POST。
从BIOS的角度讲,POST又被分为了第二阶段E0POST和第三阶段E8POST。(这个比较专业了哈,只是给大家了解一下,业内人士飘过就是。)
主要在bootblock的时候ROM_CALL的这个宏要专门提出来:
ROM_CALL MACRO RTN_NAME
LOCAL RTN_ADD
mov sp,offset DGROUP:RTN_ADD
jmp RTN_NAME
RTN_ADD: dw DGROUP:$+2
ENDM
这个宏主要还是利用了retn的具体操作来设计的。我说一下,宏把sp指向了JMP指令前面的地址(RTN_ADD),而这个地址(RTN_ADD)里面存的offset恰好又是RTN_ADD+2。那么在执行retn的时候,就会把ss:sp指向的这个word赋值给IP,这样就完成了一个retn的动作,继续回到之前的程序流程中去。在反汇编的时候,这个要务必记清楚。
;--------------------------------------以下这部分主要参考了《Pinczakko's Guide to Award BIOS Reverse Engineering》中的相关章节,大致是他的翻译版,本人觉得他写的挺好了的,所以就直接引用了。在这里特别注明一下。这位前辈的文章可是相当的精髓哦,也很深入值得向大家推荐。(其实他也就和我一般大,真的应该好好向他学习。)
在装好IDA PRO Freeware 4.3后双击运行如图1
图1
点击OK即可,下一个步骤图如图2
图2
当你是第一次反汇编的时候,那么你就选中NEW,当你的电脑上已经有project文件的话,那么就可以直接选择相应的文件,点‘previous’即可。或者你也想自己加载bin文件也可以,点‘GO’即可。
会出现图3的界面
图3
加载bin文件后,会出现如下的界面图4
图4
在这个对话框中,选择P4即可,(在我的板子上是用P4的CPU,我想应该选其他也没有关系,您可以试试。)只需要改这里,其他的都默认,然后‘OK’
然后会马上弹出个对话框如图5
图5
由于一开始BIOS是运行在16bit上的real mode下的。(在programming guide里面有详细描述。也可以看看前面的第一条指令那篇文章,都有详细描述。)所以点 ‘No’即可。
然后会出现图6的对话框。
图6
然后就是真正的反汇编的对话框了。如图7
图7
在图7中,有三个红色的框框,从上到下,第一个是指机器码的地址,第二是只二进制反汇编的结果,第三个是说消息窗口就在下面了。
;-----------------------------------------
有了以上一些初步的知识了解后,我想我们就可以进入反汇编BIOS的旅途了。