@devilogic
2018-07-13T17:43:53.000000Z
字数 1862
阅读 1105
devilogic
在软件保护以及一些注册算法应用当中,并不需要高强度得密码算法,由于密钥以及解密算法本身都蕴含在程序之中,调试人员可以通过静态反汇编分析与动态调试分析来找到密钥以及对应的解密算法,去破解软件或者解密对应的资源文件。就算再强大的算法在密钥被知晓的情况下。也不能保证安全。通常解决这种问题的方式是采用加壳(引用1)的方式直接对整个程序进行保护。这种方式是针对整个程序而言。本文的方式是直接作用于加密算法,解决加密算法密钥随机与算法变形问题。
在有些软件保护程序在每次加密时,通常使用随机密钥的方式增强安全性,但是密钥被随意在放置在程序的某个数据内,高级一些的可能会保存在某个文件内在程序运行时读取,更高级一些的或许会进行二次加密,将实际解密程序或者数据的密钥再加密一次,而加密此的密钥会随意保存在程序某处。一种有效解决密钥保存的方式是将软件完整性与最初的密钥关联到一起。这里给出一种可供参考的方案:
这种方式在实际编码中,可以使用众多方案,但是核心思想是采用一些不被加密,但是又不想被篡改的文件、程序、函数段或者数据区域的摘要值或者摘要值的变换作为密钥对一些需要加密的程序或者文件进行加密。这样无需保存密钥,并且如果这些作为密钥的程序、文件被篡改后,一些程序或者文件将不被正确解密。如图1所示:
图1(左右两幅图,一副是加密流程,一副是被篡改后无法执行的流程)
而我们考虑的是通过在生成密钥时并不是生成的密钥本身,而是直接将密钥以某种算法的形式固化到解密算法之中,这个解密算法中支撑算法本身运行的数据即是密钥。而不是单纯的硬编码一组数据到程序中。这样的做的好处是,分析人家无法定位密钥也无法找出密钥。如果想要破解程序必须逆向完整的解密算法。
我们的设想是,在加密之前随机生成一个加密算法与对应的解密算法,并将密钥离散的分散到解密算法的支持运行的数据之中。这里首先要解决的就是程序生成程序的问题,这里需要提到的是,由于为了支持新程序的运行,解密程序本身内置一个仿真机来运行生成后的代码。
在算法变形方面,下面一次阐述在算法变形中所需的技术点。
首先本文想实现的是一个分组加密的算法,单字节的流加密算法在应用下一节提到的随机运算式的时候,可以做多变量的混合运算。增加逆向的难度与算法的强度。
(未完)
最初的应用是虚拟机保护引擎采用将汇编指令中的加减乘除的指令,使用与非门进行无限的扩展。扩充程序长度延长调试人员的分析时间。
参考<<算法心得>>一种书有这样一些利用与非运算的应用。
(未完)
最初在病毒加密中可以看到,出于要去除特征码这一原因,计算机病毒会在感染之前使用随机选择方式选择加法,减法以及随机的单字节密钥,并将这些选择方案直接通过硬编码方式写入到感染程序之中。由于病毒并不需要强度的加密算法,它的主要目的是随机变换密文以及对应的密钥与算法达到改变特征码的目的。当然这个已经是非常高级的病毒。最初改变特征码的方式只是随机的刷入一个固定的单字节密钥,但是解密代码不变,通常会使用异或单字节密钥这样的算法。这样特征码会从解密代码抽取。而这样的研究也只是20年前的事情了。目前没有太多人去研究计算机病毒,更多的是研究计算机木马,更多的技术研究是与系统层面,而非编码技巧。
下面是摘自29A的V病毒代码变形引擎的一部分。
病毒代码片段
(未完)
这里是主要的加解密产生的场所。主要的想法是构建一套类似的引擎。
分组的,每个明文字节相当于方程组的解。构建方程组如下:
以上的,表示由上一节随机组合生成的函数,通过这些计算的到一个系数。
(这里还没想清楚)