ScriptCryptor. V 2.9.7.0英文版的下载地址:http://www.abyssmedia.com/scriptcryptor/
---------------------------------------------------------
开场白:
我学破解都有都快两个月了,自己从未真正破解过一个软件,看着看雪的高手们的原创文章不断涌现,心有不甘,下决心要好好实战一回!
这是我第五次碰它了,之前都没有成功. 但我没有放弃。
终于在几个小时不吃不喝的奋战下找到他的”关键”了~ 呵呵. (高手见笑了)
软件:
自己偶尔会写点VBS程序玩玩,经常要用到“ScriptCryptor”编译器,但编译器没有注册当然是件麻烦事,编译成的EXE程序会有那么一个”Demo Version”提示框,有影响美观.
以下是对ScriptCryptor. V 2.9.7.0的破解总结,就说详细点,好让新手看明白:
先打开软件注册下,看有什么可用信息。
在注册框输入用户名和注册码,按Register,注册窗就立即关闭了,没有任何提示。再打开以下注册窗,发现刚才的注册名和KEY还在,如上图.可以判断是重起验证的。
在它的目录没有发现什么可疑的文件,估计是保存在注册表的。
大概了解下软件的注册机制了,接着用PEID查下壳是UPX 0.89的,这个壳不难脱,马上动手:
载入OD用ESP定律脱
下了硬件访问断点后,F9运行,来到这里就能看到跳向OEP的JMP,但这里有个回跳,在回跳下F4,再F8几步到OEP了:
005FD55E 8D4424 80 lea eax,dword ptr ss:[esp-80]
005FD562 6A 00 push 0
005FD564 39C4 cmp esp,eax
005FD566 ^ 75 FA jnz short ScriptCr.005FD562
005FD568 83EC 80 sub esp,-80
005FD56B - E9 E0A7F2FF jmp ScriptCr.00527D50
OEP:
00527D50 55 push ebp
00527D51 8BEC mov ebp,esp
00527D53 83C4 F0 add esp,-10
到达OEP后,在用LordPE脱壳,先纠 正一下映像大小 ,然后完整转存,保存为dumped.exe
完整转存后,就可以用ImportREC修复了:
在“附加到一个活动进程”的选项框里找到scriptcryptor.exe的进程---再使用OD的脱壳插件把OEP的地址复制下来,填到mportREC的OEP小框上---点自动查找IAT--获取输入表--显示无效函数(如果有无效的就剪掉)--修复转存文件---打开刚才用LordPE脱壳的dumped.exe 就修复完成了。
再用PEID查下刚才已脱壳修复的,发现已经没有壳了,是用Delphi写的:
用OD载入,OD分析代码后,搜索字符串“Register”发现几处标为"Registered Version"(“注册版本”的意思):
双击第一处的"Registered Version"进去,找到段首下F2断点,按Crlt+F2重新载入程序,F9运行起来后,点软件的菜单Help-Register就中断在刚才的地方了:
中断后,跟下去会发现之前输入的用户密码出来了,这里是它的重起验证的第一个地方,找到他们的关键:
00504983 . E8 38E70100 call ScriptCr.005230C0 ; 关键CALL
00504988 . 84C0 test al,al
0050498A . 74 57 je short ScriptCr.005049E3 ; 关键跳 :
跳是由al控制的,当al等于0时就跳,原本程序是跳的,所以要把al不等于0.
我这里就直接把关键跳NOP掉..保存一下,然后载入保存的文件.
接着搜索字符串,查找下一处字符串"Registered Version",双击进去,可以看到je short 00523D28是跳过mov edx,ScriptCr.0052406C的,零跳转是由上面的EAX的底位al控制,而al的值是由byte ptr ss:[ebp-11]给的,此时byte ptr ss:[ebp-11]是等于0的,所以跳了:
00523D00 |. 0FB645 EF movzx eax,byte ptr ss:[ebp-11]
00523D04 |. 84C0 test al,al
00523D06 |. 74 20 je short ScriptCr.00523D28
00523D08 |. 8B83 60030000 mov eax,dword ptr ds:[ebx+360]
00523D0E |. 8B80 50020000 mov eax,dword ptr ds:[eax+250]
00523D14 |. BA 01000000 mov edx,1
00523D19 |. E8 8AD6F6FF call ScriptCr.004913A8
00523D1E |. BA 6C405200 mov edx,ScriptCr.0052406C ; ASCII "Registered Version"
00523D23 |. E8 DCD5F6FF call ScriptCr.00491304
00523D28 |> 33C9 xor ecx,ecx
直接NOP掉红色的那三句,然后写上mov eax, 1
让eax为true状态(不知有没效果呢^-^)
--跟踪时发现注册信息是保存在注册表的"HKCU\Software\Abyssmedia\ScriptCryptor\Settings"位置.
修改好了,就保存下,以防一起保存不完全. 然后载入保存的文件.
.
接着搜索最后一处字符串"Registered Version",会看到这里有个"Registration Successful!"(注册成功)可想到我们已经来到注册的地方了,刚才的那两处是重起验证的。
这里的修改方法和上面的一样,直接NOP掉这三句:
005246C6 8BC3 mov eax,ebx
005246C8 84C0 test al,al
005246CA 74 38 je short ScriptCr.00524704
再填上mov eax, 1.
可能有的朋友会问了,直接修改这里不就可以了吗?
答案:是不可以的,因为这个软件是重起验证的,就因为是重起验证的,我们只要通过验证,那么这个改不改也无所谓,所以这个可以不改.只改上面那两个就可以了
所有都改完了,打开一看哈终于是注册版本了,真高兴:
生个程序看..可以生成EXE程序,打开这个EXE看看,晕了,还是有”Demo Version”提示框,.想它应该是启动就放入了一个判断值。
那这个值会在什么时候出现用到呢?软件既然前面的都过了,但编译出的程序依然是试用版的,那么这个值应该就在编译的代码段那了。
Delphi写的可以用DEDE找它的编译(compile)按钮事件,放入到DEDE里,用PE Explorer辅助查找到编译按钮属性名称为:ProjectCompile1Execute 地址:00524398
只能再载入OD里找找看了,跳到地址00524398 ,下F2断点,F9运行,打开一个VBS文件,点编译,就断在00524398了。
然后在辛苦的F7进入每个CALL跟踪,终于找到了编译主CALL,接下只要进这个CALL找提示处理的CALL即可:
F7进入编译CALL里后,不久就找到处理提示的关键CALL了,是根据下面的分析得知的
(意外的让这个CALL里的一个jns跳实现了,结果运行生成的程序是没有"Demo Version"提示的!所以肯定是这里.):
00525818 . E8 87FBEDFF call ScriptCr.004053A4 ; 处理提示的关键CALL
0052581D . 75 02 jnz short ScriptCr.00525821
--------------------------------------------------------------------------------------------
这个“处理提示的CALL”可以分析下,但也可以不理哈:
F7进入关键发现果然了前面提到的关键值,实际是个内存值(dword ptr ds:[eax-4]),使用这个值mov给ecx,再跳到逻辑运行代码,然后下面用一个jns(非负数转移指令)来判断ECX的值是不是负数,负数的就不跳,如果正数就跳回已注册,但跟踪这个内存值发现是ebx动态放入的,进去研究了2个小时的算法- -~(看不懂)汗,很多办法用上了都不行,提示错误.
还是回来看看这个CALL的关键部分好了:
004053BA |. 53 push ebx
004053BB |. 83D1 FF adc ecx,-1
004053BE |. 21D9 and ecx,ebx \\与运行,ecx等于0
004053C0 |. 2B48 FC sub ecx,dword ptr ds:[eax-4] \\ds:[eax-4]此时等于十六进制的20,相减后等于负数FFFFFFE0(-32)
004053C3 |. 29C8 sub eax,ecx
004053C5 |. 29CA sub edx,ecx
004053C7 |> 8B1C01 /mov ebx,dword ptr ds:[ecx+eax]
004053CA |. 331C11 |xor ebx,dword ptr ds:[ecx+edx]
004053CD |. 75 0A |jnz short ScriptCr.004053D9 \\跳了
004053CF |. 83C1 04 |add ecx,4
004053D2 |.^ 78 F3 \js short ScriptCr.004053C7
004053D4 |> 58 pop eax
004053D5 |. 01C0 add eax,eax
004053D7 |. 5B pop ebx
004053D8 |> C3 retn
004053D9 |> 0FBCDB bsf ebx,ebx \\跳到这 什么指令?
004053DC |. C1EB 03 shr ebx,3 \\08逻辑右移三位等于1
004053DF |. 01D9 add ecx,ebx \\ECX加1,还是等于负数
004053E1 |.^ 79 F1 jns short ScriptCr.004053D4 \\关键跳,但没有跳回去,下面retn是去到非注册的,这里不能改,改了会出错.
004053E3 |. 8A0401 mov al,byte ptr ds:[ecx+eax]
004053E6 |. 3A0411 cmp al,byte ptr ds:[ecx+edx]
004053E9 |. 5B pop ebx
004053EA |. 5B pop ebx
004053EB |. C3 retn
既然这里是编译部分的判断注册关键 ,那我们NOP掉这个处理提示的关键CALL和CALL下面的jnz跳,不让他调用不就可以了吗?
------------------------------------------------------------------------------------------------------
.. 结果直接NOP掉这两句,保存就可以了 ,最终还是NOP好使 呵呵!
已经没有"Demo Version"的提示框了:
- 标 题:ScriptCryptor. V 2.9.7.0英文版
- 作 者:sky科
- 时 间:2010-06-19 05:08:27
- 链 接:http://bbs.pediy.com/showthread.php?t=115339