2007年5月6日 星期日

反組譯 OpenMoko Steppingstone Code

在正式的內文之前,先來說個小故事。前一陣子在Atmel AT91RM9200這顆ARM9微處理器的實驗板上寫了一個簡單又迷你的kernel,後來想想認識的人裡面都沒人玩這顆,不免有點孤單。於是打算把它移植到比較多人玩並且有模擬器可用的平台,剛好jserv推薦OpenMoko,OpenMoko 的第一支手機Neo1973/GTA01所使用的微處理器是Samsung S3C2410也是 ARM9,我想應該不難移植,還有jserv掛保證的模擬器可用,所以就決定來玩OpenMoko/S3C2410啦!

既然我的出發點是要開發kernel,那麼對於處理器的啟動程序就不可不知。S3C2410啟動時,會從NAND flash的開頭複製4KB 內容到內部的SRAM,然後跳到SRAM開始執行,這4KB SRAM就稱為Steppingstone。這段小程式就是處理器最先執行的程式,但4KB空間當然放不下U-Boot,於是我們只把這段小程式當作踏腳石(steppingstone),由它來幫忙載入完整的U-Boot bootloader。

在好奇心作祟之下,想來看看這段steppingstone code寫些什麼(其實也沒什麼,真的很無聊吧 XD)。在 http://buildhost.openmoko.org/tmp/deploy/images/ 抓了lowlevel_foo開頭檔名的".bin" 檔,問題是我只知道可以用arm-linux-objdump來反組譯 ELF 格式的程式,那麼binary檔怎麼反組譯呢?上網Google了一下沒有找到ARM反組譯器(其實是前幾個連結沒有就懶得繼續找了),網友說IDA Pro這套軟體可以反組譯ARM程式,但我懶得安裝這麼龐大的東西。只好換個關鍵字繼續 Google 看看,結果找到了這個網頁:

firmware_reverse_engeneering_methodology
原來可以把binary檔轉成ELF檔再進行反組譯,方法如下:

先把binary轉成ELF格式:
$ arm-linux-objcopy -I binary -O elf32-littlearm foo.bin foo.elf
再進行反組譯:
$ arm-linux-objdump -marm9 -D foo.elf > foo.asm
輸出結果foo.asm是個純文字檔,內容就是反組譯出來的組合語言。簡單吧?不需要安裝其它軟體,只要利用toolchain就能辦到。學會這招後,手邊如果有實驗板沒開放bootloader原始碼,或者想hack PDA bootloader,都不是問題啦(當然得有耐心去trace組合語言程式碼)!

1 則留言:

Checko 提到...

真是太cool 啦。
果然objdump 就可以,我找了好久都找不到方法。
最後不得已,只好用AXD來load binary file。 (真蠢 :P)。

另外. openmoko內附的 bootloader (Uboot) 加上他的patch 後,就有支援stepping stone了。(雖然他的uboot 版本是1.1..)。

說是這樣說,我這裡patch 後沒有成功. :P。