【我所認知的BIOS】->反彙編BIOS之準備工作

【我所認知的BIOS->反彙編BIOS之準備工作

              LightSeed

3/11/2010

上海     

 

在我們進入反彙編的旅途之前,我想我應該把一些大家應該準備的東西都列一下,只有有了這樣的針對性準備嘛,我想我寫的文章才更能引起大家的共鳴。我用的主板是915GS+ICH6+Winbond83627HF的主板。Bios也就是用awardflash.exe讀出來的bin文件。

1PCI bus的簡單理解與操作

關於PCI的操作,在

http://blog.csdn.net/lightseed/archive/2009/05/27/4219244.aspx

這個章節中有對PCI bus操作的示例。至於PCI bus的總線操作嘛,我想目前我們還可以不用瞭解地那麼深入。

2、北橋關於CPU地址的decode

爲什麼要專門加上這個呢?因爲在之前的文章中,有人提問問到過一個問題,說當板子剛剛上電的時候,CPU不是說從FFFF_FFF0H處去讀指令麼?怎麼又和BIOSF000段扯上關係了哦?這個問題可以用一種比較好理解的通俗的方法來看。把北橋看做一個開關,在上電的時候它會忽略FFFF_FFF0H這個地址中的高12bit。就是FFFE_0000H-FFFF_FFFFH其實對應的就是000E_0000H-000F_FFFFH這面的地址訪問。這樣理解雖然不太正確,但是比較容易懂。

3、一些關於Legacy IO的瞭解

比如說一些比較古老的IO port在後續的BIOS中會比較多的操作,他們應該大多都能夠在ICH6datasheet裏面找到。比如說,70H,71H,61H,92H,CF9H等等。如果您不知道的話,到是可以google一下。或者留言也行,(原本以爲這裏比較簡單,所以就沒列出來。)

70H】的詳細說明在ICH6中的10.7.2 NMI_EN—NMI Enable (and Real Time Clock Index)

61H】的詳細說明在ICH6中的10.7.1 NMI_SC—NMI Status and Control Register

92H】的詳細說明在ICH6中的10.7.3 PORT92—Fast A20 and Init Register

上面只是列了一個簡單的列表,詳細地您自己去看。

4、反彙編的過程中會用到的工具

IDA Freeware Version 4.3它是用來反彙編的利器,功能相當強大,它也是我們反彙編過程中用的最多的工具。

CBROM.EXE任何一個版本都可以,是用來查看AWARD bios的模塊結構的。

MODBIN6.EXE還是比較高的比較好。主要是用來解壓縮systembios這個模塊的。(當然用AwardEditor也可以做到。)

Ultraedit.EXE能夠查看二進制文件就OK了。因爲在BIOS的執行過程中,有時候會查看一些特殊的標誌符號(ASCII的),這樣就可以很方便地找到偏移,方便進一步反彙編。

5、反彙編的過程中會看的資料

當然一個平臺的信息很重要了,那麼在BIOS run的過程中,顯然配置的信息需要不時地查看各個寄存器的只以及其對應的function915chipsetdatasheet可以從intel的官網上下到。地址如下:

http://www.intel.com/Assets/PDF/datasheet/305264.pdf

ICH6

http://www.intel.com/assets/pdf/datasheet/301473.pdf

當然這些都是datasheet,還有一些資料也應該是必須的,intel programming guide

http://www.intel.com/products/processor/manuals/

6、反彙編的第一步應該是什麼?

http://blog.csdn.net/lightseed/archive/2009/10/27/4735101.aspx

這個章節中,和大家詳細探討了CPU第一條指令的地址,BIOS其實也就是從FFFF_FFF0H這個地方去取指令的。(當然BIOS並不是完全的純二進制代碼,有一部分是壓縮過的。其中沒有壓縮過的就是現在說的bootblock這部分了。這部分代碼可以直接執行。而壓縮過的bios會在bootblock跑完了以後被全部解壓縮出來,繼續跑。解壓的過程在

http://blog.csdn.net/lightseed/archive/2009/06/03/4239127.aspx

有比較多的論述,當時我只是和大家從算法和架構上與大家進行了探討,之後我會在BIOS代碼中讓大家看看加壓縮的真實面目。)

7、一個不得不提醒的事

BIOS的運行,正如上面說的一樣,主要分成了三個階段。

第一個階段是bootblock階段,這個階段比較特殊,因爲memory還不使用。所以很特殊,在調用函數的時候就不能用平常的call來做了。會用到一個叫做ROM_CALL的宏來做。

第二個階段和第三個階段合起來叫做POSTPower-On Self Test)的階段。其實就是bootblock階段後的一個階段都叫做POST

BIOS的角度講,POST又被分爲了第二階段E0POST和第三階段E8POST。(這個比較專業了哈,只是給大家瞭解一下,業內人士飄過就是。)

主要在bootblock的時候ROM_CALL的這個宏要專門提出來:

ROM_CALL    MACRO RTN_NAME
      LOCAL RTN_ADD
      mov   sp,offset DGROUP:RTN_ADD
      jmp   RTN_NAME
RTN_ADD:    dw    DGROUP:$+2
            ENDM

這個宏主要還是利用了retn的具體操作來設計的。我說一下,宏把sp指向了JMP指令前面的地址(RTN_ADD),而這個地址(RTN_ADD)裏面存的offset恰好又是RTN_ADD+2。那麼在執行retn的時候,就會把sssp指向的這個word賦值給IP,這樣就完成了一個retn的動作,繼續回到之前的程序流程中去。在反彙編的時候,這個要務必記清楚。

8IDA pro的用法介紹

--------------------------------------以下這部分主要參考了《Pinczakko's Guide to Award BIOS Reverse Engineering》中的相關章節,大致是他的翻譯版,本人覺得他寫的挺好了的,所以就直接引用了。在這裏特別註明一下。這位前輩的文章可是相當的精髓哦,也很深入值得向大家推薦。(其實他也就和我一般大,真的應該好好向他學習。)

在裝好IDA PRO Freeware 4.3後雙擊運行如圖1

 

 

1

點擊OK即可,下一個步驟圖如圖2

 

2

當你是第一次反彙編的時候,那麼你就選中NEW,當你的電腦上已經有project文件的話,那麼就可以直接選擇相應的文件,點‘previous’即可。或者你也想自己加載bin文件也可以,點‘GO’即可。

會出現圖3的界面

 

3

加載bin文件後,會出現如下的界面圖4

 

4

在這個對話框中,選擇P4即可,(在我的板子上是用P4CPU,我想應該選其他也沒有關係,您可以試試。)只需要改這裏,其他的都默認,然後‘OK

然後會馬上彈出個對話框如圖5

 

5

由於一開始BIOS是運行在16bit上的real mode下的。(在programming guide裏面有詳細描述。也可以看看前面的第一條指令那篇文章,都有詳細描述。)所以點 No’即可。

然後會出現圖6的對話框。

 

6

然後就是真正的反彙編的對話框了。如圖7

 

7

在圖7中,有三個紅色的框框,從上到下,第一個是指機器碼的地址,第二是隻二進制反彙編的結果,第三個是說消息窗口就在下面了。

-----------------------------------------

有了以上一些初步的知識瞭解後,我想我們就可以進入反彙編BIOS的旅途了。

 

發佈了61 篇原創文章 · 獲贊 11 · 訪問量 77萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章