1. 程式人生 > >反彙編stepldr exe——第一次使用IDA反彙編(作者 wogoyixikexie gliet)

反彙編stepldr exe——第一次使用IDA反彙編(作者 wogoyixikexie gliet)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

                            反彙編stepldr.exe——第一次使用IDA反彙編(作者:

[email protected]

    對於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為例子

 

  1. ;-----------------------------------
  2. ; Steppingstone loader entry point.
  3. ;-----------------------------------
  4. ResetHandler
  5.     ldr     r0, =WTCON       ; disable the watchdog timer.
  6.     ldr     r1, =0x0         
  7.     str     r1, [r0]
  8.     ldr     r0, =INTMSK      ; mask all first-level interrupts.
  9.     ldr     r1, =0xffffffff
  10.     str     r1, [r0]
  11.     ldr     r0, =INTSUBMSK   ; mask all second-level interrupts.
  12.     ldr     r1, =0x7fff
  13.     str     r1, [r0]
  14.     ; CLKDIVN
  15.     ldr     r0,=CLKDIVN
  16.     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
  17.     str     r1,[r0]
  18.     ; BATT_FLT
  19.     ldr     r1, =MISCCR
  20.     ldr     r0, [r1]
  21.     bic     r0, r0, #(7<<20)
  22.     orr     r0, r0, #(4<<20)
  23.     str     r0, [r1]
  24.     ; MMU_SetAsyncBusMode FCLK:HCLK= 1:2
  25.     ands    r1, r1, #0x2
  26.     beq     %F5
  27.     bl      MMU_SetAsyncBusMode
  28. 5
  29. ; TODO: to reduce PLL lock time, adjust the LOCKTIME register. 
  30.     ldr     r0, =LOCKTIME
  31.     ldr     r1, =0xffffff
  32.     str     r1, [r0]
  33.   
  34.     ; Configure the clock PLL.
  35.     ;      
  36.     [ PLL_ON_START
  37.     
  38.     ldr     r0, =UPLLCON          
  39.     ldr     r1, =((0x3c<<12)+(0x4<<4)+0x2)  ; Fin=16.9344MHz, Fout=48MHz.
  40.     str     r1, [r0]

現在來看看IDA反彙編程式碼

————————————————————————————————————————————————

    真是和上面說的一樣。不過IDA始終沒有ADS自己翻譯那麼準確,所以等下看看這個ADS會怎麼翻譯。

 

——————————————————————————————————————————————

    沒有想到這個ADS反彙編會這麼離譜,讓我大吃一驚,這個LDR r0 ,0x584到底是怎麼來的,並且指令

大全上根本沒有這種指令,真是讓人吃驚。哎,看來還是IDA牛B一點。失望,失望。現在我無法瞭解ldr r0,=XXX

的機器碼,暫時先放下了。到時候有機會請教高手,現在能改一些常用指令即可。OK完工。

    轉載請標明:作者[email protected].桂林電子科技大學一系科協,原文地址:http://blog.csdn.net/gooogleman——如有錯誤,希望能夠留言指出;如果你有更加好的方法,也請在部落格後面留言,我會感激你的批評和分享。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述