反彙編stepldr exe——第一次使用IDA反彙編(作者 wogoyixikexie gliet)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
反彙編stepldr.exe——第一次使用IDA反彙編(作者:
對於IDA反彙編已經流口水很久了,上次修改SD卡DLL的中斷讓我嚐到了甜頭,現在寫篇文章,貼幾個圖,造福you and me
開啟IDA,選擇ARM的標籤,開始分析,居然可以還原始碼,真實太神奇了。
—————————————————————————————————————————————————————
這個text:00011000是程式碼 B loc_11108對應的地址,(關於這個地址問題,後面再討論),但是識別這個東西很重要,現在切換到HEX view標籤,根據這個地址找到對應的16進位制資料(在記憶體中表現為二進位制,為了直觀,以16進位制ASCII碼顯示)
——————————————————————————————————————————————————————
根據這個text:00011000找到對應的16進位制碼(其實是IDA自動找到的,只要點到一個地址,就會在HEX view中以綠色背景顯示,很強吧。)看看這個B的機器碼,是完全吻合的。不過在IDA裡面不能修改這些16進位制資料(程式碼字元就可以),要使用
UltraEdit開啟才行,馬上開啟。
————————————————————————————————————————————————————
發現這個地址不一樣了,這個IDA不是從00000000H開始的,從bib檔案來看,這個stepldr是對映到0x0000000執行的,
那到底這兩個地址和記憶體有什麼關係呢?我覺得應該沒有關係,因為這些程式碼在不同容量的記憶體的同一個平臺是照樣可以
執行的。 以前大家一致認為這個MMU開啟之後,存放程式碼的地址是虛擬地址,現在使用UltraEdit來看看到底是不是真的。
打開個鍵盤驅動,發現照樣從0開始,所以以前我們都錯了。
—————————————————————————
現在來找幾個難點的指令來看看。
——————————————————————————————————————
——————————————————————————————————————————
下班了,回家繼續看看。
——————————
先看看MOV指令的譯碼格式
——————————————————————————————————————————————————
從這個可以看出編碼格式中的Rd就是R1,並且Rd這個值就是1(Rn就是n),這個佔據低12位的shifter_operand其實
被被分為兩部分,一部分是n[11:8],一部分是m[7:0],而我們所要傳遞的值0x56000000是怎麼來的呢。看手冊終於明白了。
0x56000000=m迴圈右移(2*n),現在一切都OK了。看上面就知道這個是怎麼來的了。對於這個LDR指令是個相當
複雜的事情。尤其是ldr r1, =這類指令,在反彙編的時候有時候會翻譯成MOV 指令,但是有時候還是ldr r1, =這個樣,
沒有翻譯。所以搞得相當鬱悶。現在貼個程式碼段上來看看。以ResetHandler為例子
- ;-----------------------------------
- ; Steppingstone loader entry point.
- ;-----------------------------------
- ResetHandler
- ldr r0, =WTCON ; disable the watchdog timer.
- ldr r1, =0x0
- str r1, [r0]
- ldr r0, =INTMSK ; mask all first-level interrupts.
- ldr r1, =0xffffffff
- str r1, [r0]
- ldr r0, =INTSUBMSK ; mask all second-level interrupts.
- ldr r1, =0x7fff
- str r1, [r0]
- ; CLKDIVN
- ldr r0,=CLKDIVN
- ldr r1,=0x7 ; 0x0 = 1:1:1 , 0x1 = 1:1:2 , 0x2 = 1:2:2 , 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
- str r1,[r0]
- ; BATT_FLT
- ldr r1, =MISCCR
- ldr r0, [r1]
- bic r0, r0, #(7<<20)
- orr r0, r0, #(4<<20)
- str r0, [r1]
- ; MMU_SetAsyncBusMode FCLK:HCLK= 1:2
- ands r1, r1, #0x2
- beq %F5
- bl MMU_SetAsyncBusMode
- 5
- ; TODO: to reduce PLL lock time, adjust the LOCKTIME register.
- ldr r0, =LOCKTIME
- ldr r1, =0xffffff
- str r1, [r0]
- ; Configure the clock PLL.
- ;
- [ PLL_ON_START
- ldr r0, =UPLLCON
- ldr r1, =((0x3c<<12)+(0x4<<4)+0x2) ; Fin=16.9344MHz, Fout=48MHz.
- str r1, [r0]
現在來看看IDA反彙編程式碼
————————————————————————————————————————————————
真是和上面說的一樣。不過IDA始終沒有ADS自己翻譯那麼準確,所以等下看看這個ADS會怎麼翻譯。
——————————————————————————————————————————————
沒有想到這個ADS反彙編會這麼離譜,讓我大吃一驚,這個LDR r0 ,0x584到底是怎麼來的,並且指令
大全上根本沒有這種指令,真是讓人吃驚。哎,看來還是IDA牛B一點。失望,失望。現在我無法瞭解ldr r0,=XXX
的機器碼,暫時先放下了。到時候有機會請教高手,現在能改一些常用指令即可。OK完工。
轉載請標明:作者[email protected].桂林電子科技大學一系科協,原文地址:http://blog.csdn.net/gooogleman——如有錯誤,希望能夠留言指出;如果你有更加好的方法,也請在部落格後面留言,我會感激你的批評和分享。