对于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完工。
作者:gooogleman