反彙編工具objdump的使用簡介

qq_18973645發表於2016-03-27

《朱老師物聯網大講堂》學習筆記

學習網站: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 <delay_loop+0x10>
   4:	e59f106c 	ldr	r1, [pc, #108]	; 78 <delay_loop+0x14>
   8:	e5810000 	str	r0, [r1]

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

0000005c <delay>:
  5c:	e59f201c 	ldr	r2, [pc, #28]	; 80 <delay_loop+0x1c>
  60:	e3a03000 	mov	r3, #0

00000064 <delay_loop>:
  64:	e2422001 	sub	r2, r2, #1
  68:	e1520003 	cmp	r2, r3
  6c:	1afffffc 	bne	64 <delay_loop>
  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 


展望:反彙編工具幫助我們分析連結指令碼
反彙編的時候得到的指令地址是連結器考慮了連結指令碼之後得到的地址,而我們寫程式碼時通過指定連線指令碼來讓連結器給我們連結合適的地址。
但是有時候我們寫的連結指令碼有誤(或者我們不知道這個連結指令碼會怎麼樣),這時候可以通過看反彙編檔案來分析這個連結指令碼的效果,看是不是我們想要的,如果不是可以改了再看。





相關文章