程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 關於BIOS效驗和

關於BIOS效驗和

編輯:.NET實例教程
/*
開始在看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:                         &nbsp;    ; 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          &nbsp;      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         &nbsp;       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         &nbsp;       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
+---------------+----------+--+--+---+
|&nbsp;  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模塊的布局,然後新添加的模塊按布局加入,並修正效驗和

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved