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

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

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

                            反汇编stepldr.exe——第一次使用IDA反汇编(作者:wogoyixikexie@gliet

    对于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完工。

    转载请标明:作者wogoyixikexie@gliet.桂林电子科技大学一系科协,原文地址:http://blog.csdn.net/gooogleman——如有错误,希望能够留言指出;如果你有更加好的方法,也请在博客后面留言,我会感激你的批评和分享。

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/hfdghjh/article/details/83893311