【文章标题】: WinASO Registry Optimizer 2.6
【文章作者】: PeerLessSoul
【作者邮箱】: liuz@km169.net
【作者主页】: http://114989149.qzone.qq.com
【作者QQ号】: 114989149
【软件名称】: WinASO Registry Optimizer 2.6
【软件大小】: 2.32MB
【下载地址】: www.download.com
【保护方式】: 注册码验证
【使用工具】: Peid,Ollice,W32dsm8.93
【作者声明】: 本人小菜,请大侠们不要见笑……
--------------------------------------------------------------------------------
【软件简介】
WinASO Registry Optimizer 是款系统注册表优化工具,在www.download.com上
Editor's rating ★★★★★
Average user rating ★★★☆
用下来感觉差不多~
【注册过程】
1.查壳(使用Peid)Borland Delphi 6.0 - 7.0 ,我就不多说了!
2.运行软件查看注册出错对话筐中的文字信息。
输入伪码,输入伪码感觉也有讲究……比如先什么都不输入直接点注册,看提示是否跟输入以后有奇异
这样脑子中就有思路了!代码段开始可能有个比较空,空就直接跳走的代码吧!经过伪码输入验证……发现无
论输哪个筐里面,和什么都不输入 ,和只输入某几个筐都出现相同的提示!这个意味着,他是通过全部的注册
码比对运算后才有一个终结跳转……或者是这些输入的注册码之间有什么联系(这个也是猜的)……因为就这个
软件而言没有用户名输入,他会不会取计算机名或者用户名来运算出正确注册码呢?我们就来看看我们的猜想
……可能大家的猜想更多。可以试着去猜想……软件也是人编的……可能会有跟作者想到一块的时候吧……
ok!理一下思路……我们继续玩猜想论
2.1.开头可能没有一个空的cmp,注册码之间可能有联系。可能取用户名/计算机名来计算注册码。
这里我输入1111-2222-3333-4444-5555 点击register在 出现
"Sorry,this is an invalid license Key……'字符串……启动W32dsm8.93载入主程序文件…查看字符串!似乎
是没有什么对应的字符串……那我们直接使用ollice.载入程序!
3.输入注册伪码,这里我输入1111-2222-3333-4444-5555 开始追踪……
OLLice跟踪过程这个软件Call相对要多一点,一定要有耐心……ollice载入程序!
--------------------------------------------------------------------------------
直接F9,然后输入伪码,先不用点register.返回Ollice 中Alt+E 下断MessageBoxA!再回到软件领空,然后点
注册……程序被断下到这里……
--------------------------------------------------------------------------------
观察标题栏,是user32中
77D5050B > 8BFF mov edi, edi ; 点击注册按钮后程序断在此
77D5050D 55 push ebp ; 观察ollice右下,这里为出现错误框作准备。
77D5050E 8BEC mov ebp, esp
77D50510 833D 1C04D777 0>cmp dword ptr [>
77D50517 74 24 je short 77D50>
77D50519 64:A1 18000000 mov eax, fs:[18>
77D5051F 6A 00 push 0
77D50521 FF70 24 push dword ptr [>
77D50524 68 F40AD777 push 77D70AF4
77D50529 FF15 1812D177 call [<&KERNEL32>; kernel32.InterlockedCompareExchange
77D5052F 85C0 test eax, eax
77D50531 75 0A jnz short 77D50>
77D50533 C705 F00AD777 0>mov dword ptr [>
77D5053D 6A 00 push 0
77D5053F FF75 14 push dword ptr [>
77D50542 FF75 10 push dword ptr [>
77D50545 FF75 0C push dword ptr [>
77D50548 FF75 08 push dword ptr [>
77D5054B E8 2D000000 call MessageBoxE>;
77D50550 5D pop ebp
77D50551 C2 1000 retn 10
--------------------------------------------------------------------------------
我们先不管他,F9走~返回到程序领空.然后删除第一个空格里面的伪码1111再点注册,呵呵还是断在这里……
在试试其他的……如果是不填写任何一个空格,或者是在任何一个框中输入了非数字字符,那么程序直接提示
注册错误,没被断下来!经过试验,发现只要你输入的是数字,点注册都能断在这里(当然是注册码不对的情况
下!呵呵).好么,我们看看是如何进入这个错误筐代码段呢?在一次的注册……又在一次的的被断下……不同
的操作是我们一步一步走~让他反回去,也可以按下ctrl+f9直接返回程序领空!当单步走到上面代码中
77D5054B E8 2D000000 call MessageBoxE>; 这个就是出现错误叫你确定的对话筐,现在回程序点
ok,又回到ollice再单步走……过了
77D50551 C2 1000 retn 10
你会发现你的标题栏改变了~现在就是程序领空了,出来后到这里,一出来就是个jmp!买买……
005634DB |. /E9 BE010000 jmp 0056369E
这个时候你会发现上面有个Call……你说那个是Call什么的?猜一下啊……
猜不出也不紧……就没必要往下看了。我们往上……一小点就发现个je,这家伙会不会是关键跳?具体代码如下
--------------------------------------------------------------------------------
程序领空
005634B0 |. /74 2E je short 005634E0 ; 这里有个je,看看右边有个目标连线。去看看
005634B2 |. |6A 40 push 40
005634B4 |. |A1 349E5800 mov eax, [589E34]
005634B9 |. |8B80 6C080000 mov eax, [eax+86C]
005634BF |. |E8 9821EAFF call 0040565C
005634C4 |. |50 push eax
005634C5 |. |8B45 FC mov eax, [ebp-4]
005634C8 |. |E8 8F21EAFF call 0040565C
005634CD |. |50 push eax
005634CE |. |8BC3 mov eax, ebx
005634D0 |. |E8 D7AFEFFF call 0045E4AC
005634D5 |. |50 push eax ; |hOwner
005634D6 |. |E8 BD4DEAFF call <jmp.&user32.Messag>; \MessageBoxA
005634DB |. |E9 BE010000 jmp 0056369E ; 返回程序领空时,我们出现在这里
005634E0 |> \8B75 F8 mov esi, [ebp-8] ; 哦~如果上面Je实现就跳过了上面这个jmp,
而上面这个jmp就是跳死的……
--------------------------------------------------------------------------------
会不会是关键跳?改啊~试啊~诀窍就是这两点!怕什么……有不是在系统领空,呵呵~
在005634B0 下断…并je->jne,在走一遍注册过程!哦~注册后断在005634B0 发现原来je没有实现,改成jne后
实现跳转……跳到005634E0开始另外一段代码段……
--------------------------------------------------------------------------------
005634E0 |> \8B75 F8 mov esi, [ebp-8] ; 修改后到这里……我们单步走!
005634E3 |. 81C6 EB000000 add esi, 0EB
005634E9 |. 0FAFF7 imul esi, edi
005634EC |. 83EE 05 sub esi, 5
005634EF |. 8D55 AC lea edx, [ebp-54]
005634F2 |. 8BC6 mov eax, esi
005634F4 |. E8 3767EAFF call 00409C30
005634F9 |. 8B45 AC mov eax, [ebp-54]
005634FC |. 8D4D B0 lea ecx, [ebp-50]
005634FF |. BA 04000000 mov edx, 4
00563504 |. E8 174CEEFF call 00448120
00563509 |. 8B45 B0 mov eax, [ebp-50]
0056350C |. 50 push eax
0056350D |. 8D55 A8 lea edx, [ebp-58]
00563510 |. 8B83 C0030000 mov eax, [ebx+3C0]
00563516 |. E8 9134EFFF call 004569AC
0056351B |. 8B55 A8 mov edx, [ebp-58]
0056351E |. 58 pop eax
0056351F |. E8 8420EAFF call 004055A8
00563524 74 2E je short 00563554 ;这里有个je又在跳什么啦?
00563526 |. 6A 40 push 40
00563528 |. A1 349E5800 mov eax, [589E34]
0056352D |. 8B80 6C080000 mov eax, [eax+86C]
00563533 |. E8 2421EAFF call 0040565C
00563538 |. 50 push eax
00563539 |. 8B45 FC mov eax, [ebp-4]
0056353C |. E8 1B21EAFF call 0040565C
00563541 |. 50 push eax
00563542 |. 8BC3 mov eax, ebx
00563544 |. E8 63AFEFFF call 0045E4AC
00563549 |. 50 push eax ; |hOwner
0056354A |. E8 494DEAFF call <jmp.&user32.Messag>; 到这里有弹出注册错误的对话筐……
--------------------------------------------------------------------------------
联想起第一个错误对话筐,往上找找,又有个je,我们再来修改,再在je哪里下断!!
--------------------------------------------------------------------------------
00563524 /75 2E je short 00563554 ;修改后实现跳转
00563526 |. |6A 40 push 40
00563528 |. |A1 349E5800 mov eax, [589E34]
0056352D |. |8B80 6C080000 mov eax, [eax+86C]
00563533 |. |E8 2421EAFF call 0040565C
00563538 |. |50 push eax
00563539 |. |8B45 FC mov eax, [ebp-4]
0056353C |. |E8 1B21EAFF call 0040565C
00563541 |. |50 push eax
00563542 |. |8BC3 mov eax, ebx
00563544 |. |E8 63AFEFFF call 0045E4AC
00563549 |. |50 push eax ; |hOwner
0056354A |. |E8 494DEAFF call <jmp.&user32.M>; \MessageBoxA;实现跳转就跳过了这个错误筐!
0056354F |. |E9 4A010000 jmp 0056369E
00563554 |> \8D55 A4 lea edx, [ebp-5C] ;上面跳到这里!
--------------------------------------------------------------------------------
我们单步往下走,发现提示注册成功……但是退出后再运行程序,还是要注册!伤!说明只是暂时的欺骗过去
一下……但是我们也获取到重要信息,再追一下可能有转机……实现完美注册!
清理一下思路,我们改了两个je为jne而实现个伪注册……
005634B0 |. /74 2E je short 005634E0
00563524 /75 2E je short 00563554
这两个跳转实现注册成功提示!(没有完美注册!)绕过出错的对话筐…
还有一点要明白~如果第一个跳转没有实现也就走不到第二个跳转……
现在我们就要找出让他们跳转的条件……撤销所有修改……
返回到第一个关键je,
--------------------------------------------------------------------------------
005634AB |. E8 F820EAFF call 004055A8
005634B0 74 2E je short 005634E0 ; 这是我断下后见到的第一个关键je
005634B2 |. 6A 40 push 40
这个CAll很有可能是在判断什么……进去看看在call处下断,然后进入……
--------------------------------------------------------------------------------
004055A8 /$ 53 push ebx ;进入后观察寄存器的值
004055A9 |. 56 push esi
004055AA |. 57 push edi
004055AB |. 89C6 mov esi, eax
004055AD |. 89D7 mov edi, edx
004055AF |. 39D0 cmp eax, edx ;喜欢这个吧~在数据栏中就清楚看到伪
码同一个数字比较(我这里是8639)
004055B1 |. 0F84 8F000000 je 00405646 ;上面比较相同跳走!
.<代码省略>
.<代码省略>
.<代码省略>
.<代码省略>
00405646 |> 5F pop edi ;如果上面je跳转实现就跳到这里
00405647 |. 5E pop esi
00405648 |. 5B pop ebx
00405649 \. C3 retn ;返回到005634B0来判断第一个关
键je是否实现……
--------------------------------------------------------------------------------
那么我们就把4444改写为8639,伪码写成1111-2222-3333-8639-5555在来注册这个时候发现第一个je通过了,
而我们的的第二个je又没有实现跳转,再往第二个je上看看,果然又发现一个Call。同样到了4055A8,清晰了!
原来4055A8是用来比较伪码与真码的程序段。同样从004055AF中清晰的看出是5555同8091比较,je就实现也就
跳出比较的程序段,然后第二个关键je实现……也就成功注册上了!
那好现在我输入1111-2222-3333-8639-8091注册成功……单独启动程序,没提示需要注册……算是完美注册了
我们是要Key它,就继续我们的路程吧!现在看看1111-2222-3333是否跟后面的8639-8091有决定性的影响?
还是下断在MessageBoxA然后试着改变一下1111-2222-3333看看程序是否能被断下~果然当你改变前面的字符!
程序还是被断下。说明是存在关系的。根据前面的一些思路~那个真码应该是在第一个关键je之前出现,我们
直接去第一个关键je,前面!在0056347B下断!F8 单步走~细心留意寄存器里面的值!走一遍之后你会大致了
解第一次出现明码在什么地方!
--------------------------------------------------------------------------------
0056347B |> \8D55 B8 lea edx, [ebp-48] ; edx=第一个四位伪码(1111)
0056347E |. 8BC6 mov eax, esi
00563480 |. E8 AB67EAFF call 00409C30
00563485 |. 8B45 B8 mov eax, [ebp-48] ; 原始码首次出现
00563488 |. 8D4D BC lea ecx, [ebp-44] ; 原始码
0056348B |. BA 04000000 mov edx, 4
00563490 |. E8 8B4CEEFF call 00448120 ; 原始码去后四位得(第四位)真码
00563495 |. 8B45 BC mov eax, [ebp-44] ; eax=[ebp-44](真码)
00563498 |. 50 push eax
00563499 |. 8D55 B4 lea edx, [ebp-4C]
0056349C |. 8B83 B4030000 mov eax, [ebx+3B4] ; eax=真码
005634A2 |. E8 0535EFFF call 004569AC
005634A7 |. 8B55 B4 mov edx, [ebp-4C] ; edx=注册伪码
005634AA |. 58 pop eax
005634AB |. E8 F820EAFF call 004055A8 ; (第四位)假码与真码比较
005634B0 74 2E je short 005634E0 ; 这个就是我们的第一个关键跳……
--------------------------------------------------------------------------------
经过测试~发现每当改变前两个伪码,那么005634AB那里出现的明码就是改变。我们再大胆的猜,注册码后两
位与前两位有关!为了追查算法……我们该整理一下手头资料!
1111-2222-3333-8639-8091
hex:457-8AE-D05-21BF-1F9B
我们再进入ollice去一探究竟……我们往上看……到这里出现个类真码,应为他有7位,而后四位就是我们的真
码8639
00563485 |. 8B45 B8 mov eax, [ebp-48] ; 原始码首次出现
那么更加清晰了啊~算这个原始明码肯定在前面……我们走!
到这里……005633F9下断以后我们在F8步过……观察寄存器值以及中间那个数据栏中情况变化……发现!……
--------------------------------------------------------------------------------
005633F6 |> \8D55 C8 lea edx, [ebp-38] ;
005633F9 |. 8B83 A0030000 mov eax, [ebx+3A0]
005633FF |. E8 A835EFFF call 004569AC
00563404 |. 8B45 C8 mov eax, [ebp-38] ; 取第一个伪码
00563407 |. E8 6069EAFF call 00409D6C
0056340C |. 8BF0 mov esi, eax ; 取第一个伪码的hex
0056340E |. 8D55 C4 lea edx, [ebp-3C]
00563411 |. 8B83 A4030000 mov eax, [ebx+3A4]
00563417 |. E8 9035EFFF call 004569AC
0056341C |. 8B45 C4 mov eax, [ebp-3C] ; 取第二个伪码!
0056341F |. E8 4869EAFF call 00409D6C
00563424 |. 8BF8 mov edi, eax ; 取第二个伪码的Hex
00563426 |. 8D55 C0 lea edx, [ebp-40]
00563429 |. 8B83 AC030000 mov eax, [ebx+3AC]
0056342F |. E8 7835EFFF call 004569AC
00563434 |. 8B45 C0 mov eax, [ebp-40] ; 取第三个伪码!
00563437 |. E8 3069EAFF call 00409D6C
0056343C |. 8945 F8 mov [ebp-8], eax ; 取第三个伪码的Hex
0056343F |. 0FAFF7 imul esi, edi ; 第二个伪码Hex*第一个伪码Hex
00563442 |. 83EE 03 sub esi, 3 ; 上面结果-3
00563445 |. 81FE 10270000 cmp esi, 2710 ; 与2710比较,也就是不能大于10000
0056344B |. 7D 2E jge short 0056347B ; 小于就跳转! --------------------------------------------------------------------------------
在上面的步过中,你会发现我们输入伪码被转换成十六进制,还是把伪码先翻成十六进制好!在这里你可以一
眼看出的……
在写成数学的计算公式:
第四个真码为:第一位伪码的十六进制*第二位伪码的十六进制-3,最后结果在换成十进制,再取最后四位!
1111-2222-3333-8639-8091
hex:457-8AE-D05-21BF-1F9B
(8AE*457)=0025ab22-3=0025ab1f ,0025ab1f转十进制为2468639.再取后四位8639,ok!搞定一个了!
接下来思考~上面说了……有两个关键跳~我们这里就是在第一个关键跳失效的情况下,往前找到算理。
那么后一个我们可以照葫芦画瓢,让第一个关键je实现……在第二个关键je上面找寻我们的答案……
这下输入伪码1111-2222-3333-8639-5555 可以直接到第二个关键je的前面点处下断了……我们再进入ollice去
一探究竟……又发现……
--------------------------------------------------------------------------------
005634E0 |> \8B75 F8 mov esi, [ebp-8] ; 这里以来就取第三位伪码Hex
005634E3 |. 81C6 EB000000 add esi, 0EB ; 上面的Hex加上0EB
005634E9 |. 0FAFF7 imul esi, edi ; 第二位Hex*上面的值
005634EC |. 83EE 05 sub esi, 5 ; 再减去5
005634EF |. 8D55 AC lea edx, [ebp-54]
005634F2 |. 8BC6 mov eax, esi
005634F4 |. E8 3767EAFF call 00409C30
005634F9 |. 8B45 AC mov eax, [ebp-54]
005634FC |. 8D4D B0 lea ecx, [ebp-50] ; 将上面的值转成十进制!
005634FF |. BA 04000000 mov edx, 4
00563504 |. E8 174CEEFF call 00448120
00563509 |. 8B45 B0 mov eax, [ebp-50] ; 取后四位位为真码!
0056350C |. 50 push eax
0056350D |. 8D55 A8 lea edx, [ebp-58]
00563510 |. 8B83 C0030000 mov eax, [ebx+3C0]
00563516 |. E8 9134EFFF call 004569AC
0056351B |. 8B55 A8 mov edx, [ebp-58]
0056351E |. 58 pop eax
0056351F |. E8 8420EAFF call 004055A8 ; 真码伪码的最后一次比较~成功就注册喽!
00563524 74 2E je short 00563554 ; 这里就是关键的成败了……呵呵!
Well!清理线索的时间又到喽!
最后的注册码比较跟前面的类似,
最后一个的算法写成文字就是:
第二位伪码的十六进制乘以(第三位伪码的十六进制+0EB),再减去5,再转十进制……取后四位成为真码~
顺便写个注册机了!程序业余爱好者,就使用VB了~大家见谅~
注册机下载地址:http://km.liuz.googlepages.com/ASO-Keygen.exe
【后话】:这个是我第二篇写破文,感觉不是那么流畅……我发之前看了好几遍~力求给您一个清晰的思路。
可能还有些地方没写清楚~如果你有什么建议的话可以留贴!
pediy上高手众多,望高人不要见笑!
我以后会多写些东西出来给大家分享,这也是我的一个自我总结,呵呵~大家一同学习一同进步。
---------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年07月21日
凌晨 3:43
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)