| 也谈加密锁技术的解密 |
| 乔杰先 |
|
一直想写一篇以加密锁是不是很脆弱为话题的文章,但又恐因自己在加解密方面的造诣不够而引起“井底之蛙”“杞人忧天”之嫌,所以一直迟迟未敢付之行动。读了《软件报》第46期刊登的北京蓝明的《加密锁技术的解密》一文,收益非浅,对加密锁的原理和发展有了新的认识。但仍然不能除去心中产生已久的对加密锁技术的一些困惑,所以想从解密的角度以自己的经历谈谈对加密锁技术的一些看法和体会。希望能引起生产厂家及软件开发者对加密锁技术的安全性问题的关注,也希望密界“黑”“白”两道上有正义感的高手们就加密与解密技术展开交流,共同推动国内加密技术的发展,减少盗版软件的泛滥,促进民族软件产业的繁荣。
本人既不是电脑专家,更不是汇编高手,也不是破解学院里的砍客,最多算是电脑爱好者一名。但却因当初对这火柴盒般大小的加密锁的好奇,凭借一知半解的汇编知识,从4年前第一次用16进制编辑器 Hiew打开并不小心破解了 DOS版某知名国产工业软件开始,之后每当有用加密锁加密的软件搞到手,都禁不住要对它里面所使用的加密手法分析一番,看看有什么意外的收获和发现。这其中有 DOS版也有 Windows版和网络版;有工程预算类也有设计类、财务类;有国产软件也有国外软件;有用第一、二代锁也有用第三代智能锁加密的;也有采用“软”“硬”兼施、内外结合方法加密的(好像彩虹天地公司的产品支持这种技术),它们中也不乏国内正规厂商的精品软件。没想到的是,看得久了竟也对加解密技术有了一些认识、积累了一些分析程序方面的经验,以至于它们中的绝大多数经本人分析过后给一一破解。没有脱去“锁”的那几个因为手里头没有它的加密锁而无法对程序做进一步的对比跟踪分析。只有极个别的软件其编程技巧确实高明(倒不是因为锁的保密技术有多高),使得因分析工作量太大而放弃(和自己这方面知识的欠缺和耐力不够也有关,毕竟初级水平。)。也由此产生了加密编程技术水平的高低是决定软件加密强度的重要因素、而加密锁其实很脆弱的观点。
本人在这里无意贬低加密锁的保密系数,相反,亲身体验了加密锁(国内亦称“狗”)技术上的一些进步: DOS时代,程序加密基本用的都是第一代锁,像 SenseLock Keypro。解密这类锁加密保护的程序根本不需要做动态跟踪,用一个只有几十 KB大小的 Hiew就足可以搞定;到了 Windows9X时代,采用第二代锁加密的程序多了起来,据说这类锁的算法变换关系很难穷举。由于 Windows有严格的特权分级,把低层东西都隐藏了起来,所以单凭一个 Hiew很难把程序的加密逻辑看得明白。于是找来动态反汇编工具W32dasm、自学了几招 IceSoft的命令,也基本上把问题解决的差不多了。第一次“研究”第三代加密锁好象是在2000年五一放长假期间,是 SenseLock公司的 SenseⅢ,这种锁能提供一套汇编语言,加密锁的功能可以任意设定,加入了随机数变换和垃圾代码。闲来无事找来 VB编程教材,按照“用户手册”的教导编写了一个小程序做试验,反复运行、跟踪分析了几次还是轻易将“锁”脱去,不同的是这次把那几个不太新鲜的工具 Hiew、W32dasm、“软冰”等全请了出来,但是在破解思路和方式上与以前并无本质的区别。二、三代锁和第一代锁相比给我的最深印象就是反“仿真”技术的进步。虽然加密锁在“算法”、以及被加密程序和端口间数据交换的随机性方面达到了极高的安全强度,但在解密时根本不需要考虑这些。为什么呢?因为被加密的程序在有锁和无锁两种情况下的运行现象总是有差别的,有了这种“差别”,就可以通过分析程序指令的执行流程找到解密的关键切入点。而且很多时候,加密锁在解密过程中扮演的是缩短破解时间和辅助作用的角色。当然,有些程序必须用锁来做辅助分析方能破解;有些程序在没有锁的情况下一样可被破解;也有的程序即便你拿到了锁也难以破解,这是极个别现象,更不能用来证明加密锁的加密强度,反而是加密者高超编程技巧的一种体现。若不是,为什么使用同一厂家同一型号加密锁的不同厂商的软件产品中,加密强度参差不齐、但难以破解的只占极少数呢?尽管现在有些加密锁使用了垃圾代码与乱序执行技术,但你仍可以跳过去。把锁插上,程序总不能老在垃圾代码里打转吧?也没有必要将指令逐条地分析,那样很容易走入程序为你设置的“陷阱”中去。加密锁的有些功能其实“花哨”大于实用。
分析程序的过程,其感觉就像是医生对病人诊断病情一样,把准脉,找对穴位,一针扎下去程序马上出现一些“迹象”……
还有一个经历,前段时间拿到一套某正版多媒体网络教室,据说还是知名产品。该软件在不插锁的情况下运行时对终端有数量上的限制。在对主程序做了大量的跟踪分析后发现,该程序竟然和以前曾经遇到过的一个知名工程软件一样,存在一个加密设计考虑不周的漏洞!尽管程序和加密锁配合得也许天衣无缝,但却让我很容易地找到了一处关键地址,通过修改该地址处那条指令的一个操作数就可以随意设定软件所支持的用户数目,而根本不必去考虑锁是如何制约程序运行的。
说上述话的目的并不是想证明自己这方面的水平如何,解密是项艰苦的工作,相反地,却因为自己对硬件知识和深层加密原理知之不多但却破解了很多软件的事实,而产生加密锁到底是不是很脆弱的疑惑。如果真是这样,就不难理解为什么外面有什么样的行业软件,解密界就有什么的原因了。《加密锁技术的解密》一文好像主要站在锁开发者的立场,从“算法”及“仿真”的思路和技术上看待锁的加密强度。而没有从解密者是如何进入被加密程序内部如何进行程序的分析修改之角度去考虑。当然,我也非常赞同作者的加密原理最能代表锁的加密强度的说法。但,锁的加密原理能不能完全地代表软件被加密后的强度?我想至少目前会有很多破解者有足够的理由提出这种质疑。程序被加密后的破解难度与许多因素有关,除了加密锁自身的技术含量外,还要看程序开发者自己破解知识的多寡、加密水平、编程技巧和反逆向工程等多方面能耐的高低。只有这种高技术水平的程序员才能把加密锁有限的威力发挥到极限。这也是本人在反解密方面所持的观点之一。
虽然现在有些编程者也注意到了这个问题,在硬件加密的基础上对软件产品增加了一些防范措施,例如:用软件给程序加壳;对某些调试工具是否在运行时进行内存检测和反击等等。但这些招数不是防范措施的最高境界,早已被解密高手们破解殆尽。据我所知,除了“仿真”,目前的破解手法都是从逆向分析开始的,只不过不同的解密者对“破解”有着不同思路和理解罢了。能不能开发一种极端的技术,譬如从硬件层彻底杜绝逆向工程;或者干脆把用户程序的一大块(而不是一种“算法”)真正“移植”到锁内运行,我想这比去花费更多力量研究“算法”也许更有意义。加密和解密,就像矛和盾,既对立又统一,既排斥又相互依存,缺一不可,相互促进,也没有永远的赢家。
以上只是一家之言,不成熟的观点。
|
|
文章检索
软件>热门文章
|