|
|
|
易祝兵 2007-12-10
# n9 }. l2 r5 e8 u( E/ H0 k万事开头难,其实真的有难或易么?不扯了,既然谈BIOS,就从第BIOS第一条指令开始吧。1 [% A. V0 l. a8 B% t+ Z
不过事先准备一下:
8 D0 {- R, t5 E1、你一定要能看懂汇编语言,如果不会,请直接关闭此话题。
1 d" y& x% P/ ~4 L. M2、debug32.exe/UltraEdit/IDA 当然,你用IDA那就更好,不过我不可能教你如何用IDA,我先用Debug/debug32的方法先进入话题。IDA Free版本你可以在本站搜索下载到。+ b7 Q# j; _, J: |0 I7 K0 t
3、BIOS ROM文件,你可以Download自己主板或笔记本BIOS ROM回来(这是一定可以download的,也方便你找相应的DataSheet和具体Debug动作)
3 |8 v4 F, } g! u7 N4、几分钟看文章的时间,会的直接关闭此话题。
% d% n: F3 s w d( e3 i( v" q6 s
; h% k b" x+ o+ ?开始吧,启动你的操作系统用UltraEdit打开你的BIOS ROM文件,找你感兴趣的字串如AMI,Insyde,Phoenix等,看我找到的如下图(这一定是Phoenix的BIOS了):
2 I% N" C+ R$ b1 B# m) M. G2 X; S
2 r1 S( T) S* c
/ L, T' r) Y4 Q然后看文件最后头(也就是BIOS ROM mapping 到4GB的最高端部分),因为刷进BIOS ROM CHIP之后,计算机第一条指令会指向FFFFFFF0h的4G最高端,CS=F000h,EIP=FFF0h,第一条指令为兼容性,现IA32 CPU CS实际为0FFFF000h,当软件执行一个Far jump或一个Far call之后,CS才会跳变到正常实模式。& O0 p1 a6 E& ^4 i
6 @- `' S2 j* S! _0 m. L+ r x: Y3 |CPU会从地址FFFFFFF0h取第一条指令,平台的地址解码器通过设定会指向相应的BIOS ROM CHIP,然后文件最后头的一排,就是指一条指令了。(注意Phoenix现阶段如用Phoenix刷BIOS工具刷的话,所用的ROM会比正常ROM多2K,也是加在文件最后头,所以要去掉那部分内容,文件大小按64KB、32KB、16KB(因那段才2KB,以后未知)...等取整即可,9 w D5 z+ [$ V6 G
; e* V# ?- h6 b3 R' u5 {6 [
我们再运行DEBUG32把指一条指令反汇编,如下图(这是一个512K的BIOS):
( Z$ t f. P! f) y" n( l
9 X1 ^+ ^4 q5 L# d+ h d2 e2 _, j) [
+ f- O) k2 A9 X5 `& e/ m此BIOS的第一条指令是一个近跳转。本例子的文件长度是7ffff,那么我这样计算,因开机CS=F000段(注意实际如上说明),切出文件最大地址的64K做为此段所,这个段的第一条指令地址是F000:FFF0h,对应文件地址是7fff0,指令是jmp到 B66Bh,就是可算出就是跳转在文件的 7B66Bh的位置,注:有很多BIOS讲E05Bh的位置,这是AT BIOS的痕迹,AMI BIOS可能第一条指令就是这个,但Phoenix和Insyde BIOS,这个位置会留给跳转到(Phoenix)Boot block(简称:BB)或Insyde EFI SEC代码位置,如Phoenix BB执行完,再跳转到E05Bh,也就是AT BIOS RESET,我们系统启动后,大家可以看内存的F000:FFF0,反汇编一般都会是Far jmp F000:E05Bh,因为BIOS启动完啦,第一条指令的位置会由BIOS做AT BIOS兼容性处理掉(处不处理看BIOS的)。
# q& Q6 s/ v3 Z% f6 I Q% u) u2 z& J, t3 o. i3 v- \
好的,我再转到文件的7B66Bh的位置,如下图:, q @0 u s2 A: Z) [. b
# w' h# G0 J& u( @: Y
+ L9 ], g. K: R7 d代码意思是比较实模式的F000:FFF0h是否是E9h,如果不相等则跳转到F000:E05Bh,如果相等则经过几次其他的判断和跳转,最后到B5F6h,实际上也是跳到B5F6h,其它几个判断都会跳回来,限于啰嗦,不贴其它代码。不过现在,问题出来了,假如你也按我的做了,相信你一定输16进制代码输得眼都花了。启用IDA工具吧,如果不启用工具的话照旧,你用DEBUG或DEBUG32处理。IDA如何使用?自己摸索,我就不大费口舌了。见下图(是不是觉得清爽多了?)& W& R: |. d# Q! J: {: u( R1 p1 c
* P j% M" f+ z" s- ~2 @3 M& h" A
! p6 W2 D0 J0 L) w7 F# I( P我们用IDA追到F000:B5F6的位置如下图:
, ^! w2 C$ _0 o
, a0 ?* B; i* R
; x, O+ O8 v- }' x3 i( m上图中的代码做了点chip的初始化(看第一张图的信息是VIA的Chipset,具体要见DataSheet)和SuperIO的初始化(说不定也是EC初始化)。
- R$ M- H& O% v$ F+ M然后跳转到F000:B68Ah,B68Ah的代码如下图:
$ b3 m D2 t* P6 [
8 `% x6 r- A% b( N- ^; q( B& V1 z" K$ g; y1 k& v* s+ h2 ]4 e
上图中的代码大致意思是在F000:BDECh处放置了一张Table,其中有一码(16bits)是向378h端口输出,另两个参数(double 16bits)是两个Function,跳进去执行,具体这张Table见BDECh的位置:
$ Z& {) l* g5 J5 r$ T4 ]2 d
; H- L7 j, X9 \, @) n9 y3 ?# |
5 n1 |- |4 S" ?$ {& f) V/ V, K) J
你可以发现一大串Function Task....我是比较懒的人,你们慢慢看...这应该是Phoenix BB的一张表,它还会跳转到BIOS Reset位置的,要慢慢找... ` c" S9 r+ q3 a+ i# W
' C% N, o, ^* f6 L- K) P此文告一段落。 |
|