即其後的字節(也就是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
填入解壓縮模塊的最後一個字節
兩個效驗和差沒有數值關聯 +---------------+----------+--+--+---+ ?: d1-c1=d0-c0 今天測試512KB的BiOS時發現 但是針對512KB時,計算的BiOS_CKSUM並不對,將計算的數據寫入到了其它地方 用UltraEdit打開看時, 將自己生成的BiOS鏡像與cbrom比較,發現 由上可以判斷6FFFE位置為BiOS Internal CRC DecompressionBlock開始位置在0x6EE40,所以代碼將效驗和寫入到了0x6EE40+0xFFE (0xFFFF), 所以猜測awd biOS 6.00PG的效驗和的位置在BBSS數據結構位置4KB對齊的末尾... 也就是 ALIGN_4KB(BBSS_Addr)+0xFFE = Internal BiOS CRC 待修正...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一般來講,第一個模塊為SystemBiOS模塊,加壓縮後拷貝到(E,如果為128KB)F000段 按AwdbEdit來講,BiOS的模塊ExtraSize一般為如下幾種: 添加模塊應該判斷BiOS模塊的布局,然後新添加的模塊按布局加入,並修正效驗和 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(曾經裝模作樣的證明它們之間的關系...
如下:
----------------------------------------------
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
現在看起來好搞笑...hehhe
)
//=====================================================
decompress_start[0xFFF]並不能正常運行
對於256KB的BiOS可以,運行生成的鏡像與cbrom215完全一致
"= Award Decompression Block ="開始+4KB的位置並不是4KB對齊的
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
後面是DecompressionBlock的CRC
所以才有上面的結果
*/
待修正。。。
觀察一下,這兩個位置都是4KB Align,而向上就可以找到BBSS結構
ALIGN_4KB(BBSS_Addr)+0xFFE = DecompressionBlock CRC
注:
BiOS的各個模塊之間有1到兩個字節的空隙
第一個字節一般為零
第二個字節如果存在的話,其值為當前模塊的效驗和,即模塊所有字節之和。
此模塊後面一般有兩個字節(ExtraSize=2),其它模塊ExtraSize為一個字節
2-1-1 :第一個模塊後又兩個字節,其它模塊後又一個字節
2-2-2 :每個模塊後面有兩個字節
1-1-1 :每個模塊後都有一個字節