學(xué)習(xí)ARM反匯編工具objdump和一個(gè)簡單實(shí)例
1、反匯編的原理&為什么需要反匯編
ARM-linux-objdump -D led.elf > led_elf.dis
objdump是gcc工具鏈中的反匯編工具,作用是由編譯鏈接好的elf
格式的可執(zhí)行程序,來反過來得到匯編源代碼。
-D表示反匯編。
>左邊的是ELF的可執(zhí)行程序(反匯編時(shí)候的原材料)
>右邊的是反匯編生成的反匯編程序。其實(shí)就是一個(gè)匯編語言。
一般情況下我們寫一個(gè)源代碼
類似于我們WINDOW里面是EXE的格式,PE格式是官方的名字。
2、為什么我們需要進(jìn)行反匯編,我們要的就是可執(zhí)行程序。
反匯編的原因有以下:
1、逆向破解
你想盜版的原來的程序,最終得到程序的源代碼。
2、調(diào)式程序的時(shí)候,反匯編代碼可以幫助我們理解程序。
(我們學(xué)習(xí)時(shí)使用objdump主要目的是這個(gè)),
尤其是在理解鏈接腳本,鏈接地址等概念時(shí)候。
尤其是在理解鏈接的時(shí)候,用反匯編對你的理解非常大。
如果你是C語言寫的源代碼,反匯編之后得到的匯編語言的源代碼,
可以有助于你理解C和匯編之間的關(guān)系,
非常有助于理解深入理解C語言。
3、反匯編文件的分析:
(1)第一個(gè)是標(biāo)號比如000000這些是代表當(dāng)前的地址
(2)第二個(gè)標(biāo)號比如e59f0050:代表的是機(jī)器碼的意思,其實(shí)我們寫的所有的可執(zhí)行程序都是機(jī)器碼
只不過匯編語言就是相當(dāng)于一句匯編語言對應(yīng)一個(gè)機(jī)器碼,這樣我們編程就不用像以前那么辛苦了。
0:e59f0050 ldrr0, [pc, #80]; 58
這句話是 ldr r0, =0x11111111 // 從后面的=可以看出用的是ldr偽指令,因?yàn)樾枰幾g器來判斷這個(gè)數(shù)
編譯器翻譯出來就是上面的一句話,0x11111111這個(gè)數(shù)是ARM偽指令提供的。
那么到底機(jī)器把這句話放置在哪里呢?
把這句話放置在58這個(gè)地址中,后面已經(jīng)有注釋了:
再往下看58地址中,可以看到顯示11111111
led.elf: file format elf32-littlearm
Disassembly of section .text:
00000000<_start>:
0:e59f0050 ldrr0, [pc, #80]; 58
4:e59f1050 ldrr1, [pc, #80]; 5c
8:e5810000 strr0, [r1]
0000000c:
c:e3e00008 mvnr0, #8
10:e59f1048 ldrr1, [pc, #72]; 60
14:e5810000 strr0, [r1]
18:eb000008 bl40
1c:e3e00010 mvnr0, #16
20:e59f1038 ldrr1, [pc, #56]; 60
24:e5810000 strr0, [r1]
28:eb000004 bl40
2c:e3e00020 mvnr0, #32
30:e59f1028 ldrr1, [pc, #40]; 60
34:e5810000 strr0, [r1]
38:eb000000 bl40
3c:eafffff2 bc
00000040:
40:e59f201c ldrr2, [pc, #28]; 64
44:e3a03000 movr3, #0
00000048:
48:e2422001 subr2, r2, #1
4c:e1520003 cmpr2, r3
50:1afffffc bne48
54:e1a0f00e movpc, lr
58:11111111 tstner1, r1, lsl r1
5c:e0200240 eorr0, r0, r0, asr #4
60:e0200244 eorr0, r0, r4, asr #4
64:00895440 addeqr5, r9, r0, asr #8
Disassembly 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.
4、反匯編文件的格式和看法
標(biāo)號地址、標(biāo)號名字、指令地址、指令機(jī)器碼
指令機(jī)器碼反匯編到的指令
擴(kuò)展:ARM匯編中用地址池的方式實(shí)現(xiàn)非法立即數(shù)。
指令和地址是一一對應(yīng)的,
我們下載燒錄的bin文件,內(nèi)部其實(shí)就是
一條一條的指令機(jī)器碼,這些指令每一條都有一個(gè)指令地址。
這個(gè)地址是連接的ld給根據(jù)我們寫的鏈接腳本來指定的。
-Ttext :指定我們的起始地址的。
所有的地址都從別的地址開始執(zhí)行,根據(jù)你的地址來執(zhí)行。
5、展望:反匯編工具幫助我們分析鏈接腳本
反匯編的時(shí)候得到的地址是鏈接器考慮了鏈接腳本之后得到的地址,而
我們寫代碼是通過指定鏈接腳本來讓鏈接器給我們鏈接合適的地址。
但是有時(shí)候我們寫的鏈接腳本有誤,或者我們不知道
這個(gè)鏈接腳本會(huì)怎么樣?
這時(shí)候可以通過看反匯編文件分析這個(gè)鏈接腳本的效果。
看是不是我們想要的,如果不是的話可以改了再看。