学习ARM反汇编工具objdump和一个简单实例
--参考朱有鹏ARM裸机编程
1、反汇编的原理&为什么需要反汇编
arm-linux-objdump -D led.elf > led_elf.dis
objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf
格式的可执行程序,来反过来得到汇编源代码。
-D表示反汇编。
>左边的是ELF的可执行程序(反汇编时候的原材料)
>右边的是反汇编生成的反汇编程序。其实就是一个汇编语言。
一般情况下我们写一个源代码
类似于我们WINDOW里面是EXE的格式,PE格式是官方的名字。
2、为什么我们需要进行反汇编,我们要的就是可执行程序。
反汇编的原因有以下:
1、逆向破解
你想盗版的原来的程序,最终得到程序的源代码。
2、调式程序的时候,反汇编代码可以帮助我们理解程序。
(我们学习时使用objdump主要目的是这个),
尤其是在理解链接脚本,链接地址等概念时候。
尤其是在理解链接的时候,用反汇编对你的理解非常大。
如果你是C语言写的源代码,反汇编之后得到的汇编语言的源代码,
可以有助于你理解C和汇编之间的关系,
非常有助于理解深入理解C语言。
3、反汇编文件的分析:
(1)第一个是标号比如000000这些是代表当前的地址
(2)第二个标号比如e59f0050:代表的是机器码的意思,其实我们写的所有的可执行程序都是机器码
只不过汇编语言就是相当于一句汇编语言对应一个机器码,这样我们编程就不用像以前那么辛苦了。
0: e59f0050 ldr r0, [pc, #80] ; 58
这句话是
ldr r0, =0x11111111
// 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
编译器翻译出来就是上面的一句话,0x11111111这个数是ARM伪指令提供的。
那么到底机器把这句话放置在哪里呢?
把这句话放置在58这个地址中,后面已经有注释了:
再往下看58地址中,可以看到显示11111111
led.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: e59f0050 ldr r0, [pc, #80] ; 58
4: e59f1050 ldr r1, [pc, #80] ; 5c
8: e5810000 str r0, [r1]
0000000c :
c: e3e00008 mvn r0, #8
10: e59f1048 ldr r1, [pc, #72] ; 60
14: e5810000 str r0, [r1]
18: eb000008 bl 40
1c: e3e00010 mvn r0, #16
20: e59f1038 ldr r1, [pc, #56] ; 60
24: e5810000 str r0, [r1]
28: eb000004 bl 40
2c: e3e00020 mvn r0, #32
30: e59f1028 ldr r1, [pc, #40] ; 60
34: e5810000 str r0, [r1]
38: eb000000 bl 40
3c: eafffff2 b c
00000040 :
40: e59f201c ldr r2, [pc, #28] ; 64
44: e3a03000 mov r3, #0
00000048 :
48: e2422001 sub r2, r2, #1
4c: e1520003 cmp r2, r3
50: 1afffffc bne 48
54: e1a0f00e mov pc, lr
58: 11111111 tstne r1, r1, lsl r1
5c: e0200240 eor r0, r0, r0, asr #4
60: e0200244 eor r0, r0, r4, asr #4
64: 00895440 addeq r5, r9, r0, asr #8
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00001a41 andeq r1, r0, r1, asr #20
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 00000010 andeq r0, r0, r0, lsl r0
10: 45543505 ldrbmi r3, [r4, #-1285] ; 0x505
14: 08040600 stmdaeq r4, {r9, sl}
18: Address 0x00000018 is out of bounds.