author:luojiafei
blog: http://blog.csdn.net/luojiafei
e-mail: 1196722167@qq.com
data: 2012/1/5
自己动手写病毒—ELF文件病毒
对病毒的兴趣由来已久,所以在空闲的时间来很多时候都是逛逛技术网站,在不经意间发现了国外有一篇关于ELF文件病毒的文章,藉着之前为一个课程任务而编写操作系统的期间而积累下来的经验,便花了几天时间去研究了一下ELF文件病毒 并且写下了一个名为helloworld(这个名字够俗啊!),其实就是感染每一个ELF可执行文件,当用户运行被感染的文件时,就会运行一个我预先用qt写好的标题为”helloworld”的对话框,可见这是一个相对友好的病毒,仅仅是为学习而写出来的。下面便是正题了,通过这篇文章我们能学到:
1.elf文件格式
2.自己编写Linux的系统调用,加深对linux内核的认识。
3.病毒原理和逆向工程分析,我们会用到EDB(即linux下的ollydgb)来动态调试病毒.
1.ELF文件格式
a.ELF文件类型
ELF文件主要分为三种类型:
ñ 可重定位文件(Relocatable File)包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。
ñ 可执行文件(Executable File) 包含适合于执行的一个程序,此文件规定了exec() 如何创建一个程序的进程映像。
ñ 共享目标文件(Shared Object File) 包含可在两种上下文中链接的代码和数据。首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件。其次,动态链接器(Dynamic Linker)可能将它与某个可执行文件以及其它共享目标一起组合,创建进程映像。
b.ELF文件的数据表示
ELF文件头结构及相关常数被定义在”/usr/include/elf.h”里。ELF目标文件中的所有数据结构都 遵从自然大小和对齐规则。如果 必要,数据结构可以包含显式的补齐,例如为了确保4字节对象按 4字节边界对齐。数据对齐同样适用于文件内部。下面为ELF中常用的数据格式:
名称 |
大小 |
对齐 |
描述 |
Elf32_Addr |
4 |
4 |
无符号程序地址 |
Elf32_Half |
2 |
2 |
无符号短整型 |
Elf32_Off |
4 |
4 |
无符号偏移地址 |
Elf32_Sword |
4 |
4 |
有符号整型 |
Elf32_Word |
4 |
4 |
有符号整型 |
ELF除了32位版还有64位版本,数据类型的名称和大小也相应地变化(Elf64_Addr…)。
c.ELF的链接视图和执行视图
目标文件既要参与程序链接又要参与程序执行。出于方便性和效率考虑,目标文件格式提供了两种 并行视图,分别反映了这些活动的不同需求。
这两个视图并不冲突,在执行视图中的”Segment”是由链接视图中的多个权限和性质相仿 的”Section”组成的。
下面我们便来一边看例子一边学习。例如一个test程序,
#include<stdio.h>
intmain()
{
printf("this is test\n");
return 0;
}
我们用readelf -e test查看会出现4个部分,分别为ELF Header, Section Headers, ProgramHeaders 和 Section to Segment mapping.
(1)ELF Header:
在usr/include/elf.h中我们可以看到关于ELF Header的结构体Elf32_Ehdr
/* The ELF file header. This appears at the start of every ELFfile. */
#define EI_N