反汇编工具objdump的使用简介

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

学习网站: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-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:	e59f006c 	ldr	r0, [pc, #108]	; 74 
   4:	e59f106c 	ldr	r1, [pc, #108]	; 78 
   8:	e5810000 	str	r0, [r1]

0000000c :
   c:	e3a00030 	mov	r0, #48	; 0x30
  10:	e59f1064 	ldr	r1, [pc, #100]	; 7c 
  14:	e5810000 	str	r0, [r1]
  18:	eb00000f 	bl	5c 
  1c:	e3a00028 	mov	r0, #40	; 0x28
  20:	e59f1054 	ldr	r1, [pc, #84]	; 7c 
  24:	e5810000 	str	r0, [r1]
  28:	eb00000b 	bl	5c 
  2c:	e3a00018 	mov	r0, #24
  30:	e59f1044 	ldr	r1, [pc, #68]	; 7c 
  34:	e5810000 	str	r0, [r1]
  38:	eb000007 	bl	5c 
  3c:	e3a00028 	mov	r0, #40	; 0x28
  40:	e59f1034 	ldr	r1, [pc, #52]	; 7c 
  44:	e5810000 	str	r0, [r1]
  48:	eb000003 	bl	5c 
  4c:	e3a00030 	mov	r0, #48	; 0x30
  50:	e59f1024 	ldr	r1, [pc, #36]	; 7c 
  54:	e5810000 	str	r0, [r1]
  58:	ebffffeb 	bl	c 

0000005c :
  5c:	e59f201c 	ldr	r2, [pc, #28]	; 80 
  60:	e3a03000 	mov	r3, #0

00000064 :
  64:	e2422001 	sub	r2, r2, #1
  68:	e1520003 	cmp	r2, r3
  6c:	1afffffc 	bne	64 
  70:	e1a0f00e 	mov	pc, lr
  74:	11111111 	tstne	r1, r1, lsl r1
  78:	e0200240 	eor	r0, r0, r0, asr #4
  7c:	e0200244 	eor	r0, r0, r4, asr #4
  80:	00989680 	addseq	r9, r8, r0, lsl #13

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.



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

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

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

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



 

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

 

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

#define GPJ0CON	0xE0200240 
#define GPJ0DAT	0xE0200244

.global _start
_start:
	ldr r0, =0x11111111
	ldr r1, =GPJ0CON
	str r0, [r1]

flash:	
	ldr r0, =( (0<<3) | (1<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]

	bl delay
	
	ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]

	bl delay
	
	ldr r0, =( (1<<3) | (1<<4) | (0<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]	

	bl delay

	ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]	

	bl delay

	ldr r0, =( (0<<3) | (1<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]
	
	bl flash	
	
delay:
	ldr r2, =10000000
	ldr r3, =0x0
delay_loop:
	sub r2, r2, #1
	cmp r2, r3
	bne delay_loop
	mov pc, lr 


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





你可能感兴趣的:(ARM裸机)