现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

第一次使用IDA反汇编

2014-03-25 06:34 工业·编程 ⁄ 共 2605字 ⁄ 字号 暂无评论

对于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.     ; Configure the clock PLL.
  34.     ;     
  35.     [ PLL_ON_START
  36.     ldr     r0, =UPLLCON         
  37.     ldr     r1, =((0x3c<<12)+(0x4<<4)+0x2)  ; Fin=16.9344MHz, Fout=48MHz.
  38.     str     r1, [r0]

现在来看看IDA反汇编代码

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

    真是和上面说的一样。不过IDA始终没有ADS自己翻译那么准确,所以等下看看这个ADS会怎么翻译。

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

    没有想到这个ADS反汇编会这么离谱,让我大吃一惊,这个LDR r0 ,0x584到底是怎么来的,并且指令

大全上根本没有这种指令,真是让人吃惊。哎,看来还是IDA牛B一点。失望,失望。现在我无法了解ldr r0,=XXX

的机器码,暂时先放下了。到时候有机会请教高手,现在能改一些常用指令即可。OK完工。

作者:gooogleman

给我留言

留言无头像?