加壳是对软件内核一种很有用的维护办法。现在Linux体系下的加壳办法,多是直接承继Windows 程序的加壳理论和办法,在传统加壳东西进步行了有限的扩展, 单纯在LINUX 体系下完成的加壳东西仍是很少的。如安在Linux 体系下尽量削减内核信息的露出,添加有难度的反逆向手法来提高破解难度,对加壳维护程序进行很好的躲藏,都是现在首要霸占的难题。
依据加载外壳程序办法的不同将现有软件加壳技能分为:嵌入式、附加式和包括式。嵌入式中最经典的是Upx,支撑多种文件类型加壳,且紧缩算法先进。但该办法短少反动态盯梢功用,破解者可用动态盯梢调试办法对Upx 进行破解[1]。文献[2]中描绘了附加式加壳(SELF 加壳):在原elf 文件格局中添加处理安全操作的代码段,但不内置解紧缩,简单暴漏壳的方位。包括式结合了紧缩和维护两种类型的壳,但壳加载的进程中会改动进口地址。结合上述三种加壳办法的优缺点,文章提出了在Linux 体系下一种改善的加壳维护办法—加壳并重构可履行文件———SRELF[3]。改善后的算法将壳程序和方针可履行文件中代码段,数据段等要害部分相结合,引进多态变形技能,使程序呈现出多态性,提高了壳程序的反破解才干,一起还很好的躲藏了加壳的信息。经过试验证明,改善后的办法处理了加壳中进口地址易被改动的问题,使得加壳的程序以多态的办法呈现,很大程度上提高了反破解的难度。
1 加壳原理
加壳实质上便是把一段特别程序附加到应用程序中,并把程序的履行进口指向附加的特别壳程序。壳的加载进程如图1 所示,首要壳程序需求取得应用程序编程接口———即API 地址。在加壳程序的代码顶用显现链接办法动态的加载所需的API 地址。经过壳程序后,对各个区块的数据依照界说进行解密;若加壳时用到了紧缩技能,那么在解密之前先要进行解紧缩,然后将解压文件映像到指定内存地址中。修正原程序文件的输入表后填充HOOK—API 表中的代码地址,直接的取得程序的操控权,进行校验和测验完后跳转到原进口点(OEP)[3]。
现有的软件加壳技能办法大多都改动了原有文件结构,在重定位的进程中改动程序的进口地址,加载的进程中把部分程序映射到地址空间中,若破解者知道如安在一个加壳程序中寻址,那么当文件被加载进内存时就能够找到加壳程序的信息。文章针对上述问题,提出了一种改善的加壳办法SRELF。
2 SRELF 加壳办法
2.1 SRELF 办法原理
SRELF———加壳并重构可履行文件,最大特点是重构变形使得重构的程序呈现多态性。首要将方针elf 文件中的中心部分提取出来,然后与准备好的解密或解紧缩程序,反静态剖析和反动态盯梢程序结合在一起,让加壳程序呈现出多态变形性,终究遍历整合程序,依照elf 文件规范格局从头结构一个全新的elf 可履行文件。
2.2 SRELF 办法完成
如图2 所示:SRELF 加壳办法完成的根本程序框图。首要了解应用程序二进制接口文件(即扩展名为elf 文件)结构。图3 所示为规范elf 文件的结构图。从图中能够看到:一个ELF 头在文件的开端,保存了路线图描绘了文件安排状况。随后是一些段(segments)或许一些区段(sections)。段中包括文件运转所需的信息,而保存着object 文件的信息,用于链接和重定位。
第一步:提取方针文件中的中心部分
提取中心部分的可履行指令、动态链接表、段或节等信息。因为汇编程序中存在直接跳转使得反汇编生成操控流图中止,影响了提取中心代码的准确性,这儿引进了一种直接跳转程序办法[4]。
1)从壳运转到原始程序的OEP 进行单步向下盯梢,遇到抛出反常后,修正溢出标志;
2)剖析操作数的类型。若是直接寻址类型,进入4);不然进入3);
3)找到界说的句子或函数进口,设置CREAT_SUSPENDED计数器,若计数器加一,则将宿主进程作为一个挂起的子进程翻开,调用GetThreadContext()获取子进程初始化线程的上下文;
4)判断后的程序进行输入确定,在句子序列上模仿执界说方位与方针直接跳转运算,对获取寄存器内容进行仿制。运用直接跳转句子获取elf 头文件中的信息后, 定位到GetElfCore 的头表,然后定位到所需代码段的中心方位,将其间的数据仿制出来。
第二步:对提取的中心代码加密并结合多态变形技能
选用进程注入加密技能,逆向阻挠脱壳软件附加在受维护的进程上。先让CONTEXT.EBX 获取子进程的PEB 地址,读出PEB 子进程的映像地址后,将根底地址参数指向检索到的映像基址,终究完成对各种外部中止的监督作业。对加密后的中心代码进多态变形技能改善,让其改动自身代码,从而使查找字符串的辨认技能失掉作用。文章选用的代码改换加密紧缩来躲藏自身,为了避免查找字符串的办法检测到,解密代码引动代码模块,程序将其刺进其自身,调用代码模块中包括的函数,移动例程周围的指令,随机添加无用的指令,运用不同的寄存器和操作码,使得解密例程对应的二进制代码在不同的感染体内彻底不一样[5]。多态变形引擎进程如图4 所示。
第三步:将方针文件的中心部分和加壳部分整合
整合方针文件的中心部分和加壳部分需求进行准确的核算,设置正确的elf 文件头、程序头表、节头表等的数据。这样新生成的elf 文件才干正常运转。在整合elf 等数据时选用遍历整合的办法,对前面提取的的中心代码块逐个进行剖析。选用循环缭绕整合加壳后的中心代码。
1)先建立一个状况表,记载每个变量的状况类型。记载物理文件的巨细和载入内存所占内存的巨细。首要履行函数的初始状况,将除掉进口函数的一切函数都设置为untainted。若一个变量在多个正向前序代码段的状况表中呈现,则从头核算其巨细,并更新状况表。