安全中国首页 > 文章中心 > 加壳技术
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

软件注册保护与“多态变形混淆”技术浅述

更新时间:2007-9-27 20:22:42
责任编辑:池天
热 点:
软件注册保护与“多态变形混淆”技术浅述


导引

多态(Polymorphic),变形(Metamorphic)和混淆(Obfuscation, Jumble,Chaos)出现在病毒应用技术中已经不是什么新鲜的话题了,变形技术在病毒中的不断改进和发展,已经引起反毒专家的重视,这种变化趋势的确对目前的反毒引擎,自动探测技术提出了更高的要求和挑战。“变形病毒非常难于去分析,他们的随机传染和散布机制带给自动反毒系统大的挑战”[Peter szor Virus Bulletin 2000]。

既然这些技术可以用于病毒,当然,放到软件保护中来完全适合。的确,这样的工作一直在进行和发展中。“变形技术是非常有前途的虽然它目前很少被应用于与软件保护。变形技术在每次使用时,通过变换自身代码去阻止被破解,当前还没有哪个保护软件采用了全部的变形技术。[Pavol Cerven Crackproof Your Software 2002]。(此书作者已经在他本人发售的软件保护系统:The Slovak Protector -SVKP中尝试采用了变形技术,不知效果如何)


简介

多态:既是完成同一功能采用了不同的方法。多态的特点是随机性和变化性。例如一个检查过程,调用了3个子过程完成全部安全检查机制。应用多态技术,这个检查过程在每次程序运行时,会随机调用不同的子程序并以不同的调用次序来完成全部的安全检查计划。如此,破解者很难跟踪,并做出通用破解补丁。这个随机的初始化过程一般由一个初始化程序完成,这个程序通常称为“多态引擎”。

变形:基于多态技术,它发展和提升了多态技术。它可以动态生成更复杂的检查过程,包括对重要程序片断的动态加密、解密,动态变换全部检查过程的代码和数据,基于内置的各种不同加密、解密算法。对目标代码段进行动态控制和编/解码。这其中可能还包括代码混淆过程。使得跟踪者迷惑于复杂的变换和还原过程,无法找到真正的检查过程和解码程序。如果其中包含复杂的加密算法(比如多态加密算法,参见后文中的连接地址)会使得整个安全检查机制十分难于分析和最终的破解。“多态加密算法属于当今的强加密算法之一,很可能是最强的”[CyProtect AG]

混淆:将一段代码变得非常难以理解,但功能完全相同。例如:

原始代码:
Mov ax, 01
Mov bx,34
Push ax
Call 123456

混淆后代码:
Mov ax,09
Mov bx,4
Shr bx,1
Sub ax,bx
Mov si, 123456
Nop
Xchg ax,bx
Push bx
Pop ax
Push 34
Pop bx
Call [si]

显然,混淆后的代码更需要花费更多时间去分析。通常,混淆代码是由一个混淆发生器(Obfuscation generator)来自动生成的,它按照事先约定的特征标识去使用哪些未被混淆过程中应用的寄存器去搞乱目标程序片断,并且它可以控制生成代码片断的长度和复杂性,以便于随后的其他加、解密程序修改相应的特定程序片断。当然,这个混淆发生器需要全配合整个程序中其他处理过程的,并非独立的非关联性子程序。

通过上述简单的描述,大家可以看出,一套好的加密机制,需要非常严密的构造。高强度,随机性,动态变换的基于多态,变形和混淆技术的加密系统,是完全可以实现的。在这个较新的领域,已经有了比较好的理论基础,和一些实践应用。


简单应用分析

PE加密

通用的PE加密商用软件产品的发展趋势是逐渐融合外壳与被加密程序,使得普通脱壳后的程序根本无法正常运行。由于一部分原始代码已经被转移到外壳中,所以整个程序执行期间,外壳与被加密程序已经是不可分割的一个整体,所以破解变得必须搞清更多的加密程序以及原始程序的细节。对于较大的软件,这是一个非常困难的工作。

如果PE加密采用注册方式(这几乎也是最常见的方式),它可以在PE加密软件中本身定义一个key空间,并依据个别计算机硬件特征,动态生成一个范围更小的有效key空间。当被加密软件尚未被真正注册时,每次运行它时动态产生一组有效key用于校验过程,当然这组key不会出现在判断过程,而是被运行时用于控制程序执行序列和调用程序入口产生。如此,跟踪会变得很困难。

Pe加密程序可以定期更新自己的加、解密算法和key空间数据库从自家的主机上,来提高自身的加密强度和随机性。当一个真正的用户注册了程序后,pe加密程序应该设置足够的功能,使得产生的有效key仅仅依赖用户的计算机,被注册后的程序不能脱离本机执行,并且在一定的时间许可范围内有效。这些技术相信已经广泛被采用。这样,避免了合法用户非法散布有效key提供给其他人注册一个未注册的程序版本。外壳程序好像是被加密软件的一部分,一旦加装,无法剥离。当然,这种有效融合技术,需要PE加密软件的生产者具有很强的功力,并且加密机制是经过周全的研究而建立起来的。

一个简单的加密检查过程,可以采用动态程序地址生成技术,例如
Call 取得解密字
Mov ax,解密字1
Mov bx,解密字2
Mov cx,解密字3
Mov dx,解密字4
Mov si,地址表基地址指针
Call [si+ax]
Call [si+bx]
Call [si+cx]
Call [si+dx]

解密字可以是取自注册号,注册号可以采用单向hash算法(例如md5)通过用户输入的用户名和其他信息(比如硬件信息)算出。如此,如果程序中提供20解密子程序,调用次序的不同,在解密字不可知,解码过程不确定的情况下,穷举测试跟踪和暴力攻击变得几乎难以进行。

有效的注册码包含有效的解码字和解码次序,这些解码字以及执行次序被PE保护程序事先已经初始化,相关的检查过程同样已经被初始化,本地化,用于配合有效注册码。这一步,应该是被在用户计算机上安装被加密程序时进行的。如果破解者,这是跟踪程序,由于算法过程的复杂性,跟踪者很难明白,程序安装过程中的行为的意义。如此,一旦程序被安装在用户计算机中,有效的解码字和解码次序已经被包含在用户计算机上生成的数据库中。所以一个用户拥有一个独立的注册生成器,它不能用于生成通用的注册码,它的有效性基于用户的计算机,它可以包含本地的pe加密软件中。

破解者无法找到一个通用的办法去破解被保护软件即使他已经是合法使用者。有关的简化过程演示,小弟已经在一个简单的crackme中完成,虽然,它仅仅表现了一个静态的检查过程,但可以把它看成是应用多态变形技术在一次执行过程中的静态内存影像。真正应用多态变形技术,应该每次执行都有不同的检查过程,这个过程还有可能动态改变。(crackme源代码附后,请参考)。

有关该主题更多的信息可以在INTERNET上查找,这里只给出几个有关关联,参看多态加密算法“Introduction to the polymorphic encryption method http://english.cyprotect.com/main0110.php”,以及“Polymorphic Cipher Theory C.B. Roellgen, 2002) http://www.ciphers.de/downloads/roellgen02generalizedPMCmodel.pdf”


随笔

关于花指令

一般的花指令仅仅是混淆技术的简单化应用,它部分的实现混淆技术,但缺少随机性,复杂性,动态性。因此,它容易被破解者编制一个小程序自动移除。当然,一个好的有一定强度的混淆器绝对是需要很多时间去调试的,估计对于一个有经验的程序员,这个工作需要几个月的时间,这其中,可能包含一些基本的汇编指令编译原理,如果加上针对不同类型CPU指令流的预取功能分析,对不同平台的兼容性,适应性研究,这个工作看起来就不大适合普通的编程人员了。因为需要很多基础知识的运用。在程序保护技术中,混淆是一种很好的对付反向工程的措施。

关于保护强度

一个保护软件的强度并不仅仅基于它采用的加密算法的强度。往往数学和理论上的强加密算法在应用过程中由于各种条件限制或者编程人员的疏忽,使得信赖它的采用者最终失去利益。这个世界上从来就没有不可能,只有想不到。所以,有效的机制必须被建立在一个软件保护产品规划的初期,并被不断的完善和发展。这其中综合了好的加密算法,反跟踪技术,混淆技术,程序构造复杂性研究等等。

只有不断的创新和发展,才是出路。因为技术是不断发展的,软件保护者如果闭起他的眼睛,不再关注破解者的努力时,他的产品就已经过时了。

法律规定任何人在未经允许的情况下,不得进入你的房子,但你更愿意给自己的房子加把锁。1650位的RSA真的需要25年才可以攻破吗?

 
相关文章
一日一文章
 
一日一软件
一日一动画