如何对付解密者利用内存中断机制去截获真正的程序代码,是构造一个好的加密软件的关键,在对现有加密技术进行分析研究的基础上,提出了一种新的加密技术——嵌入式加密技术。
嵌入式加密技术不是简单地建立“加密外壳”,而是将加密程序代码直接嵌入到程序的内部。具体而言,就是把对指纹的检验过程直接加入到所需加密的程序内部。这样,解密者就不可能通过驻留程序去生成解密后的程序代码。也不可能获得整个程序的代码,至多也只能得到一部分程序而已,而这部分程序当然不能运行,因为它可能减少初始化成分,或因目标码的重定向部分出错等等。总之,解密者不可能通过非跟踪的方式去获得加密前的程序代码。
那么如何将加密程序嵌入到程序内部呢?
首先,加密软件加加载待加密的应用软件,根据文件头部信息获得该软件的长度、重定位信息和软件的加载运行时的起始地址等信息,而后修改文件头内容,增加文件的长度,重新生成一个临时文件。
然后,根据上述记录的一些信息对开始的一段程序进行分析,具体来说是把程序读入内存,然后对其代码进行分析,重点是记录有CALL、JMP、JZ等指令的地方。找到这些地方的目的是准备将加密检测程序部分嵌入,也就是插入到这些断点,记录下位置和此处的程序代码,为安全起见,可以记录多个断点。
最后,将指纹检验程序嵌入到被加密程序的内部,实现步骤如下:
1、保存所用的断点出的程序代码,并保存该断点的下一条指令的地址。
2、修改断点存处的指令代码,使断点处的指令代码为一个长跳指令,即JMP、FAR……指令,而将其指向指纹检验程序处。
3、在指纹检验程序的结束处再恢复断点处以及断点以下的指令代码,并使程序重新跳回到断点处继续运行。
这样,我们就将加密程序嵌入带程序内部了。
为了防止解密者利用DEBUG、TD、SOFTICE等动态调试工具进行跟踪,可以将嵌入式加密技术和加密外壳式加密技术结合使用。这样,解密者一方面不能够简单地利用驻留软件去截获程序代码,另一方面他为了破译软件不得不花费大量的时间去分析那些反跟踪代码。这样,解密者就会变得素手无策,从而达到加密的目的。