当前位置: 首页 > 图文教程 > 网络安全 > 杀毒防毒 > 剖析Linux病毒原型工作过程和关键环节

杀毒防毒
来自微软的免费杀毒软件抢先试用
金山毒霸全新功能体验版抢先曝光
IRC后门病毒技术分析及手动清除方法
MSN性感鸡变种刚过,QQ病毒又来捣乱
Win XP中震荡波后应采取的措施
病毒应急处理中心提醒防范高波病毒及其变种
北京公安局、瑞星发布6月13日危险病毒警报
防御计算机病毒十大必知步骤
网吧用QQ隐私难保 黑客工具窥视QQ聊天记录
用MailSpy拦截局域网内危险的病毒邮件
如何根据名称识别计算机病毒
Norton AntiVirus 2005测试版截图大赏
快速干掉感染Internet Explorer的恶意程序
邮件病毒入侵后五个清除步骤
Win 2000防毒从安装系统时开始
木马病毒清除的通用解法
快速有效地封杀—巧利用Iris来查找蠕虫病毒
防病毒必务宝典—计算机病毒专杀进程列表
网络安全之特洛伊木马攻防战略
3721上网助手清除专家

杀毒防毒 中的 剖析Linux病毒原型工作过程和关键环节


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 53 ::
收藏到网摘: n/a

 

  一、 介绍

  写这篇文章的目的主要是对最近写的一个Linux病毒原型代码做一个总结,同时向对这方面有兴趣的朋友做一个简单的介绍。阅读这篇文章你需要一些知识,要对ELF有所了解、能够阅读一些嵌入了汇编的C代码、了解病毒的基本工作原理。

  二、 ELF Infector (ELF文件感染器)

  为了制作病毒文件,我们需要一个ELF文件感染器,用于制造第一个带毒文件。对于ELF文件感染技术,在Silvio Cesare的《UNIX ELF PARASITES AND VIRUS》一文中已经有了一个非常好的分析、描述,在这方面我还没有发现可以对其进行补充的地方,因此在这里我把Silvio Cesare对ELF Infection过程的总结贴出来,以供参考:

The final algorithm is using this information is.
* Increase p_shoff by PAGE_SIZE in the ELF header
* Patch the insertion code (parasite) to jump to the entry point
(original)
* Locate the text segment program header
* Modify the entry point of the ELF header to point to the new
code (p_vaddr + p_filesz)
* Increase p_filesz by account for the new code (parasite)
* Increase p_memsz to account for the new code (parasite)
* For each phdr who's segment is after the insertion (text segment)
* increase p_offset by PAGE_SIZE
* For the last shdr in the text segment
* increase sh_len by the parasite length
* For each shdr who's section resides after the insertion
* Increase sh_offset by PAGE_SIZE
* Physically insert the new code (parasite) and pad to PAGE_SIZE, into
the file - text segment p_offset + p_filesz (original)

  在Linux病毒原型中所使用的gei - ELF Infector即是根据这个原理写的。在
附录中你可以看到这个感染工具的源代码: g-elf-infector.c

g-elf-infector与病毒是独立开的,其只在制作第一个病毒文件时被使用。我简单介
绍一下它的使用方法,g-elf-infector.c可以被用于任何希望--将二进制代码插入到指定文件的文本段,并在目标文件执行时首先被执行--的用途上。g-elf-infector.c的接口很简单,你只需要提供以下三个定义:

* 存放你的二进制代码返回地址的地址,这里需要的是这个地址与代码起始
地址的偏移,用于返回到目标程序的正常入口
#define PARACODE_RETADDR_ADDR_OFFSET 1232

* 要插入的二进制代码(由于用C编写,所以这里需要以一个函数的方式提供)
void parasite_code(void);

* 二进制代码的结束(为了易用,这里用一个结尾函数来进行代码长度计算)
void parasite_code_end(void);

parasite_code_end应该是parasite_code函数后的第一个函数定义,通常应该如下表示
void parasite_code(void)
{
...
...
...
}
void parasite_code_end(void) {}

  在这里存在一个问题,就是编译有可能在编译时将parasite_code_end放在parasite_code
地址的前面,这样会导致计算代码长度时失败,为了避免这个问题,你可以这样做
void parasite_code(void)
{
...
...
...
}
void parasite_code_end(void) {parasite_code();}

  有了这三个定义,g-elf-infector就能正确编译,编译后即可用来ELF文件感染

face=Verdana>

  三、病毒原型的工作过程

  1 首先通过ELF Infector将病毒代码感染到一个ELF文件,这样就创造了第一
个带毒文件,后续的传播就由它来完成。

  2 当带毒文件被执行时,会首先跳到病毒代码开始执行。

  3 病毒代码开始发作,在这个原型里,病毒会直接开始传播。

  4 病毒遍历当前目录下的每一个文件,如果是符合条件的ELF文件就开始感染。

  5 病毒的感染过程和ELF Infector的过程类似,但由于工作环境的不同,代码的实现也是有较大区别的。

  6 目前传染对ELF文件的基本要求是文本段要有剩余空间能够容纳病毒代码,如果无法满足,病毒会忽略此ELF。对于被感染过一次的ELF文件,文本段将不会有剩余的空间,因此二次感染是不会发生的。

  7 病毒代码执行过后,会恢复堆栈和所有寄存器(这很重要),然后跳回到真正的可执行文件入口,开始正常的运行过程。

  上面对病毒原型的工作过程的介绍也许显得千篇一律了,和我们早就熟知的关于病毒的一些介绍没有什么区别?是的,的确是这样,原理都是类似的,关键是要看实现。下面我们就将通过对一些技术问题的分析来了解具体的实现思路。

  四、关键技术问题及处理

  1 ELF文件执行流程重定向和代码插入

  在ELF文件感染的问题上,ELF Infector与病毒传播时调用的infect_virus思路是一样的:

  * 定位到文本段,将病毒的代码接到文本段的尾部。这个过程的关键是要熟