打印

ARM反汇编-网上收集(不定期更新)

[复制链接]
4221|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Periodic|  楼主 | 2012-10-2 19:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Periodic|  楼主 | 2012-10-2 19:40 | 只看该作者
arm程序的反汇编程序 试读 (2012-04-02 00:49)
标签:  arm  反汇编程序  分类: S3C2440A




              我们以一个小程序来学习如何分析反汇编程序


这是汇编源文件:
MCU:S3C2440(arm920T)
代码实现点亮个led小灯

.text
.global _start
_start:
        ldr r0,=0x56000010        @GPBCON
        mov r1,#0x00000400        @
        str r1,[r0]                @GPB5_out=01
        
        ldr r0,=0x56000014        @GPBDAT
        mov r1,#0x0
        str r1,[r0]                @GPBDAT[5]=0,len_off
main_loop:
        b        main_loop


反汇编文件:
led_on.bin:     file format binary

Disassembly of section .data:

00000000 <.data>:
   0:        e59f0014         ldr        r0, [pc, #20]        ; 0x1c
   4:        e3a01b01         mov        r1, #1024        ; 0x400
   8:        e5801000         str        r1, [r0]
   c:        e59f000c         ldr        r0, [pc, #12]        ; 0x20
  10:        e3a01000         mov        r1, #0        ; 0x0
  14:        e5801000         str        r1, [r0]
  18:        eafffffe         b        0x18
  1c:        56000010         undefined
  20:        56000014         undefined

接下来让我们分析下这小小的反汇编程序吧!


   0:        e59f0014         ldr        r0, [pc, #20]        ; 0x1c
这条指令就是把内存单元 pc+20 的值load 到r0 中,而根据ARM 架构指南所讲,pc 的值读取得时候是当前指令的地址 +8 ,所以就是把地址28 (也就是16进制的1c)的值load 到r0中,r0 现在变成了0x56000010.
   
   4:        e3a01b01         mov        r1, #1024        ; 0x400
这条指令是把1024(ARM汇编At&T语法要在立即数前加#), 也即是16进制的0x400 移到r1中。

   8:        e5801000         str        r1, [r0]
这个就是通过str 指令把r1内容存到r0 寄存器所指向的内存单元。 也就是把1024 存到0x56000000 中。

   c:        e59f000c         ldr        r0, [pc, #12]        ; 0x20
  10:        e3a01000         mov        r1, #0        ; 0x0
  14:        e5801000         str        r1, [r0]
这三条指令一样的道理

  18:        eafffffe         b        0x18
这个是死循环
  1c:        56000010         undefined
  20:        56000014         undefined
这两行不是指令,而是数据。

虽然这程序很简单,但对于菜鸟的我一开始是什么感觉都没有,在这里要感谢CU的朋友
moniskiller 是他的细心解说让我顿悟,哈哈
                                       

                                                                   LAY

使用特权

评论回复
板凳
Periodic|  楼主 | 2012-10-2 19:41 | 只看该作者
ARM的BIN文件反汇编方法 .
分类: uboot移植 2012-07-21 23:22 824人阅读 评论(0) 收藏 举报
最近在调试uboot的代码时,用的新版本的uboot,lowlevel_init函数里是空的,而且在链接文件中也没有发现对lowlevel_init.o的链接。在bl lowlevel_init 之前和之中加了两个电灯,发现在bl之后的部分并没有被执行,所以想看看具体程序有没有运行这个函数。在网上找反汇编bin文件的时候发现有朋友提供的方法,很好用。

使用arm-linux 工具链里面的arm-linux-objdump 就能反汇编

cd到bin文件所在的目录, 在命令行下输入:

arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm

参数:
-D 反编译所有代码
-m 主机类型, arm
-b 文件格式, binary

对于ELF格式的文件只要一个-D参数即可

就可以把xxx.bin反汇编到xxx.asm文件

使用特权

评论回复
地板
Periodic|  楼主 | 2012-10-2 19:42 | 只看该作者
在X86架构下的电脑上生成ARM架构的汇编代码有两种方式:
1、使用交叉编译工具链:arm-linux-gcc,指定-S选项可以生成汇编中间文件。
2、使用arm-linux-objdump反汇编arm二进制文件。


1、arm-linux-gcc:
首先编写C程序,假设名字为test.c,保存test.c文件内容:



使用方法如下:
在使用arm-linux-gcc编译C源文件时,使用-S选项可以将C文件(test.c为例)编译到汇编阶段,生成arm汇编代码,使用方式如下:
arm-linux-gcc  -march=armv7-a -mtune=cortex-a9  test.c -S -o test.asm  
生成arm汇编文件test.asm。
说明:
-march可以指定目标ARM的架构可选参数见(man gcc)
-mtune(类似于-mcpu)可以具体到ARM处理器类型。
注意:
Specifying both -march= and -mcpu= is redundant, and may not in fact have done what you expected in previous compiler versions (maybe even depending on the order in which the arguments were given). The -march switch selects a "generic" ARMv7-A CPU, and -mcpu selects specifically a Cortex-A8 CPU with tuning specific for that core.

Either use "-march=armv7-a -mtune=cortex-a8", or just use "-mcpu=cortex-a8".

所以只用一个-mcpu=cortex-a9也可以



test.asm内容:
01.<PRE class=plain name="code">  1         .arch armv4t  
02.  2         .fpu softvfp  
03.  3         .eabi_attribute 20, 1  
04.  4         .eabi_attribute 21, 1  
05.  5         .eabi_attribute 23, 3  
06.  6         .eabi_attribute 24, 1  
07.  7         .eabi_attribute 25, 1  
08.  8         .eabi_attribute 26, 2  
09.  9         .eabi_attribute 30, 6  
10. 10         .eabi_attribute 18, 4  
11. 11         .file   "test.c"  
12. 12         .section        .rodata  
13. 13         .align  2  
14. 14 .LC0:  
15. 15         .ascii  "hello.world!\000"  
16. 16         .text  
17. 17         .align  2  
18. 18         .global main  
19. 19         .type   main, %function  
20. 20 main:  
21. 21         .fnstart  
22. 22 .LFB2:  
23. 23         @ Function supports interworking.  
24. 24         @ args = 0, pretend = 0, frame = 0  
25. 25         @ frame_needed = 1, uses_anonymous_args = 0  
26. 26         stmfd   sp!, {fp, lr}  
27. 27         .save {fp, lr}  
28. 28 .LCFI0:  
29. 29         .setfp fp, sp, #4  
30. 30         add     fp, sp, #4  
31. 31 .LCFI1:  
32. 32         ldr     r0, .L3  
33. 33         bl      puts  
34. 34         mov     r3, #0  
35. 35         mov     r0, r3  
36. 36         sub     sp, fp, #4  
37. <PRE class=plain name="code"> 36         sub     sp, fp, #4  
38. 37         ldmfd   sp!, {fp, lr}  
39. 38         bx      lr  
40. 39 .L4:  
41. 40         .align  2  
42. 41 .L3:  
43. 42         .word   .LC0  
44. 43 .LFE2:  
45. 44         .fnend  
46. 45         .size   main, .-main  
47. 46         .ident  "GCC: (Sourcery G++ Lite 2009q1-176) 4.3.3"  
48. 47         .section        .note.GNU-stack,"",%progbits

使用特权

评论回复
5
Periodic|  楼主 | 2012-10-2 19:49 | 只看该作者
ARM程序反汇编文档.pdf (2.24 MB)

使用特权

评论回复
6
Periodic|  楼主 | 2012-10-2 19:50 | 只看该作者
IDA简易教程.pdf (841.22 KB)

使用特权

评论回复
7
Periodic|  楼主 | 2012-10-2 19:53 | 只看该作者
开源  的编译器

1. llvm
http://llvm.org/
继gcc以后, 在学术界和产业界都有很大影响的编译器

2. gcc
http://gcc.gnu.org/
最强大的开源编译器

3. suif
http://suif.stanford.edu/
A free infrastructure designed to support collaborative research in optimizing and parallelizing compilers.

4. CLIhttp://hal.cs.berkeley.edu/cil/
CIL (C
Intermediate
Language) is a high-level representation along with a set of tools that permit easy analysis and source-to-source transformation of C programs.

使用特权

评论回复
8
Periodic|  楼主 | 2012-10-2 19:58 | 只看该作者
也许有一个  快速的 途径   通过修改 GCC 来进行反汇编  应为GCC开源


以前敲过机器码的 电工  肯定对 正汇编 印象特深
就是把 汇编 文件 翻译成 2进制  然后逐行 敲入烧写器  然后 在烧写到MCU

使用特权

评论回复
9
Periodic|  楼主 | 2012-10-2 20:00 | 只看该作者
GCC  下载  地址http://ftp.gnu.org/pub/pub/gnu/gcc/

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

670

帖子

2

粉丝