首先我们用工具查壳,显示如下图:
壳类型为:ASProtect v1.23 RC1,那么我们直接用工具脱壳好了。 打开工具如图:
打开“选项”进行如下设置:
上图的设置是必须的,不然会报错。 见如下图,说明我们成功脱完了,会自动生成一个:WPasRec_u.exe
再用工具查一下壳:
脱的很干净。顺便看一下算法,结果很是吓人……
接下来,我们用OD来看看吧。先查下字符串,结果字符串并不多,然后我们用C32Asm对脱壳后的程序进行反汇编看看,结果很丰富啊,有很多字符串供我们参考。
接着我们可以根据这些字符串的地址对应到OD中的地址,进行动态调试…… 打开软件看看有什么值得我们利用的东西。
在file菜单下的setting access password,用来设置软件运行的密码。 对于第一个地方我们最好用调用堆栈法。 顺利找到了这里: 00429461 . 83C4 04 add esp,4 00429464 . 85C0 test eax,eax 00429466 . 75 53 jnz short WPasRec_.004294BB ;关键跳转。改为jmp 00429468 . 8D4C24 04 lea ecx,dword ptr ss:[esp+4] 0042946C . 68 1D800000 push 801D 00429471 . 51 push ecx 将00429466处的jnz改为jmp后成功爆破,如下图。
也可以更改eax的值,如将00429461处的add esp,4改为mov eax,4也可以达到跳过注册框的目的。
破解后直接进行设置密码的地方。
★第二个需要破解的地方: 在help菜单下的about。
接下来,我们看关键字符串,在里面发现有一个Registered to: 这个便是about里面的那个了,
地址是0041C4F6,在OD中我们找到0041C4F6,在段首下断点。 0041C4CC . 83C4 04 add esp,4 0041C4CF . 3BC3 cmp eax,ebx 0041C4D1 . 74 63 je short WPasRec_.0041C536 ;关键跳转 0041C4D3 . 51 push ecx 0041C4D4 . 8BCC mov ecx,esp 0041C4D6 . 896424 14 mov dword ptr ss:[esp+14],esp 0041C4DA . 68 90554900 push WPasRec_.00495590 ; ASCII "UserName" 0041C4DF . E8 06580400 call WPasRec_.00461CEA 0041C4E4 . 8D4C24 14 lea ecx,dword ptr ss:[esp+14] 0041C4E8 . 51 push ecx 0041C4E9 . E8 D21B0000 call WPasRec_.0041E0C0 0041C4EE . 83C4 08 add esp,8 0041C4F1 . 50 push eax 0041C4F2 . 8D5424 10 lea edx,dword ptr ss:[esp+10] 0041C4F6 . 68 7C554900 push WPasRec_.0049557C ; ASCII "Registered to: " 0041C4FB . 52 push edx 0041C4FC . 895C24 2C mov dword ptr ss:[esp+2C],ebx 0041C500 . E8 805A0400 call WPasRec_.00461F85  取得注册者的名字 里面的代码为: 00461FB7 |> \8B4D 10 mov ecx,[arg.3] 将注册者的名字放入ecx 00461FBA |. 8B09 mov ecx,dword ptr ds:[ecx] 00461FBC |. 51 push ecx 00461FBD |. FF71 F8 push dword ptr ds:[ecx-8] ★我们接着看一下,怎么成功注册 打开注册窗口:
进行假注册:
弹出错误对话框:
通过查找字符串,我们发现有如下提示:
那么我们也可以用关键字符来确定位置,直接到00422434处。 在段首00422280处下断,单步分析。 004222DE . 8B42 F8 mov eax,dword ptr ds:[edx-8] 004222E1 . 85C0 test eax,eax 004222E3 . 75 39 jnz short WPasRec_.0042231E ‚
00422321 . 8B41 F8 mov eax,dword ptr ds:[ecx-8] 00422324 . 85C0 test eax,eax 00422326 . 75 39 jnz short WPasRec_.00422361 00422328 . 8D55 E0 lea edx,dword ptr ss:[ebp-20] 说明:以上两个地方分别验证用户名和注册码是否为空,为空则出错。 简单验证之后顺利来到了关键跳: 0042238C . 85C0 test eax,eax 0042238E . 0F84 DA010000 je WPasRec_.0042256E 关键跳 00422394 . 8D4D E0 lea ecx,dword ptr ss:[ebp-20] 但是跑起来之后出现了错误提示:
怀疑是有验证。 于是找到错误地址在: 00401072 |. 85C0 test eax,eax 00401074 |. 75 24 jnz short WPasRec_.0040109A :改为jmp直接跳过错误提示 00401076 |. 8B4424 10 mov eax,dword ptr ss:[esp+10] 程序顺利读取用户名,注册码等信息,并弹出注册成功提示。
点确定之后再次出现错误提示:
发现地址在: 004224D0 . FF15 20424900 call dword ptr ds:[494220] 跟进去,OD出现一片空白,在前面有一个跳转。 004224CE . /75 77 jnz short WPasRec_.00422547 改为jmp自动跳过验证。 004224D0 |FF15 20424900 call dword ptr ds:[494220] 错误提示 004224D6 . |E9 17000000 jmp WPasRec_.004224F2 搞定后程序跑起来了。 因为在试用软件时我们知道,程序可以顺利破解密码,只不过不能显示全文,取原文前200(十六进制中为C8)个字符,
然后用“To view full document, please register”替换了其它原文内容,那我们就有了一个思路,在任何情况下都不让它替换。 通过查找关键字符串,我们看到了在0042110B处发现有(DEMO)字符,一路跟进查看。 一路跟下来,试了无数次,终于在这里看到了希望: 0042139A |. 8BCC mov ecx,esp 0042139C |. 8965 C8 mov [local.14],esp 0042139F |. 68 6C594900 push WPasRec_.0049596C ; ASCII "Z!gjVy>#XelYjT" 004213A4 |. E8 41090400 call WPasRec_.00461CEA 004213A9 |. 51 push ecx 004213AA |. 8D45 EC lea eax,[local.5] “Z!gjVy>#XelYjT”便为文档的密码。 再接下来,找到了解密文档的call。 004213C6 |. E8 B553FEFF call WPasRec_.00406780;
对这个call进行跟进,来到:
用cmp函数对eax和esi进行了比较,即对文档的真实字符数与200进行比较大小。 那么我们直接跳过即可。把jle直接改为jmp,即可成功解密全文。 接下来梳理一下破解过程: 1、工具脱壳 2、破除启动密码设置 地址: 00429464 .85C0 test eax,eax 00429466 .75 53 jnz short WPasRec_.004294BB ;关键跳转。改为jmp 原始指令:75 53 JNZ 修改指令:EB 53 JMP 3、破除注册者限制 地址: 0041C4CF .3BC3 cmp eax,ebx 0041C4D1 .74 63 je short WPasRec_.0041C536 ;关键跳转,为改jnz 原始指令:74 63 je 修改指令:75 63 jnz 4、破除替换字符限制 地址: 004068B9 .3BC6 cmp eax,esi 004068BB .0F8E 36020000 jle WPasRec_.00406AF7 004068C1 .|8D55 C4 lea edx,dword ptr ss:[ebp-3C] 原始指令:0F8E 36020000 jle 修改指令:E9 37020000 jmp WPasRec_.00406AF7 90 nop
根据这个就自己写出patch工具了,这里不再上传了,因为在别人的电脑上不一定可以用。
原程序官网为:http://www.rixler.com/需要自己下载。
相信如下图的程序破解都大同小异了。。还可以做汉化处理哦。。呵呵。
|