论文部分内容阅读
摘 要:着重设计一种增强linux系统中的ELF文件自免疫能力的方法,通过改进ELF存储结构来实现对常见病毒类型的天然免疫。
关键词:ELF;自免疫
中图分类号:TP309.5文献标识码:A
Research of the ELF's Self-immunity
SHI Wei-hang,WANG Rui-juan
(Software Technology School, Zheng Zhou University, Henan Zhengzhou 450002)
Key words: ELF;Self-immunity
随着网络技术的发展,终端的种类和数量均不断增加,且终端间的数据交换也越趋频繁,这为计算机病毒的广泛和快速传播提供了契机。作为当前最流行的类UNIX服务器平台,针对Linux操作系统所设计的木马和病毒也逐年增多。而这些木马和病毒又多通过分析和感染Linux下的开源ELF格式文件来危害宿主。ELF文件是Linux系统中最常用的可执行文件格式,它能够显著提高Linux下程序文件的可移植性,但其定义格式也导致其易被病毒感染。
当前常用的对抗计算机病毒的一般过程为:预防、检测和杀毒。但是这种“先感染再查杀”的被动防御方法依赖于频繁的对病毒特征码的分析,而对病毒已造成的数据、信息损失无法挽回,且需要经常升级病毒特征库。
1 病毒感染方式
针对ELF格式文件的病毒通常有三种寄生方式:直接覆盖宿主、向宿主文件插入病毒体、将病毒代码植入ELF本身的填充字段。第一种方式会破坏可执行文件的原始数据,导致染毒文件不可用。这种方式很容易被发现,达不到病毒设计的初衷,因此很少使用。第二种方式不破坏宿主文件,仅将病毒代码加入程序执行流程,通常存在于宿主的代码段和数据段前后的空闲区。第三种方法是在ELF本身的填充字段中将病毒植入。针对上述几种常见的病毒寄生方式,本文设计了一种能够使得ELF文件具有一定天然免疫能力的改进方法。
2 ELF文件自免疫设置
ELF文件由文件头(ELF Header)、程序头表(Program Header Table)、节头表(Section Header Table)以及段(Segment)或节(Section)组成,如图1所示。其中,文件头位于程序的开始部位,包含描述本文件结构的路线图(road map),程序头表保存了如何将程序加载到内存的信息,而节头表描述的是程序节的具体信息。这三个结构共同决定了目标文件间的连接方式、载入内存的方法以及执行方法。因此病毒体寄生宿主,驻留内存时必须修改寄主的文件头、程序头表和节头表信息,然后才能将自身代码插入寄主文件体中。因此本文所探讨的这种自免疫方法也将从这三个结构入手。
ELF二进制静态文件节中的填充区可以位于区首或区尾。而病毒则选择合适大小的填充区插入其自身代码。为预防发生这种情况,我们可以在ELF文件的填充区中写入随机数据,并将文件的相关信息记录在新节中,以便在文件运行前进行病毒检验。具体方法如下:
2.1修改程序头表
ELF文件的每个节都有填充区的存在,而该填充区的大小可以从程序头表中获取。程序头表中的字段p_filesz表示该段在静态文件中所占据的空间,而字段p_memsz则表示其在内存中占用的空间大小,其差值即内存映像中填充区域的大小。且ELF文件规定p_memsz不会比p_filesz大。若将前者修改成与后者相同大小,即使p_filesz-p_memsz=0,则病毒将认为填充区大小不适合其插入,并最终放弃感染。
以上工作需要通过对程序头表的分析和修改来完成,具体步骤如下:
①在Linux系统中,若想修改程序头表,需要首先使用系统调用mprotect将其所在文件的操作属性改为可读可写可执行(rwx);
⑵读程序头表。程序头表中的各个可载入段入口按其各自的p_vaddr升序排列。将其分别读取,并计算填充区大小,该区域的起始位置在p_vaddr+p_memsz处;
③生成随机数据写入填充区;
④修改程序头结构。将程序头中的p_memsz大小设为与p_filesz相同。
2.2禁止插入新节(段)
与上述的插入型病毒不同,附加型病毒的实现方式是在文件尾部追加病毒体,该方法无需担心破坏执行宿主所需的信息。它会修改程序的入口点,使其自身能先于宿主执行,对系统造成破坏。对于这类型的病毒,可以通过设置使其无法插入新节来预防。ELF文件节的构成属性导致目标文件中可以存在"非活动空间",即节之间可以有空闲区域。这个属性既为ELF文件带来更高的灵活性,也为病毒提供了容身之处。为解决这个问题,我们可以将各节之间的空闲区域取消,使得各节顺序相连。
设i,j为两个相邻的节,且i为j的前趋,j为i的后继,则取消空闲区的步骤为:①根据ELF文件头中所获得的节头表地址e_shoff定位节头表,从中获取需要移动的节j的大小及其当前起始位置;②计算空闲区域大小。
两节之间的空闲区大小S可由下式得到:
S=sh_addrj-(sh_addri+sh_sizei-1)
上式中,ELF32_Addr类型的sh_addri字段在节头表中出现,它表明了当前节i在内存中的位置,而ELF32_Word类型的字段sh_sizei则指出了当前节i的大小,因此节i的结束位置为(sh_addri+sh_sizei-1)。再由ELF文件头中的e_shoff字段得到节头表在目标文件中的偏移量,从节头表中获取后继节j的起始地址sh_addrj,即可算出空闲区大小。③将节j当前位置处的sh_sizej大小的数据复制到紧邻节i处;④将节j的新起始位置记入节头表的相应记录中;⑤判断节j是否文件的最后一个节,若是,则将节头表复制到节j的后面;若不是,返回①继续。这种方法虽然麻烦,但从根本上消除了节间的空闲区域,使病毒无法找到可插入的空间,对小型且关键性文件尤为适用。
2.3自免疫防毒
上述办法针对直接在文件或内存映像中插入代码的病毒起到较好的免疫作用,接下来我们又在ELF文件中增加一些自免疫防毒的代码,以增强对插入病毒代码后又修改节头表等关键数据的病毒的自免疫能力。在添加自免疫代码前,需要在文件中增加一个新节,该节中记录程序的关键数据:文件入口e_entry、程序头表地址、节头表地址、各节或各段的实际长度等。且该节中还应设置一个校验字段,当直接覆盖型病毒修改文件后,在程序开始运行时,首先与该校验字段相比较,若产生变化,则说明文件已经中毒。
对于已发现染毒的ELF文件,需要进行修复工作。具体步骤如下:①关闭染毒文件:使用kill指令终止染毒文件工作,避免其对系统造成更大破坏。②由文件头中的e_entry找到文件的绝对路径,使用该路径寻找预存的备份文件覆盖被染毒文件。该步骤的正常运行取决于备份文件的正确性,因此需要在源文件与备份文件间建立一个可靠连接。最简单的办法之一就是将备份文件命名为源文件名的MD5加密后的密文,密钥则使用文件拥有者的密码。③恢复完成后,在恢复后的文件中添加一个新节,其中放置被保护程序的关键数据以及免疫代码等重要信息;④修改文件头,记录恢复后文件的各节和各段的相应信息:根据备份文件头中的相应字段值对恢复后文件进行修复;⑤终止恢复程序的运行:当恢复程序完成上述任务后,对本次修复的完成情况、发生时间等信息进行记录后,自行结束工作退出内存。
3 结束语
尽管现代病毒已不仅仅使用一种感染方式,但本质仍具有各种典型感染方式的相应特性。本文根据Linux系统中ELF文件病毒的感染机制的特点,设计了一种对关键ELF文件进行自免疫设置与检测、恢复的方法。经验证该方法能较有效的阻止常见ELF病毒的侵袭,达到了设计的初衷。
参考文献:
[1]谢瑶,潘剑峰,朱明.Linux/Unix环境中ELF格式病毒的分析[J].计算机工程,2005(2).
[2]向文杰,李毅.Linux环境下ELF文件型病毒的分析[J].科技信息,2006(9).
关键词:ELF;自免疫
中图分类号:TP309.5文献标识码:A
Research of the ELF's Self-immunity
SHI Wei-hang,WANG Rui-juan
(Software Technology School, Zheng Zhou University, Henan Zhengzhou 450002)
Key words: ELF;Self-immunity
随着网络技术的发展,终端的种类和数量均不断增加,且终端间的数据交换也越趋频繁,这为计算机病毒的广泛和快速传播提供了契机。作为当前最流行的类UNIX服务器平台,针对Linux操作系统所设计的木马和病毒也逐年增多。而这些木马和病毒又多通过分析和感染Linux下的开源ELF格式文件来危害宿主。ELF文件是Linux系统中最常用的可执行文件格式,它能够显著提高Linux下程序文件的可移植性,但其定义格式也导致其易被病毒感染。
当前常用的对抗计算机病毒的一般过程为:预防、检测和杀毒。但是这种“先感染再查杀”的被动防御方法依赖于频繁的对病毒特征码的分析,而对病毒已造成的数据、信息损失无法挽回,且需要经常升级病毒特征库。
1 病毒感染方式
针对ELF格式文件的病毒通常有三种寄生方式:直接覆盖宿主、向宿主文件插入病毒体、将病毒代码植入ELF本身的填充字段。第一种方式会破坏可执行文件的原始数据,导致染毒文件不可用。这种方式很容易被发现,达不到病毒设计的初衷,因此很少使用。第二种方式不破坏宿主文件,仅将病毒代码加入程序执行流程,通常存在于宿主的代码段和数据段前后的空闲区。第三种方法是在ELF本身的填充字段中将病毒植入。针对上述几种常见的病毒寄生方式,本文设计了一种能够使得ELF文件具有一定天然免疫能力的改进方法。
2 ELF文件自免疫设置
ELF文件由文件头(ELF Header)、程序头表(Program Header Table)、节头表(Section Header Table)以及段(Segment)或节(Section)组成,如图1所示。其中,文件头位于程序的开始部位,包含描述本文件结构的路线图(road map),程序头表保存了如何将程序加载到内存的信息,而节头表描述的是程序节的具体信息。这三个结构共同决定了目标文件间的连接方式、载入内存的方法以及执行方法。因此病毒体寄生宿主,驻留内存时必须修改寄主的文件头、程序头表和节头表信息,然后才能将自身代码插入寄主文件体中。因此本文所探讨的这种自免疫方法也将从这三个结构入手。
ELF二进制静态文件节中的填充区可以位于区首或区尾。而病毒则选择合适大小的填充区插入其自身代码。为预防发生这种情况,我们可以在ELF文件的填充区中写入随机数据,并将文件的相关信息记录在新节中,以便在文件运行前进行病毒检验。具体方法如下:
2.1修改程序头表
ELF文件的每个节都有填充区的存在,而该填充区的大小可以从程序头表中获取。程序头表中的字段p_filesz表示该段在静态文件中所占据的空间,而字段p_memsz则表示其在内存中占用的空间大小,其差值即内存映像中填充区域的大小。且ELF文件规定p_memsz不会比p_filesz大。若将前者修改成与后者相同大小,即使p_filesz-p_memsz=0,则病毒将认为填充区大小不适合其插入,并最终放弃感染。
以上工作需要通过对程序头表的分析和修改来完成,具体步骤如下:
①在Linux系统中,若想修改程序头表,需要首先使用系统调用mprotect将其所在文件的操作属性改为可读可写可执行(rwx);
⑵读程序头表。程序头表中的各个可载入段入口按其各自的p_vaddr升序排列。将其分别读取,并计算填充区大小,该区域的起始位置在p_vaddr+p_memsz处;
③生成随机数据写入填充区;
④修改程序头结构。将程序头中的p_memsz大小设为与p_filesz相同。
2.2禁止插入新节(段)
与上述的插入型病毒不同,附加型病毒的实现方式是在文件尾部追加病毒体,该方法无需担心破坏执行宿主所需的信息。它会修改程序的入口点,使其自身能先于宿主执行,对系统造成破坏。对于这类型的病毒,可以通过设置使其无法插入新节来预防。ELF文件节的构成属性导致目标文件中可以存在"非活动空间",即节之间可以有空闲区域。这个属性既为ELF文件带来更高的灵活性,也为病毒提供了容身之处。为解决这个问题,我们可以将各节之间的空闲区域取消,使得各节顺序相连。
设i,j为两个相邻的节,且i为j的前趋,j为i的后继,则取消空闲区的步骤为:①根据ELF文件头中所获得的节头表地址e_shoff定位节头表,从中获取需要移动的节j的大小及其当前起始位置;②计算空闲区域大小。
两节之间的空闲区大小S可由下式得到:
S=sh_addrj-(sh_addri+sh_sizei-1)
上式中,ELF32_Addr类型的sh_addri字段在节头表中出现,它表明了当前节i在内存中的位置,而ELF32_Word类型的字段sh_sizei则指出了当前节i的大小,因此节i的结束位置为(sh_addri+sh_sizei-1)。再由ELF文件头中的e_shoff字段得到节头表在目标文件中的偏移量,从节头表中获取后继节j的起始地址sh_addrj,即可算出空闲区大小。③将节j当前位置处的sh_sizej大小的数据复制到紧邻节i处;④将节j的新起始位置记入节头表的相应记录中;⑤判断节j是否文件的最后一个节,若是,则将节头表复制到节j的后面;若不是,返回①继续。这种方法虽然麻烦,但从根本上消除了节间的空闲区域,使病毒无法找到可插入的空间,对小型且关键性文件尤为适用。
2.3自免疫防毒
上述办法针对直接在文件或内存映像中插入代码的病毒起到较好的免疫作用,接下来我们又在ELF文件中增加一些自免疫防毒的代码,以增强对插入病毒代码后又修改节头表等关键数据的病毒的自免疫能力。在添加自免疫代码前,需要在文件中增加一个新节,该节中记录程序的关键数据:文件入口e_entry、程序头表地址、节头表地址、各节或各段的实际长度等。且该节中还应设置一个校验字段,当直接覆盖型病毒修改文件后,在程序开始运行时,首先与该校验字段相比较,若产生变化,则说明文件已经中毒。
对于已发现染毒的ELF文件,需要进行修复工作。具体步骤如下:①关闭染毒文件:使用kill指令终止染毒文件工作,避免其对系统造成更大破坏。②由文件头中的e_entry找到文件的绝对路径,使用该路径寻找预存的备份文件覆盖被染毒文件。该步骤的正常运行取决于备份文件的正确性,因此需要在源文件与备份文件间建立一个可靠连接。最简单的办法之一就是将备份文件命名为源文件名的MD5加密后的密文,密钥则使用文件拥有者的密码。③恢复完成后,在恢复后的文件中添加一个新节,其中放置被保护程序的关键数据以及免疫代码等重要信息;④修改文件头,记录恢复后文件的各节和各段的相应信息:根据备份文件头中的相应字段值对恢复后文件进行修复;⑤终止恢复程序的运行:当恢复程序完成上述任务后,对本次修复的完成情况、发生时间等信息进行记录后,自行结束工作退出内存。
3 结束语
尽管现代病毒已不仅仅使用一种感染方式,但本质仍具有各种典型感染方式的相应特性。本文根据Linux系统中ELF文件病毒的感染机制的特点,设计了一种对关键ELF文件进行自免疫设置与检测、恢复的方法。经验证该方法能较有效的阻止常见ELF病毒的侵袭,达到了设计的初衷。
参考文献:
[1]谢瑶,潘剑峰,朱明.Linux/Unix环境中ELF格式病毒的分析[J].计算机工程,2005(2).
[2]向文杰,李毅.Linux环境下ELF文件型病毒的分析[J].科技信息,2006(9).