反编译初识
一. 反编译(反汇编)简介
1.1. 为什么要反编译(汇编 assembly 反汇编 dissembly)
1.1.1. 反编译原因如下:
a. 逆向破解程序,作为一个有逼格,素养的我肯定不会这么干的。哈哈
b. 调试程序时,反汇编代码可以帮助我们理解程序(我们学习时使用objdump主要目的是这个),尤其是在理解链接脚本、链接地址等概念时
c. 把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。
1.2. 反编译命令
1.2.1. arm-linux-objdump -D led.elf > led_elf.dis 命令
a. objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码
b. -D表示反汇编
1.2.1. 获得反编译文件过程
a. 此过程是基于上篇文章《编写第一个裸机程序》,前期准备参考此文章
b. 反编译后生成led_elf.dis
root@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED# ls led.S Makefile mkv210_image.c write2sd 说明.txt root@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED# make arm-linux-gcc -o led.o led.S -c arm-linux-ld -Ttext 0x0 -o led.elf led.o 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 root@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED# ls 210.bin led.elf led.o Makefile mkx210 说明.txt led.bin led_elf.dis led.S mkv210_image.c write2sd root@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED#
1.3. 反编译文件led_elf.dis分析
1.3.1. 我们选取一段分析
00000000 <_start>: 0: e59f1060 ldr r1, [pc, #96] ; 68 <delay_loop+0x10>
a. 00000000 <_start>: 表示 标号地址、标号名字
b. 0: e59f1060表示指令地址、指令机器码
c. ldr r1, [pc, #96]表示指令机器码反汇编到的指令,由于有流水线的存在,此时PC值是当初指令地址+9;
d. 68 <delay_loop+0x10>表示注释;0x68 = 96+8
led.elf: file format elf32-littlearm Disassembly of section .text: 00000000 <_start>: 0: e59f1060 ldr r1, [pc, #96] ; 68 <delay_loop+0x10> 4: e59f0060 ldr r0, [pc, #96] ; 6c <delay_loop+0x14> 8: e5810000 str r0, [r1] 0000000c <while>: c: e59f105c ldr r1, [pc, #92] ; 70 <delay_loop+0x18> 10: e3e00008 mvn r0, #8 14: e5810000 str r0, [r1] 18: eb00000c bl 50 <delay> 1c: e59f104c ldr r1, [pc, #76] ; 70 <delay_loop+0x18> 20: e3e00010 mvn r0, #16 24: e5810000 str r0, [r1] 28: eb000008 bl 50 <delay> 2c: e59f103c ldr r1, [pc, #60] ; 70 <delay_loop+0x18> 30: e3e00020 mvn r0, #32 34: e5810000 str r0, [r1] 38: eb000004 bl 50 <delay> 3c: e59f102c ldr r1, [pc, #44] ; 70 <delay_loop+0x18> 40: e3e00010 mvn r0, #16 44: e5810000 str r0, [r1] 48: eb000000 bl 50 <delay> 4c: eaffffee b c <while> 00000050 <delay>: 50: e59f201c ldr r2, [pc, #28] ; 74 <delay_loop+0x1c> 54: e3a03000 mov r3, #0 00000058 <delay_loop>: 58: e2422001 sub r2, r2, #1 5c: e1520003 cmp r2, r3 60: 1afffffc bne 58 <delay_loop> 64: e1a0f00e mov pc, lr 68: e0200240 eor r0, r0, r0, asr #4 6c: 00111000 andseq r1, r1, r0 70: e0200244 eor r0, r0, r4, asr #4 74: 00895440 addeq r5, r9, r0, asr #8 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.2ARM裸机课件》