反彙編工具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 <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
展望:反彙編工具幫助我們分析連結指令碼
反彙編的時候得到的指令地址是連結器考慮了連結指令碼之後得到的地址,而我們寫程式碼時通過指定連線指令碼來讓連結器給我們連結合適的地址。
但是有時候我們寫的連結指令碼有誤(或者我們不知道這個連結指令碼會怎麼樣),這時候可以通過看反彙編檔案來分析這個連結指令碼的效果,看是不是我們想要的,如果不是可以改了再看。
相關文章
- 反彙編專用工具——objdumpOBJ
- ARM-GUN彙編簡介
- IDA Pro for Mac(最強反彙編工具)Mac
- 反彙編命令U
- Java 反彙編、反編譯、volitale解讀Java編譯
- Android反編譯工具ApkTool的使用Android編譯APK
- Java反編譯工具使用對比,最好用的Java反編譯工具 --- JD-GUI、XJadJava編譯GUI
- 如何利用Capstone引擎寫一個Android反彙編工具Android
- Go彙編語法和MatrixOne使用介紹Go
- 反彙編器-javap.exe(轉)Java
- java反編譯工具Java編譯
- Android反編譯:反編譯工具和方法Android編譯
- apkTool---一個簡單好用的apk反編譯工具APK編譯
- GoldenGate的Logdump工具使用簡介Go
- Reflector(.Net的Dll反編譯工具)編譯
- .net反編譯工具ILSpy編譯
- C#反編譯工具:.NET Reflector基礎使用C#編譯
- 常見 APK 反編譯工具安裝與使用APK編譯
- 識別和避免反彙編中遇到的花指令
- Apache Commons 工具集使用簡介Apache
- 黑客反彙編解密 第一版黑客解密
- 簡單的介紹UNIX下的常用編輯工具VI(轉)
- jad反編譯工具的那些事編譯
- 使用匯編和反彙編引擎寫一個x86任意地址hookHook
- 一個Java反彙編器的修改 (7千字)Java
- GBase8s管理工具之SQL編輯器使用簡介SQL
- 使用ilasm 和 ildasm編譯和反編譯工具對DLL檔案修改ASMLDA編譯
- x64dbg(程式逆向反彙編修改神器)
- CRM工具簡介
- java中的編碼簡介Java
- android反編譯工具總結Android編譯
- C++ 反彙編:關於Switch語句的優化措施C++優化
- x86彙編反編譯到c語言之——(2)if語句編譯C語言
- [轉]andriod的apk檔案相關的編譯反編譯工具APK編譯
- GCC內聯彙編(2)GCC生成彙編程式碼簡單例項GC單例
- JSON簡介以及用法彙總JSON
- liunx進行 idea java 執行時反彙編IdeaJava
- C++ 反彙編:關於函式呼叫約定C++函式