首页 > 编程知识 正文

c语言反编译教程,c语言反编译成汇编的工具

时间:2023-05-03 13:55:46 阅读:151312 作者:6

% e9 % a6 % 96 % E5 % 85 % 88 % E6 % 9d % a5 % E7 % 9c % 8b % E4 % b8 % 80 % E6 % b5 UNIX % 2f Linux % E4 % b8 % E7 % 25 % 2020 TT % 20of % 20 data % 20 items.% 25 % 20 % 20 following % 20 uses : % 0a % 20 % 23 % 20 % EDI % 20-% 20 holds % 20 the % 20 index % 20-% 20 current % 20 data % 20 item % 0a % 20 % 23 % 23 % 20 the % 20 following % 20 % 20s % 20-% 20 contains % 20 the % 20 item % 20 % 20.long % 203 % 2c 67 % 2c 34 % 2c 222 % 2c 45 % 2c 75 % 2c 54 % 2c 34 % 2c 33 % 2c 22 % 2c 11 % 2c 66 % 2c0% 0a % 20.secti iooo 0 % eax % 0a % 20 movl % 20 % eax % 20c % 25 % 20op _ exit % 0a % 20 incl % 20 % EDI % 0a % 20 movl % 20 data _ items % 28 % 28 % 2c op _ exit : % 0a % 20 movl % 20 % 241 % 2c % 20 % eax % 0a % 20 int % 20 % 240 X80 % 25 % 2083 % A8 % E5 % 88 % E5 % B0 % B1 % b5 % E4 % bb % a3 % E7 % A0 % 81 % E7 % 9a % 84 % E6 % 84 % E6 % 80 % 9d % E3 % 80 % 82.section % 203 % 80 % 82 % 0a % 20 da % 20 E5 % AE % 9a % E4 % B9 % 89 % E7 % 9a % 84 % E4 % b8 % b8 % a along % E5 % 8b % E7 % 9a % 84 % E6 % B0 % E7 % 20 % af 0 % 81 % e9 % 83 % A8 % E5 % 88 % E3 % 82 % 0a % 20.globl % 20 _ start % 20 % E8 % a1 % A8 % E7 % a4 % ba % E7 % 25 % 20a % ad % E8 % 20t % E8 % a6 % 81 % E8 % a2 % ab % e9 % 93 % be6 % E8 % a5 % E5 % 99 % A8 % E4 % BD % BF % E7 % 94 % A8 % ef % BC % E7 % 97 % 25 % 20 A8 % E4 % b8 % ad % E7 % 9a % 84 % E5 % 80 % BC % E8 % a1 % A8 % E7 % a4 % ba % E6 % 95 % B0 % E7 % bb % 84 % E7 % bb % 84 data _ items % 204 % be % E8 % 87 % B3 % E5 % af % 84 % E5 % ad % 98 % E5 % A8 % eax % 2c % E5 % 90 % E6 % B6 % E6 % E6 % E6 a % E6 % b5 % E7 % ba % 20 art _ loop % ef % BC %8cloop _ exit % e9 % 83 % BD % E5 % B1 % B1 % E4 % ba %8E6 % A0 % 87 % E7 % E7 % E7 % bb84 % E7 % 25 % 2083 % E7 % B4 % A0 % E4 % b8 % ba0 % ef % BC % 8c % E5 % 8d % b30 % E4 % b8 % ba % E5 % 93 % A8 % E5 % A8 % E5 8 % 8b % E5 % ba % 8f % E5 % B7 % B2 % eb2 % 25 % 204 % 84 % E6 % 89 % a7 % E8 % a1 % 8c % E3 % 82 % 0a % 20 incl % 20 % EDI % % b8 % 8b % E6 % A0 % 87 % ef % BC % 8c % E5 % 8f % 96 % E6 % 95 % 20 % ef % BC % 8c % E4 % b8 % ebx % E8 % BF % 9b % E8 % a1 % a1 % ebx % 2c % E4 % BF % 9d % E6 % 8c % 81 % ebx % E7 % bb % B4 % E6 % 200 % 82 % 0a % 20 movl % 20 % 241 % 2c % 20 % eax % 0a % b8 % e9 % 9d % a2 % E6 % 89 % E8 % ae2 % E7 % 9a % 84 % E5 % B1 % E6 % 98 % 20 % E4 % B9 % E3 % 80 % 82.% 0a % 20 % E6 % 8a

Data: 2's complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version: 0

Type: REL (Relocatable file)

Machine: Intel 80386

Version: 0x1

Entry point address: 0x0

Start of program headers: 0 (bytes into file)

Start of section headers: 200 (bytes into file)

Flags: 0x0

Size of this header: 52 (bytes)

Size of program headers: 0 (bytes)

Number of program headers: 0

Size of section headers: 40 (bytes)

Number of section headers: 8

Section header string table index: 5

...

上面的就是被解读出来的elf文件信息。

ELF Header中描述了操作系统是UNIX,体系结构是80386。Section Header Table中有8个Section Header,在文件中的位置(或者叫文件地址)从200(0xc8)开始,每个40字节,共320字节,到文件地址0x207结束。这个目标文件没有Program Header。

如果想要从目标文件反汇编的话,可以执行下述命令即可。

$ objdump -d test.o

test.o: file format elf32-i386

Disassembly of section .text:

00000000 <_start>:

0: bf 00 00 00 00 mov $0x0,%edi

5: 8b 04 bd 00 00 00 00 mov 0x0(,%edi,4),%eax

c: 89 c3 mov %eax,%ebx

0000000e :

e: 83 f8 00 cmp $0x0,%eax

11: 74 10 je 23

13: 47 inc %edi

14: 8b 04 bd 00 00 00 00 mov 0x0(,%edi,4),%eax

1b: 39 d8 cmp %ebx,%eax

1d: 7e ef jle e

1f: 89 c3 mov %eax,%ebx

21: eb eb jmp e

00000023 :

23: b8 01 00 00 00 mov $0x1,%eax

28: cd 80 int $0x80

上面右边的代码就是反汇编后生成的代码,对比一下本身的代码和反汇编后的有何区别,会发现很多该出现地址的地方都是0,这是因为程序只有在链接的时候才会真正的把函数以及变量的地址加载进代码中来。

我们对可执行程序反汇编一下,就知道结果了:

$ objdump -d test

test: file format elf32-i386

Disassembly of section .text:

08048074 <_start>:

8048074: bf 00 00 00 00 mov $0x0,%edi

8048079: 8b 04 bd a0 90 04 08 mov 0x80490a0(,%edi,4),%eax

8048080: 89 c3 mov %eax,%ebx

08048082 :

8048082: 83 f8 00 cmp $0x0,%eax

8048085: 74 10 je 8048097

8048087: 47 inc %edi

8048088: 8b 04 bd a0 90 04 08 mov 0x80490a0(,%edi,4),%eax

804808f: 39 d8 cmp %ebx,%eax

8048091: 7e ef jle 8048082

8048093: 89 c3 mov %eax,%ebx

8048095: eb eb jmp 8048082

08048097 :

8048097: b8 01 00 00 00 mov $0x1,%eax

804809c: cd 80 int $0x80现在反汇编的代码中已经把绝对地址都加在进程序中了。从这个角度来理解编译和链接应该更深入一些,编译只是检查语法错误,对应的地址都是虚拟地址(即被MMU单元截获了地址),链接时,把虚拟地址转化为绝对地址,加载进可执行文件中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。