elf文件反编译C语言,ELF文件解析和反汇编
首先来看一段Unix/Linux下的汇编代码:
#PURPOSE: This program finds the maximum number of a
# set of data items.
##VARIABLES: The registers have the following uses:
## %edi - Holds the index of the data item being examined
# %ebx - Largest data item found
# %eax - Current data item
## The following memory locations are used:
## data_items - contains the item data. A 0 is used
# to terminate the data
#
.section .data
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
.section .text
.globl _start
_start:
movl $0, %edi
movl data_items(,%edi,4), %eax
movl %eax, %ebx
start_loop:
cmpl $0, %eax
je loop_exit
incl %edi
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
被红色注释的部分就是汇编代码,先大概的解释一下这段代码的意思。.section .data表示的是数据段。
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
表示的是定义的一个long型的数组。
.section .text 表示的是代码区段。下面的部分就是真正的代码部分。
.globl _start 表示的定义了一个全局的标识符_start,相当C语言中的标签作用,_start要被链接器使用,相当C语言中的main函数一样,是整个程序的入口。
用%edi寄存器中的值表示数组下标
movl data_items(,%edi,4), %eax
movl %eax, %ebx
表示把取数组data_items中的第%edi的值,存放至寄存器%eax,同时%ebx表示的是数组中的最大值,初始化为数组的第一个元素。
start_loop,loop_exit都属于标签性质。
cmpl $0, %eax
je loop_exit
因为我们定义数组的时候,最后一个元素为0,即0为哨兵,比较%eax和0,如果相等的话,表示程序已经完成,跳转至loop_exit处执行。
incl %edi
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
否则移动数组下标,取数组的下一个元素值,与%ebx进行比较,若%eax中的值比%ebx值大,则将%eax值给%ebx,保持%ebx维持是数组的最大值。
movl $1, %eax
int $0x80
表示exit退出,并且退出码为1.
上面所讲的就是该段汇编代码的涵义。.
把上述的汇编代码编辑在test.s文档中,然后执行下面的命令:
as test.s -o test.o
ld test.o -o test
Unix/Linux中的可执行文件都是采用的ELF文件格式标准,但是有3中不同的类型:
<1>.可重定位的目标文件(Relocatable Object file)
<2>.可执行文件(Executable file)
<3>.共享库(Shared library)
我们通过分析ELF文件的组成,来了解编译和链接的过程。
我们用Linux下带的工具来查看elf文件,用下述命令即可:
$ readelf -a test.o
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
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单元截获了地址),链接时,把虚拟地址转化为绝对地址,加载进可执行文件中。
elf文件反编译C语言,ELF文件解析和反汇编相关推荐
- elf文件反编译C语言,如何将ELF可执行文件转换为C代码?生成的C代码不需要是人类可读的...
我有一个ELF文件,我想反编译成C代码,并对生成的C代码进行简单的更改,并将其重建为ELF. 反编译的C代码不需要完全是人类可读的.例如,如果变量和函数名称被混淆,那就没关系. 我可以使用哪些工具在L ...
- elf文件反编译C语言,图文并茂,讲透C语言静态链接,ELF文件篇
gcc生成执行文件过程为:源文件(*.c文件)编译成对象文件(*.o文件); 链接程序ld,把对象文件(*.o文件)链接成可执行程序. 因此要透彻链接的过程, 需要先了解对象文件(*.o文件)是怎样构 ...
- 对Android APK文件反编译查看其源码
概述 作为android的开发者,相信你会有那么一刻,比如,对于手机中某一款App,有一项功能或者效果你蛮喜欢的,想学习一下它具体是怎么实现的.追求高一点的话,我想深究它这个App的项目架构,本着一探 ...
- Android APK+Dex文件反编译及回编译工具(APKDB)v.1.9.2 正式版
http://idoog.me/?p=1913 [Android APK+Dex文件反编译及回编译工具 (APKDB)v.1.9.2 正式版] <APK+Dex文件反编译及回编译工具> 简 ...
- 什么是pyc文件,把python的py文件编译成pyc文件,把pyc文件反编译成py文件。以及python编译的如何设置不生成pyc文件
文章目录 1 什么是pyc文件 1.1 什么是pyc文件 1.2 pyc文件是怎么生成的,有什么好处 2 把python的py文件编译成pyc文件 2.1 使用python内置库py_compile把 ...
- java在控制台中的反编译指令,反编译class-class文件反编译工具 v0.3.7免费版
反编译class class文件反编译工具是一款class文件反向编译的java工具,它能够将class文件逆向编译为java语言.此款软件比较小巧,特别适合初学者使用,感兴趣的赶紧下载啊! clas ...
- pyc文件反编译为py文件
近期时不时需要把工程里的 pyc 文件反编译出来,查看接口函数的逻辑.此前有师兄安利了uncompyle6工具,我使用了几次,发现反编译出来的代码逻辑很清晰,此处我也不能打包票 uncompyle6 ...
- 请教大家:如何把.DCU文件反编译回源代码?谢谢。
请教大家:如何把.DCU文件反编译回源代码?谢谢. Delphi / Windows SDK/API http://www.delphi2007.net/DelphiAPI/html/delphi_2 ...
- Android-apk文件反编译
一:工具介绍及下载 1:apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 2:dex2jar 作用:将apk反编译成java源码(classes ...
- 反编译C#的dll文件并修改,再重新生成dll
1.把dll文件导入到ildasm工具中,ildasm是由微软提供的.net程序反编译工具,位于"C:\Program Files\Microsoft SDKs\Windows\v6.0A\ ...
最新文章
- java itemcf_大规模电商推荐数据分析-基于ItemCF的召回
- linux 安全审计
- 5分钟看懂微服务架构下的Consul 特性及搭建
- c# wifi串口通信_C# 串口通信总结
- Linux select()
- ionic应用程序文件保存和清除缓存
- 第5次作业+105032014070+胡阳洋
- 华为5g鸿蒙麒麟,华为5G亮王牌:鸿蒙系统+7800W+麒麟990+防水,钱包按耐不住!
- samkoon触摸屏用什么软件编程_samdraw3.3软件下载
- matlab 滤波器设计 coe_巴特沃斯滤波器
- Excel小笔记——冻结窗格
- 求 Fibonacci 数列的前 20 项
- 从底层操作系统到容器云平台:OpenCloudOS与秒云构筑完美兼容链
- [译]数据包在 Kubernetes 中的一生(2)
- 经典非局部均值滤波(NLM)算法python实现(1)
- latex tips 偏导数符号 单词partial+倒三角 \nabla
- python和前端哪个好_python和java哪个好用
- Unity Steam_VR VRTK开发插件自带案例详解(一)
- 第一个被赋予公明身份的机器人_史上首次 沙特授予“女性”机器人索菲娅公民身份...
- CTFshowWeb入门nodejs