一、反汇编的原理 & 为什么要反汇编
arm-linux-objdump -D led.elf > led_elf.dis
-D, --disassemble-all Display assembler contents of all sections
objdump 是 gcc 工具链中的反汇编工具,作用是由编译链接好的 elf 格式的可执行程序反过来得到汇编源代码.
-D 表示反汇编,> 左边的是 elf 的可执行程序(反汇编时的原材料),> 右边的是反汇编生成的反汇编程序。
反汇编的原因有以下:
- 逆向破解。
- 调试程序时,反汇编代码可以帮助我们理解程序(我们学习时使用 objdump 主要目的是这个),尤其是在理解链接脚本、链接地址等概念时。
- 把 C 语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解 C 语言和汇编语言之间的对应关系。非常有助于深入理解 C 语言。
二、反汇编文件的格式和看法
(汇编 assembly 反汇编 dissembly)
标号地址、标号名字、指令地址、指令机器码、指令机器码反汇编到的指令
扩展:ARM汇编中用地址池方式来实现非法立即数
1. 初识指令地址
下载烧录执行的 bin 文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是连接的时候 ld 给指定的(ld根据我们写的链接脚本来指定)。
2. 展望:反汇编工具帮助我们分析链接脚本
反汇编的时候,得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址。
但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。
root@ubuntu:/home/aston/workspace/git_xxx# arm-linux-ld --help | grep "Set address"
Set address of named section
-Tbss ADDRESS Set address of .bss section
-Tdata ADDRESS Set address of .data section
-Ttext ADDRESS Set address of .text section
-Ttext-segment ADDRESS Set address of text segment
root@ubuntu:/home/aston/workspace/git_xxx# cat Makefile
led.bin: led.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
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-ld -Ttext 0x0 -o led.elf $^
命令中的 -Ttext
指定代码段的起始地址,我们可以指定 0 地址,或者其他地址也行。
源自朱有鹏老师.