Restorator 2007注册的RSA算法分析及RCData中文处理补丁
Restorator 2007是不错的工具,现在还有很多人在用。它同样存在文章“eXeScope, XNResourceEditor & IDR 之Form中文显示补丁”中提到的问题,就对其做了相似处理。这部分比较简单,让人更感兴趣的是它的注册算法,现整理出来分享给大家。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
目录:
一.关于版本
二.RSA算法
三.注册算法分析
四.用TSM Inc.的组件制作Keygen
五.TRSA与其他RSA实现的对比
六.附件列表
一.关于版本
Bome Software的官方下载目前仍然是2007年七月发布的30天试用版:Update 2 (Build 1747)。
试用版的限制:30天后不能再使用;保存的菜单、对话框和版本等资源中有"Patched with Restorator"字样;缺少ResPatcher和Grab Resources两个工具。试用版中ResPatcher Wizard可以走到最后一步,由于资源中没有EXE Stub,无法生成ResPatcher的执行档。当然也没有地方输入注册信息。
Build 1747正式版的原版很难找,事实上我还真没找到,只找到Build 1709和Build 1729(见附件)的正式版安装包。好在Bome Software提供了Restorator2007_Full_1747_Patch.exe。这个Patch只适用于官方的1709或1729,任何破解或汉化版都无法升级到1747。
在帖子“Restorator 2007 3.70 build 1747 Full(http://www.unpack.cn/thread-15293-1-1.html)”中有ZWT的b1747英文正式版破解,只有一个执行档Restorator.exe和注册信息,帖子中还提到1747修复了哪些Bugs。
汉化方面,有West King(韦斯特·金)的b1729和Digidea的b1747。和正式版的原版一样,采用Inno Setup安装包,但在安装时会自动在注册表中写入注册信息。
另外还流传有一个“Restorator 2009 Bulid 1807”的版本,显示版本号4.0.0.1807。但它实际上是b1709:资源中残留有3.7.0.1709字样,执行档Restorator.exe中经加密的公钥位置在VA 004E7500处,与原版b1709位置相同。并且这个版本、WestKing.b1729和Digidea.b1747都源自ZWT的破解,注册信息在这些个版本是通用的。
二.RSA算法
关于RSA算法,更详细的信息请参阅“RSA (algorithm) - Wikipedia, the free encyclopedia”或“RSA加密演算法 - 维基百科,自由的百科全书”。为了下面叙述方便,大致摘编于下:
RSA加密演算法(public-key cryptography)是一种非对称加密演算法,在公钥加密标准和电子商业中RSA被广泛使用,比如超文本传输安全协议(HTTPS - Hypertext Transfer Protocol Secure)和数字签名等。该算法由Ron Rivest、Adi Shamir和Leonard Adleman于1976年一起首次提出,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏首字母的组合。
RSA包括一个公钥(Public Key)和一个私钥(Private Key)。顾名思义,公钥是公开的,由他人使用;私钥则一定不能泄露,是持有者的身份证明。通常,公钥用于加密消息,用公钥加密的信息只能用私钥进行解密。
但是,这里有个问题。假设甲向乙发送加密信息,因为任何人都可使用乙的公钥来加密,虽然乙可用自己的私钥正确解密,但无法确认发送者一定就是甲。
RSA的另一个功能——签名消息(Signing Messages)——解决了这个问题,但公钥和私钥的用法正好颠倒过来。
还是假设甲想给乙传递消息。首先,甲为消息产生一个消息文摘(Message Digest),通常就是计算消息的散列值(Hash)。然后甲用私钥加密这个散列值生成一个签名(Signature),并将这个签名附在消息的后面。这个签名只有用甲的公钥才能被解密。乙获得这个消息后用甲的公钥解密这个签名,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他/她就可以知道发送人持有甲的私钥,以及这个消息在传播路径上没有被篡改过。
RSA算法的关键在于生成密钥对,过程涉及到数论里的很多东西,不晓得是否还有人记得华罗庚、陈景润等的名字。RSA算法的密钥按以下规则生成:
1. 选择两个不同的质数/素数p和q。整数p和q为安全起见,应随机选择,并有相同的位长度。
2. 计算 n = pq。n是用作公钥和私钥的模(modulus)。
3. 计算 φ(n) = (p–1)(q–1),这里φ是欧拉的totient函数。
4. 选择一个整数e:1 < e < φ(n),并且e和φ(n)的最大公约数为1,即e和φ(n)为互质。e称为公钥指数(public Exponent)/加密指数(encryption Exponent)。e选择较小的位长度在加密时会有更好的效率,普遍用数值0x10001(十进制65,537),数值3也有用到,但在某些情形显得不够安全。
5. 确定整数d:d ≡ e -1 (mod φ(n)),或写成(d * e) ≡ 1 (mod ((p-1)(q-1)) )。即d是e mod φ(n)的乘法逆。通常使用扩展的欧几里德算法计算。d称为私钥指数(private Exponent)/解密指数(decryption Exponent)。
最后密钥对用到三个数:模n、加密指数e和解密指数d。公钥含有n和e;而私钥含有n和d。
涉及RSA算法强度的是密钥长度,如今512位已经很少使用。典型密钥长度,用户应使用1024位密钥,证书认证机构应用2048位或以上。针对RSA最流行的攻击一般是基于大数因数分解。2009年12月12日,编号为RSA-768(768 bits,232 digits)数被成功分解。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。
三.注册算法分析
Restorator 2007用RSA的签名消息来验证注册信息的有效性:用户名就相当于消息,Bome Software为其计算一个SHA1值,再用私钥加密形成签名,作为注册码发送给用户。程序运行时首先从注册表读入Name、Password和Type,如果失败,就提示输入Name和"Licence Key",然后程序也为Name计算一个SHA1,再用公钥解密读入或输入的注册码得到另一个SHA1,两者相比较。如果相符就表明是合法用户。
对比原版的b1709、b1729和b1747发现,密钥是相同的。破解方面,REVENGE出过一个b1709,ZWT有b1729。按RSA算法的原理,必然都是Keygen和Patch的组合。由于算法没有变化,ZWT到b1746和b1747就只出Patch了。两者的破解方法是相同的——公钥替换,但用了各自的密钥对。私钥在Keygen里,公钥在Patch里。
REVENGE的Keygen用汇编写的,简单地用变异的UPX保护。Patch里面,当程序需要公钥时,返回Base64编码的公钥明文。
ZWT的Keygen用C写的,用"ASProtect 2.3 SKE build 06.26 Beta"保护。配合VolX的OllyDBG脚本,可脱壳正常运行,但有很多junk codes,不便分析。使用PE_Kill的"DecomAS - unpacker for ASProtect Version 1.7 Beta1 08.04.2011"脱壳,效果非常好。ZWT的Patch做得和原版相似,公钥的Base64明文加密后写回原来的位置。
Keygen是好的,显得优雅而专业;当然,我们也可以粗鲁一点,不用“费那事”,直接Crack,简单且有效。
Restorator 2007是用Delphi 2007写的。由于RSA算法的复杂性,注册算法采用了来自TSM Inc.的两个现成组件:AecRSA和SHA。Bome Software一定是购买了TSM Inc.的源码,程序中RSA组件有关私钥的代码全部去掉了。我能找到的这两个组件的免费版最高只支持Borland的D6和CB6。后面我会用这两个免费组件来演示制作一个Restorator 2007的Keygen,先来看看REVENGE、ZWT们Patch了什么,以原版build 1747和ZWT的Patch为例。
对比原版和Patch版发现,.text区段有两个地方被修改:一段数据块和一个字节的跳转。
A. 数据块对比
原版数据块VA 004FB600,长度0x29A:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
