反汇编工具objdump的使用简介

来源:互联网 发布:川航张芸芸事件知乎 编辑:程序博客网 时间:2024/06/11 03:47

《朱老师物联网大讲堂》学习笔记

学习网站:www.zhulaoshi.org


objdump是我们进行反汇编的工具


还记得Makefile文件吗?

led.bin: start.o 
arm-linux-ld -Ttext 0x0 -o led.elf $^

下载烧录执行的bin文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是连接的时候ld给指定的(ld根据我们写的链接脚本来指定)


arm-linux-objcopy -O binary led.elf led.bin
从可执行文件到可烧录的镜像文件

arm-linux-objdump -D led.elf > led_elf.dis
做反汇编的

gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin

%.o : %.S
arm-linux-gcc -o $@ $< -c


%.o : %.c
arm-linux-gcc -o $@ $< -c 


clean:
rm *.o *.elf *.bin *.dis mkx210 -f


这里我们关注的是这一句

arm-linux-objdump -D led.elf > led_elf.dis

这里使用的是gcc工具中的反汇编

由编译链接好的elf格式的可执行程序来反过来得到汇编源代码
-D表示反汇编,由此可见这个工具还有其它功能

> 左边的是elf格式的可执行程序,也就是反汇编时候的原材料,右边的是反汇编生成的反汇编程序

led.elf:     file format elf32-littlearmDisassembly of section .text:00000000 <_start>:   0:e59f006c ldrr0, [pc, #108]; 74 <delay_loop+0x10>   4:e59f106c ldrr1, [pc, #108]; 78 <delay_loop+0x14>   8:e5810000 strr0, [r1]0000000c <flash>:   c:e3a00030 movr0, #48; 0x30  10:e59f1064 ldrr1, [pc, #100]; 7c <delay_loop+0x18>  14:e5810000 strr0, [r1]  18:eb00000f bl5c <delay>  1c:e3a00028 movr0, #40; 0x28  20:e59f1054 ldrr1, [pc, #84]; 7c <delay_loop+0x18>  24:e5810000 strr0, [r1]  28:eb00000b bl5c <delay>  2c:e3a00018 movr0, #24  30:e59f1044 ldrr1, [pc, #68]; 7c <delay_loop+0x18>  34:e5810000 strr0, [r1]  38:eb000007 bl5c <delay>  3c:e3a00028 movr0, #40; 0x28  40:e59f1034 ldrr1, [pc, #52]; 7c <delay_loop+0x18>  44:e5810000 strr0, [r1]  48:eb000003 bl5c <delay>  4c:e3a00030 movr0, #48; 0x30  50:e59f1024 ldrr1, [pc, #36]; 7c <delay_loop+0x18>  54:e5810000 strr0, [r1]  58:ebffffeb blc <flash>0000005c <delay>:  5c:e59f201c ldrr2, [pc, #28]; 80 <delay_loop+0x1c>  60:e3a03000 movr3, #000000064 <delay_loop>:  64:e2422001 subr2, r2, #1  68:e1520003 cmpr2, r3  6c:1afffffc bne64 <delay_loop>  70:e1a0f00e movpc, lr  74:11111111 tstner1, r1, lsl r1  78:e0200240 eorr0, r0, r0, asr #4  7c:e0200244 eorr0, r0, r4, asr #4  80:00989680 addseqr9, r8, r0, lsl #13Disassembly of section .ARM.attributes:00000000 <.ARM.attributes>:   0:00001a41 andeqr1, r0, r1, asr #20   4:61656100 cmnvsr5, r0, lsl #2   8:01006962 tsteqr0, r2, ror #18   c:00000010 andeqr0, r0, r0, lsl r0  10:45543505 ldrbmir3, [r4, #-1285]; 0x505  14:08040600 stmdaeqr4, {r9, sl}  18:Address 0x00000018 is out of bounds.



反汇编的原因有以下
1.逆向破解
2.我们在调试程序时侯,反汇编代码可以帮助我们理解程序

3.把c源代码编译链接生成的可执行程序,反汇编后得到对应汇编代码,可以帮助

我们理解c语言和汇编语言之间的对应关系,非常有助于深入理解c语言

尤其是在理解链接脚本,链接地址,时候帮助非常大



 

扩展:ARM汇编中用地址池方式来实现非法立即数

 

下面是上面反汇编代码的汇编代码

#define GPJ0CON0xE0200240 #define GPJ0DAT0xE0200244.global _start_start:ldr r0, =0x11111111ldr r1, =GPJ0CONstr r0, [r1]flash:ldr r0, =( (0<<3) | (1<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delayldr r0, =( (1<<3) | (0<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delayldr r0, =( (1<<3) | (1<<4) | (0<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delayldr r0, =( (1<<3) | (0<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delayldr r0, =( (0<<3) | (1<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl flashdelay:ldr r2, =10000000ldr r3, =0x0delay_loop:sub r2, r2, #1cmp r2, r3bne delay_loopmov pc, lr 


展望:反汇编工具帮助我们分析链接脚本
反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址。
但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。





0 0
原创粉丝点击