/*
开始在看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模块的布局,然后新添加的模块按布局加入,并修正效验和
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%