反编译初识

一. 反编译(反汇编)简介

  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#
View Code

  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.
View Code

 参考《朱老师.1.2ARM裸机课件》

posted @ 2019-01-06 23:08  三七鸽  阅读(806)  评论(0编辑  收藏  举报