"ASProtect 1.23 RC4"因为太古老,人们已经不玩这个了!
看了一下楼主的目标,efsoftware的"EF Find v5.30",又下载了其最近的版本"EF Find v7.30"(发布日期:2013-09-30,仍然用的这个古典壳),感觉它的注册算法有点意思,简单说说。
"EF Find"是一款搜索软件,用于搜索
7-Zip,ACE,ARC,ARJ,BZIP2,CAB,CPIO,GZIP,IMG,ISO (ISO9660),LHA,RAR,RPM,SFX,SQX,TAR,TGZ,ZIP和ZOO 压缩文件里的文件、文本和正则表达式。
试用版的限制:
. 30天试用
. 只显示第一个匹配文件名;其它文件名以"-------.---"替代
. NAG窗
先回答楼主的问题。
楼主已经注意到,ASProtect使用"SE Handler"来实现跳转,或者说摆脱新手的单步跟踪(其实也谈不上)。
引发异常处有(以EF Find v5.30为例):
#1:
B841A4 XOR [EAX], EAX
B841A6 JMP SHORT 00B841A9
#2:
B83AC1 XOR [EAX], EAX
B83AC3 JMP SHORT 00B83AC6
...
#25:
B84C22 XOR [EAX], EAX
B84C24 JMP SHORT 00B84C27
#26:
B839EC XOR [EAX], EAX
B839EE POP DWORD PTR FS:[0]
请注意这些指令的地址已经不属于程序领空,位于ASProtect的内部DLL内(基址00B70000,其它机器可能不同)。这些地方的EAX已经置0,所以"XOR [EAX], EAX"会触发内存访问异常。
跟踪"SE Handler"最终会来到ntdll.ZwContinue,其PCONTEXT偏移B8处指向异常处理结束后应返回的地址。这个地址总是指向"XOR [EAX], EAX"后的下一条指令。如上面的:B841A6,B83AC3,……,B84C24和B839EE。
楼主失误之处是在这些地址上设置“
硬件执行断点 ”,这是断不下来的!
正确的方法是设置“
普通执行断点F2 ”,就可以断下来了。要注意的是,有时断下来后标志寄存器EFLAG的单步会置位,清零即可。
所以为方便,OD的“异常”标签中应勾选“忽略内存访问异常”,留给目标自己去处理,省去每次SHIFT+F9的麻烦。
如果是为了学习ASProtect,可以这样一步一步跟下去。不过这个目标并没有使用ASProtect提供的注册机制,而是自己实现了一套注册方法,跟壳代码就没有任何意义,应该从OEP后开始。
想了解这个版本ASProtect的注册体系,可参考我在“
小白在破解一个注册表重启验证的软件时遇到的问题,求助。 ”里的回复。
通过跟踪壳代码会找到到达OEP或NEAR OEP(在OEP代码被偷时)的最后一“跳”:
00401000 > 68 01105000 PUSH 00501001 ; Entry point
00401005 E8 01000000 CALL 0040100B
0040100A C3 RETN ; to 00501001
0040100B C3 RETN ; to 0040100A
00501001 60 PUSHAD ; in ".fn" section
00501002 E8 03000000 CALL 0050100A
...
00B97295 894424 1C MOV [ESP+1C], EAX ; EAX=004AA2EC
00B97299 61 POPAD
00B9729A 50 PUSH EAX
00B9729B C3 RETN ; to 004AA2EC
004AA2EC E8 95E10000 CALL 004B8486 ; OEP / NEAR OEP
004AA2F1 E9 78FEFFFF JMP 004AA16E
这里注意到PUSHAD/POPAD指令结构,一个使用“
ESP定律 ”很好的提示。不幸的是,“
ESP定律 ”脱壳在这里不起作用,“软硬不吃”。
但可通过几个简单步骤迅速来到
OEP 或
NEAR OEP 的
004AA2EC 处。要点是ASProtect服“软”不服“硬”,后来将这几个步骤写为脚本以迅速定位OEP,且通用于该ASProtect版本加壳的目标。
因为想弄清楚它的注册算法,并不关心ASProtect本身,所以在OD载入目标后每次都运行这个脚本作为开始,来快速到达需要关注的地址。
也可以采用脱壳的方式,方便“破解”及“汉化”。在恰当的地方、经过适当地处理可得到完美脱壳的目标程序,甚至经ASPack压缩的内部DLL。
“破解”并不容易,涉及很多地方及“暗桩”;另外,作者还使用了自己的代码来进行文件自校验。所以“注册”更简单和安全,同时还适用于它的x64版本。
注册通过与主程序EFFind.exe相同文件夹下的授权文件"
EFFIN.LIC "来实现,其内容为:
EF Find distribution license
Copyright (c) 1994-2013, Emil Fickel
All rights reserved.
This copy is licensed to:
Name : MistHill
Company : bbs.pediy.com
Serial No.: 182140-24614-90783210
Reg.ID. : BLC842C95RI;CM48FMBLBM3;814L2M2L3KA5B1653O:8AN3R4:AR61;7F
Warning: This product is licensed to you pursuant to the terms of the
author license agreement included with the original software.
It is protected by copyright law and international treaties.
Unauthorized reproduction or distribution may result in severe civil and
criminal penalties, and will be prosecuted to the maximum extent possible
under the law.
One registered copy of this software may be dedicated to a single
person who uses the software on one or more computers or to a single
workstation used by multiple people.
有效授权为"Reg.ID."字段的字符串内容,是经过某种简单算法的编码。出于众所周知的原因,这里帖出的内容解码后是无法正确注册的。
经编码的"Reg.ID."包括以下字段:
. 序列号
. 授权文件的时间戳
. 授权文件内容的校验和
. 用户名校验和
. 序列号校验和
. 组织/公司名校验和
. 以上三项字符串的校验和
总的来说,整个体系设计得还算不错,检测方面用到了定时器和多线程等手段,有的检测要在特定情况下才出现。
缺点是各个算法相对比较简单。另外,没有进行硬件锁定,泄露的授权文件适用于其他机器,所以它的黑名单会随版本的更新越来越长。
Keygen需要完成的任务:
1) 找到它的解码代码,并根据解码算法写编码算法。
2) 找到各校验和的算法,填写到相应字段中。
"EF Find 5.30"和"EF Find 7.30"算法完全一致,授权文件"EFFIN.LIC"是通用的。
这个软件本身没有太大意义,Windows已经集成了桌面搜索功能,不知道是否支持压缩文件和正则表达式,感觉把它作为CrackMe或KeygenMe来玩更有意思一些。
上传的附件: