不知楼主进展如何。
找了个v2.8的看了看,有点意思,可玩性极强!
它是用ASProtect 1.23 RC4来保护的,并使用了它的注册系统。
查壳软件能识别出是ASProtect,但不能确定具体版本。比如,DIE: ASProtect(1.33-2.1 Registered)[EXE32];FastScanner 4: ASProtect v1.33 - v2.1 Registered -> Alexey Solodovnikov。
ASPrINFO则一无所知,因为它实在太老了──十年前的产品。从其整个体系的设计思想和算法的具体实现来看,不能否认它的经典。
正因为经典,有很多人研究,按这个版本搜索论坛会得到大量文章。知道的人多了,强度自然就减弱了。
读那些文章很有意思,你会发现它造就了现在论坛的一大批大神!有的已经离开,让人怀念。
不过这些文章讲脱壳、破解的多,几乎没有找到讲算法的(我的搜索有问题?)。
为什么要脱?我逐渐明白了,国情决定的,因为要“汉化”。Crystal Button 2.5/2.8有很好的破解中文版,可供研究学习。
论坛有篇帖子讲怎么利用到达OEP之前内存访问异常的次数来准确识别早期ASProtect的版本,我写了个脚本来记录次数(26次)和位置以确认版本。当然对Crystal Button来说,已早有定论。
算法方面,Amenesia//TKM!有文章讲利用AS在生成RSA密钥时的漏洞来攻击ASProtect 1.0/1.1/1.11c的RSA-1024保护。论坛有两个帖子翻译这同一文章,足见其影响和重要。
好了,现在有两条路:脱壳、破解或搞定注册算法。
a) 脱壳、破解
有太多的文章,fly有很多经典文章。用工具脱或手工脱:Stripper不能替你还原OEP处的代码,手工则可以完全补回OEP的Stolen Code。VolX的脚本脱不了,目标版本太低!
这里有个术语:Pre-Dip。lipton有两篇文章专门讲这个,其中一篇还特别提到“水晶按钮”。请搜索KSSD或《看雪论坛精华6》。
脱完后,程序可以运行。“以自己的名字注册”也可出ZeNiX展示的About。但是事情没这么容易:注册版的导出和项目保存功能没法用。还需要破解!
我相信ZeNiX手里有可供注册的Key,嘿嘿!
b) 研究注册算法
如果楼主打算学习它的注册原理,就不应从你脱壳后的版本开始,这是徒劳:ASProtect的注册系统已经被你脱掉了,找不到的!
应该从原版开始!为方便,这次应勾选忽略"Memory access violation"。
楼主的思路是对的,断RegOpenKeyExA。我Crystal Button 2.8的记录:
[FONT="Courier"]00E1962D E8 C6BAFFFF CALL 00E150F8 ; JMP to advapi32.RegOpenKeyExA
00E19632 85C0 TEST EAX, EAX
0012FA70 00E19632 /CALL to RegOpenKeyExA from 00E1962D
0012FA74 80000001 |hKey = HKEY_CURRENT_USER
0012FA78 00E41F98 |Subkey = "Software\Crystal_Button_2\Crystal\Registration"
0012FA7C 00000000 |Reserved = 0
0012FA80 00020019 |Access = KEY_READ
0012FA84 0012FAAC \pHandle = 0012FAAC
00E1965F E8 A4BAFFFF CALL 00E15108 ; JMP to advapi32.RegQueryValueExA
00E19664 85C0 TEST EAX, EAX
0012FA6C 00E19664 /CALL to RegQueryValueExA from 00E1965F
0012FA70 0000005C |hKey = 5C
0012FA74 00E41F08 |ValueName = "Key"
0012FA78 00000000 |Reserved = NULL
0012FA7C 0012FAA0 |pValueType = 0012FAA0
0012FA80 00000000 |Buffer = NULL
0012FA84 0012FAA8 \pBufSize = 0012FAA8
00E1968F E8 74BAFFFF CALL 00E15108 ; JMP to advapi32.RegQueryValueExA
00E19694 8B45 F0 MOV EAX, [EBP-10]
0012FA6C 00E19694 /CALL to RegQueryValueExA from 00E1968F
0012FA70 0000005C |hKey = 5C
0012FA74 00E41F08 |ValueName = "Key"
0012FA78 00000000 |Reserved = NULL
0012FA7C 0012FAA0 |pValueType = 0012FAA0
0012FA80 00E42028 |Buffer = 00E42028
0012FA84 0012FAA8 \pBufSize = 0012FAA8
00E196B9 E8 22BAFFFF CALL 00E150E0 ; JMP to advapi32.RegCloseKey
00E196BE 33C0 XOR EAX, EAX
0012FA80 00E196BE /CALL to RegCloseKey from 00E196B9
0012FA84 0000005C \hKey = 0000005C[/FONT]
这里内部DLL的基址在00E10000,大小0001E000。在不同的操作系统和机器上会不同。已经不是程序的原区段地址空间了,所有的算法都在这里。
第一次advapi32.RegQueryValueExA返回Key的长度以分配空间,第二次读入Key。接下来返回地址00E19694以后就是怎么处理Key了。
搞清楚了它的算法和Key的结构后,再结合ASProtect自带的Keygen示例就可以自己做注册机了。
我测试机器的“硬盘指纹”和注册码:
[FONT="Courier"]HardwareID = "FKTuYABgFAA="
Key = "1xdggZpH/3Rs02Os8RNY2YzFkZt2l226TtBD33nx204wF6gnmig6/AHoBV62aJnmobrEcOIPGgaacrUFtf05TFx+1ZYaI9S9dqxBhk8RllVlA7C9fxwadw1bES0bh4ytXUo2TYr9vr2MS/BWvhC8KPno8Qrbf+JiUrKAz96DLwFM="[/FONT]
注意Key的第一个字符:'0'/'1',硬件锁定与否,应排除在BASE64编码范围内。“硬盘指纹”、Key的结构等等,如果有兴趣以后再讲。
按以往的经验替换用于RSA解密的密钥后,我就可以顺利注册了。但是Key里包含一个A(见Amenesia//TKM!的文章),我是没有的。它用来解密DLL后面的代码和程序空间的代码,没有它我就走不下去了。
这是ASProtect的强悍之处,所以破解的多,“注册”的少。很偶然地得到了它,这样我就能成功“注册”了。
16楼kingday讲“找个成功注册过的完整注册信息...”。是的,象这种东西,没有有效的注册信息很难搞,只有破解这条路可走。
遵循ZeNiX的教导,不要剥夺别人的挫折和喜悦。今天先讲这些,如果有需要再上传一个替换RSA密钥的“原版”和Key供参考。
“注册版”还可以弄成这样哦: