关于BIOS效验和


/*
开始在看AwdbEdit是发现InternalBIOS CheckSum和其后的一个字节是两个关联的数值

即其后的字节(也就是DecompressBlock_Align_4KB的最后一个字节)是
InternalBIOS CheckSum的值加上一个固定值
(InternalBIOS CheckSum,AwdbEdit就是这样计算的,在Award BIOS 6.00PG中才会检验/*AwdbEdit*/???
但是在2Mb Award BIOS Src中并没有找到相关的代码,可能是我没找到,但是Award BIOS Reverse Engine中对BIOS的反汇编
代码中的确证明有这样的代码...confusing)

但是用AwdbEdit修改的BIOS不能正常运行
刷新后机器在启动时显示BIOS 效验和错误
将其与cbrom215修改的BIOS镜像作2进制比较时发现DecompressBlock_Align_4KB的最后一个字节不一致

估计就是这里计算有问题
既然awdbedit不能正常操作
那么假设最后一个字节(暂时称为加压缩模块效验和DecompressCRC,见后面。。。)与前一个字节有数值上的关联
及它们的差值固定
在修改时先记录DecompressCRC与BIOS_CRC的差值
计算BIOS_CRC后,DecompressCRC直接用BIOS_CRC加上前面计算的差值
但是这样有时候正确,有时候却与cbrom215不一致...
看来这样还是有问题

看了2Mb_AwardBIOS Src后,发现BIOS在INIT过程中会计算DecompressBlock的效验和
于是猜测计算时先计算BIOS_CRC,然后单独计算DecompressBlock的效验和写入最后一个字节
但是IDA反汇编的cbrom215好像不是这样
见下面的代码,
(dos格式的文件反汇编时,字符串与代码的对应不是很准确,猜测0xFFE然后找到如下代码
估计就是cbrom计算效验和的最后部分,但是从中间开始看,没看明白DecompressCRC与BIOS_CRC之间的关系,
待高手来解惑ing...)

/*Cbrom215.exe,IDA 5.xx Compiler:BC31,_main()代码超长...!???*/

loc_17874:                              ; CODE XREF: _main+5860j
seg000:7874 18E                 push    ds
seg000:7875 190                 mov     ax, ')+'
seg000:7878 190                 push    ax              ; mode
seg000:7879 192                 push    ss
seg000:787A 194                 lea     ax, [bp+path]
seg000:787E 194                 push    ax              ; path
seg000:787F 196                 call    _fopen
seg000:787F
seg000:7884 196                 add     sp, 8
seg000:7887 18E                 mov     word ptr [bp+stream+2], dx
seg000:788B 18E                 mov     word ptr [bp+stream], ax
seg000:788F 18E                 xor     ax, ax
seg000:7891 18E                 push    ax              ; whence
seg000:7892 190                 push    word ptr [bp+buf+2]
seg000:7895 192                 push    word ptr [bp+buf] ; offset
seg000:7898 194                 push    dx
seg000:7899 196                 push    word ptr [bp+stream] ; stream
seg000:789D 198                 call    _fseek
seg000:789D
seg000:78A2 198                 add     sp, 0Ah
seg000:78A5 18E                 mov     [bp+BIOS_CRC], 0
seg000:78A9 18E                 cmp     [bp+var_17], 0
seg000:78AD 18E                 jz      short loc_178C9
seg000:78AD
seg000:78AF 18E                 mov     dx, word ptr [bp+DecompressOffset+2]
seg000:78B2 18E                 mov     ax, word ptr [bp+DecompressOffset]
seg000:78B5 18E                 and     ax, 0FFFh
seg000:78B8 18E                 and     dx, 0FFFFh      ; 0xFFFF 0FFF?????????
seg000:78BC 18E                 or      ax, 0F000h
seg000:78BF 18E                 or      dx, 0           ; 0xFFFF 0FFF | 0x0000 F000????
seg000:78C3 18E                 mov     word ptr [bp+DecompressOffset+2], dx
seg000:78C6 18E                 mov     word ptr [bp+DecompressOffset], ax
seg000:78C6
seg000:78C9
seg000:78C9     loc_178C9:                              ; CODE XREF: _main+589Ej
seg000:78C9 18E                 mov     word ptr [bp+offset+2], 0
seg000:78CF 18E                 mov     word ptr [bp+offset], 0
seg000:78D5 18E                 jmp     short loc_17910
seg000:78D5
seg000:78D7     ; ---------------------------------------------------------------------------
seg000:78D7
seg000:78D7     loc_178D7:                              ; CODE XREF: _main+5917j
seg000:78D7                                             ; _main+591Fj
seg000:78D7 18E                 les     bx, [bp+stream]
seg000:78DB 18E                 dec     word ptr es:[bx]
seg000:78DE 18E                 jl      short loc_178EE
seg000:78DE
seg000:78E0 18E                 inc     word ptr es:[bx+0Ch]
seg000:78E4 18E                 les     bx, es:[bx+0Ch]
seg000:78E8 18E                 dec     bx
seg000:78E9 18E                 mov     al, es:[bx]
seg000:78EC 18E                 jmp     short loc_178FD
seg000:78EC
seg000:78EE     ; ---------------------------------------------------------------------------
seg000:78EE
seg000:78EE     loc_178EE:                              ; CODE XREF: _main+58CFj
seg000:78EE 18E                 push    word ptr [bp+stream+2]
seg000:78F2 190                 push    word ptr [bp+stream] ; stream
seg000:78F6 192                 call    sub_1C64E
seg000:78F6
seg000:78FB 192                 pop     cx
seg000:78FC 190                 pop     cx
seg000:78FC
seg000:78FD
seg000:78FD     loc_178FD:                              ; CODE XREF: _main+58DDj
seg000:78FD 18E                 mov     [bp+Decompress_CRC], al
seg000:7900 18E                 mov     al, [bp+Decompress_CRC]
seg000:7903 18E                 add     [bp+BIOS_CRC], al
seg000:7906 18E                 add     word ptr [bp+offset], 1
seg000:790B 18E                 adc     word ptr [bp+offset+2], 0
seg000:790B
seg000:7910
seg000:7910     loc_17910:                              ; CODE XREF: _main+58C6j
seg000:7910 18E                 mov     dx, word ptr [bp+DecompressOffset+2]
seg000:7913 18E                 mov     ax, word ptr [bp+DecompressOffset]
seg000:7916 18E                 sub     ax, word ptr [bp+buf]
seg000:7919 18E                 sbb     dx, word ptr [bp+buf+2] ; (DWORD)Decompress-(DWORD)buf
seg000:791C 18E                 add     ax, 0FFEh ; <suspicious> ; (DWORD)Decompress-(DWORD)buf +0xFFE
seg000:791C       ; <suspicious>                        ; BIOS效验和de偏移位置
seg000:791F 18E                 adc     dx, 0
seg000:7922 18E                 cmp     dx, word ptr [bp+offset+2]
seg000:7926 18E                 ja      short loc_178D7 ; above
seg000:7926
seg000:7928 18E                 jnz     short loc_17930
seg000:7928
seg000:792A 18E                 cmp     ax, word ptr [bp+offset]
seg000:792E 18E                 ja      short loc_178D7
seg000:792E
seg000:7930
seg000:7930     loc_17930:                              ; CODE XREF: _main+5919j
seg000:7930 18E                 les     bx, [bp+stream]
seg000:7934 18E                 dec     word ptr es:[bx]
seg000:7937 18E                 jl      short loc_17947
seg000:7937
seg000:7939 18E                 inc     word ptr es:[bx+0Ch]
seg000:793D 18E                 les     bx, es:[bx+0Ch]
seg000:7941 18E                 dec     bx
seg000:7942 18E                 mov     al, es:[bx]
seg000:7945 18E                 jmp     short loc_17956
seg000:7945
seg000:7947     ; ---------------------------------------------------------------------------
seg000:7947
seg000:7947     loc_17947:                              ; CODE XREF: _main+5928j
seg000:7947 18E                 push    word ptr [bp+stream+2]
seg000:794B 190                 push    word ptr [bp+stream] ; stream
seg000:794F 192                 call    sub_1C64E
seg000:794F
seg000:7954 192                 pop     cx
seg000:7955 190                 pop     cx
seg000:7955
seg000:7956
seg000:7956     loc_17956:                              ; CODE XREF: _main+5936j
seg000:7956 18E                 mov     [bp+Decompress_CRC], al
seg000:7959 18E                 xor     ax, ax
seg000:795B 18E                 push    ax              ; whence
seg000:795C 190                 mov     dx, word ptr [bp+DecompressOffset+2]
seg000:795F 190                 mov     ax, word ptr [bp+DecompressOffset]
seg000:7962 190                 add     ax, 0FFEh ; <suspicious> ; 现在ax=Decompress_Start+0xFFE    ;BIOS效验和的位置
seg000:7965 190                 adc     dx, 0
seg000:7968 190                 push    dx
seg000:7969 192                 push    ax              ; offset
seg000:796A 194                 push    word ptr [bp+stream+2]
seg000:796E 196                 push    word ptr [bp+stream] ; stream
seg000:7972 198                 call    _fseek          ; 移动到BIOS效验和的位置
seg000:7972
seg000:7977 198                 add     sp, 0Ah
seg000:797A 18E                 push    word ptr [bp+stream+2]
seg000:797E 190                 push    word ptr [bp+stream] ; stream
seg000:7982 192                 mov     al, [bp+BIOS_CRC]
seg000:7985 192                 mov     ah, 0
seg000:7987 192                 push    ax              ; c
seg000:7988 194                 call    _fputc          ; 写入BIOS效验和
seg000:7988
seg000:798D 194                 add     sp, 6
seg000:7990 18E                 mov     al, [bp+Decompress_CRC]
seg000:7993 18E                 sub     [bp+BIOS_CRC], al ; BIOS_CRC = BIOS_CRC - Decompress_CRC
seg000:7996 18E                 xor     ax, ax
seg000:7998 18E                 push    ax              ; whence
seg000:7999 190                 mov     dx, word ptr [bp+DecompressOffset+2]
seg000:799C 190                 mov     ax, word ptr [bp+DecompressOffset]
seg000:799F 190                 add     ax, 0FFFh ; <suspicious> ; 指向DecompressBlock的CRC8
seg000:79A2 190                 adc     dx, 0
seg000:79A5 190                 push    dx
seg000:79A6 192                 push    ax              ; offset
seg000:79A7 194                 push    word ptr [bp+stream+2]
seg000:79AB 196                 push    word ptr [bp+stream] ; stream
seg000:79AF 198                 call    _fseek          ; 现在指向DecompressBlock的效验和
seg000:79AF
seg000:79B4 198                 add     sp, 0Ah
seg000:79B7 18E                 les     bx, [bp+stream] ; [es:bx]=stream...????!!!!!!!!!!!!!
seg000:79BB 18E                 dec     word ptr es:[bx]
seg000:79BE 18E                 jl      short loc_179CE
seg000:79BE
seg000:79C0 18E                 inc     word ptr es:[bx+0Ch] ; var_178????
seg000:79C4 18E                 les     bx, es:[bx+0Ch] ; es:bx=es:bx+0xc????
seg000:79C8 18E                 dec     bx
seg000:79C9 18E                 mov     al, es:[bx]
seg000:79CC 18E                 jmp     short loc_179DD
seg000:79CC
seg000:79CE     ; ---------------------------------------------------------------------------
seg000:79CE
seg000:79CE     loc_179CE:                              ; CODE XREF: _main+59AFj
seg000:79CE 18E                 push    word ptr [bp+stream+2]
seg000:79D2 190                 push    word ptr [bp+stream] ; stream
seg000:79D6 192                 call    sub_1C64E
seg000:79D6
seg000:79DB 192                 pop     cx
seg000:79DC 190                 pop     cx
seg000:79DC
seg000:79DD
seg000:79DD     loc_179DD:                              ;!!!!!!!!!!!!??????; CODE XREF: _main+59BDj
seg000:79DD 18E                 mov     [bp+Decompress_CRC], al
seg000:79E0 18E                 mov     al, [bp+Decompress_CRC]
seg000:79E3 18E                 add     [bp+BIOS_CRC], al
                                        ;这里看似Decompress_CRC/*BIOS_CRC*/=Decompress+差值
                                        ;但是loc_179DD可能是seg000:79CC位置跳转过来到,那些代码重新修改了Decompress_CRC
                                        ;看不明白了...
seg000:79E6 18E                 xor     ax, ax
seg000:79E8 18E                 push    ax              ; whence
seg000:79E9 190                 mov     dx, word ptr [bp+DecompressOffset+2]
seg000:79EC 190                 mov     ax, word ptr [bp+DecompressOffset]
seg000:79EF 190                 add     ax, 0FFFh ; <suspicious>
seg000:79F2 190                 adc     dx, 0
seg000:79F5 190                 push    dx
seg000:79F6 192                 push    ax              ; offset
seg000:79F7 194                 push    word ptr [bp+stream+2]
seg000:79FB 196                 push    word ptr [bp+stream] ; stream
seg000:79FF 198                 call    _fseek          ; 移动到解压缩模块效验和的位置
seg000:79FF
seg000:7A04 198                 add     sp, 0Ah
seg000:7A07 18E                 push    word ptr [bp+stream+2]
seg000:7A0B 190                 push    word ptr [bp+stream] ; stream
seg000:7A0F 192                 mov     al, [bp+BIOS_CRC]
seg000:7A12 192                 mov     ah, 0
seg000:7A14 192                 push    ax              ; c
seg000:7A15 194                 call    _fputc          ; 这里写入解压缩模块的效验和
seg000:7A15
seg000:7A1A 194                 add     sp, 6
seg000:7A1D 18E                 push    word ptr [bp+stream+2]
seg000:7A21 190                 push    word ptr [bp+stream] ; stream
seg000:7A25 192                 call    _fclose

经过测试验证猜测的正确性:

对于2Mb (256KB)的BIOS,在修改了Module以后,从镜像开始到解压缩模块的末尾倒数两字节结束,在这段
区间内计算CRC8,填入解压缩模块的倒数第二个字节(作为BIOS效验和),然后对解压缩模块单独做CRC8
填入解压缩模块的最后一个字节

两个效验和差没有数值关联
(曾经装模作样的证明它们之间的关系...
如下:
----------------------------------------------
       a0             b0    c0 d0
+---------------+----------+--+--+---+
|   Modules.0   |  Decomp  |c0|d0|...|
+---------------+----------+--+--+---+

+---------------+----------+--+--+---+
|   Modules.1   |  Decomp  |c1|d1|...|
+---------------+----------+--+--+---+
       a1             b1    c1 d1
----------------------------------------------
Given:
    a0+b0=-c0
    b0+c0=-d0
   
    a1+b1=-c1
    b1+c1=-d1
       
    b0=b1

?:  d1-c1=d0-c0
       
        现在看起来好搞笑...hehhe


//=====================================================

今天测试512KB的BIOS时发现
decompress_start[0xFFF]并不能正常运行
对于256KB的BIOS可以,运行生成的镜像与cbrom215完全一致

但是针对512KB时,计算的BIOS_CKSUM并不对,将计算的数据写入到了其它地方

用UltraEdit打开看时,
"= Award Decompression Block ="开始+4KB的位置并不是4KB对齐的

将自己生成的BIOS镜像与cbrom比较,发现
H:/>fc /b BIOS512.BIN new_bios.bin
Comparing files BIOS512.BIN and NEW_BIOS.BIN
0006FE3E: FF 20
0006FE3F: FF 58
0006FFFE: FA 93
0006FFFF: 1A B3

由上可以判断6FFFE位置为BIOS Internal CRC
后面是DecompressionBlock的CRC

DecompressionBlock开始位置在0x6EE40,所以代码将效验和写入到了0x6EE40+0xFFE (0xFFFF),
所以才有上面的结果
*/
待修正。。。


观察一下,这两个位置都是4KB Align,而向上就可以找到BBSS结构

所以猜测awd bios 6.00PG的效验和的位置在BBSS数据结构位置4KB对齐的末尾...

也就是

ALIGN_4KB(BBSS_Addr)+0xFFE = Internal BIOS CRC
ALIGN_4KB(BBSS_Addr)+0xFFE = DecompressionBlock CRC

待修正...

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
注:
BIOS的各个模块之间有1到两个字节的空隙
第一个字节一般为零
第二个字节如果存在的话,其值为当前模块的效验和,即模块所有字节之和。

一般来讲,第一个模块为SystemBIOS模块,加压缩后拷贝到(E,如果为128KB)F000段
此模块后面一般有两个字节(ExtraSize=2),其它模块ExtraSize为一个字节

按AwdbEdit来讲,BIOS的模块ExtraSize一般为如下几种:
2-1-1   :第一个模块后又两个字节,其它模块后又一个字节
2-2-2   :每个模块后面有两个字节
1-1-1   :每个模块后都有一个字节

添加模块应该判断BIOS模块的布局,然后新添加的模块按布局加入,并修正效验和

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值