【我所认知的BIOS】->反汇编BIOS之准备工作

本文详细介绍反汇编BIOS的准备工作,包括PCIbus操作、北桥地址解码、LegacyIO理解、反汇编工具及资料等,并介绍了反汇编BIOS的阶段划分及其关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【我所认知的BIOS->反汇编BIOS之准备工作

LightSeed

3/11/2010

上海

在我们进入反汇编的旅途之前,我想我应该把一些大家应该准备的东西都列一下,只有有了这样的针对性准备嘛,我想我写的文章才更能引起大家的共鸣。我用的主板是915GS+ICH6+Winbond83627HF的主板。Bios也就是用awardflash.exe读出来的bin文件。

1PCI bus的简单理解与操作

关于PCI的操作,在

http://blog.youkuaiyun.com/lightseed/archive/2009/05/27/4219244.aspx

这个章节中有对PCI bus操作的示例。至于PCI bus的总线操作嘛,我想目前我们还可以不用了解地那么深入。

2、北桥关于CPU地址的decode

为什么要专门加上这个呢?因为在之前的文章中,有人提问问到过一个问题,说当板子刚刚上电的时候,CPU不是说从FFFF_FFF0H处去读指令么?怎么又和BIOSF000段扯上关系了哦?这个问题可以用一种比较好理解的通俗的方法来看。把北桥看做一个开关,在上电的时候它会忽略FFFF_FFF0H这个地址中的高12bit。就是FFFE_0000H-FFFF_FFFFH其实对应的就是000E_0000H-000F_FFFFH这面的地址访问。这样理解虽然不太正确,但是比较容易懂。

3、一些关于Legacy IO的了解

比如说一些比较古老的IO port在后续的BIOS中会比较多的操作,他们应该大多都能够在ICH6datasheet里面找到。比如说,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

上面只是列了一个简单的列表,详细地您自己去看。

4、反汇编的过程中会用到的工具

IDA Freeware Version 4.3它是用来反汇编的利器,功能相当强大,它也是我们反汇编过程中用的最多的工具。

CBROM.EXE任何一个版本都可以,是用来查看AWARD bios的模块结构的。

MODBIN6.EXE还是比较高的比较好。主要是用来解压缩systembios这个模块的。(当然用AwardEditor也可以做到。)

Ultraedit.EXE能够查看二进制文件就OK了。因为在BIOS的执行过程中,有时候会查看一些特殊的标志符号(ASCII的),这样就可以很方便地找到偏移,方便进一步反汇编。

5、反汇编的过程中会看的资料

当然一个平台的信息很重要了,那么在BIOS run的过程中,显然配置的信息需要不时地查看各个寄存器的只以及其对应的function915chipsetdatasheet可以从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/

6、反汇编的第一步应该是什么?

http://blog.youkuaiyun.com/lightseed/archive/2009/10/27/4735101.aspx

这个章节中,和大家详细探讨了CPU第一条指令的地址,BIOS其实也就是从FFFF_FFF0H这个地方去取指令的。(当然BIOS并不是完全的纯二进制代码,有一部分是压缩过的。其中没有压缩过的就是现在说的bootblock这部分了。这部分代码可以直接执行。而压缩过的bios会在bootblock跑完了以后被全部解压缩出来,继续跑。解压的过程在

http://blog.youkuaiyun.com/lightseed/archive/2009/06/03/4239127.aspx

有比较多的论述,当时我只是和大家从算法和架构上与大家进行了探讨,之后我会在BIOS代码中让大家看看加压缩的真实面目。)

7、一个不得不提醒的事

BIOS的运行,正如上面说的一样,主要分成了三个阶段。

第一个阶段是bootblock阶段,这个阶段比较特殊,因为memory还不使用。所以很特殊,在调用函数的时候就不能用平常的call来做了。会用到一个叫做ROM_CALL的宏来做。

第二个阶段和第三个阶段合起来叫做POSTPower-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的时候,就会把sssp指向的这个word赋值给IP,这样就完成了一个retn的动作,继续回到之前的程序流程中去。在反汇编的时候,这个要务必记清楚。

8IDA pro的用法介绍

--------------------------------------以下这部分主要参考了《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即可,(在我的板子上是用P4CPU,我想应该选其他也没有关系,您可以试试。)只需要改这里,其他的都默认,然后‘OK

然后会马上弹出个对话框如图5

5

由于一开始BIOS是运行在16bit上的real mode下的。(在programming guide里面有详细描述。也可以看看前面的第一条指令那篇文章,都有详细描述。)所以点 ‘No’即可。

然后会出现图6的对话框。

6

然后就是真正的反汇编的对话框了。如图7

7

在图7中,有三个红色的框框,从上到下,第一个是指机器码的地址,第二是只二进制反汇编的结果,第三个是说消息窗口就在下面了。

-----------------------------------------

有了以上一些初步的知识了解后,我想我们就可以进入反汇编BIOS的旅途了。

反汇编Linux/Windows OS运行的32位/64位程序/动态库文件,CPU类型:ARM PowerPC MIPS X86 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有CORE文件解调用栈、文本比较等功能。V2.0.3相对上一版本,完善ARM64、X8664、PPC64反汇编、ko反汇编,完善反汇编文本文件比较、IQ数据解析,修复小BUG;V2.0.2相对上一版本,完善ARM64、X8664反汇编、ARM64位core文件调用栈,完善文本文件比较、增加高亮、查找功能,修复小BUG;V2.0.0相对上一版本,完善ARM64反汇编、ARM64位core文件调用栈,完善C++符号名字解析,支持工具运行在英文版OS;V1.26.01相对上一版本,增加ARM64反汇编、64位core文件解析;V1.26.00相对上一版本,增强EXE反汇编,增加dbx老邮件解析、二维码功能;V1.25.07相对上一版本,增加二进制反汇编、IQ数据解析功能,完善MIPS反汇编,修复小BUG;V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86反汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令反汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86反汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令反汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序反汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家反馈相关软件使用过程中的问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值