-
-
[原创]WinPatrol 10.1 算法清晰……非常适合初学者
-
发表于:
2006-7-16 23:20
8550
-
[原创]WinPatrol 10.1 算法清晰……非常适合初学者
WinPatrol 10.1 算法清晰……非常适合初学者
【文章标题】: WinPatrol 10.1
【文章作者】: PeerLessSoul
【作者邮箱】: liuz@km169.net
【作者主页】: http://114989149.qzone.qq.com
【作者QQ号】: 114989149
【软件名称】: WinPatrol 10.1
【下载地址】: http://www.download.com/WinPatrol/3000-8022_4-10129149.html
【保护方式】: 用户名和注册码验证
【使用工具】: W32dsm8.93 OllyICE Peid
【作者声明】: 只是感兴趣,没有其他目的.请大家多多指教!
【软件简介】:
希望能给于初学者一些信心。
软件介绍www.downlaod.com 上4.5星评价的反广告间反谍软件。废话不多说开始!
【注册过程】
就按照看雪上面前辈们的经验一步一步来……
1.查壳
软件安装目录有两个主程序文件分别为WinPatrol.exe 和WinPatrolEx.exe 使用Peid 查看都是
Microsoft Visual C++ 7.0 [Debug] [Overlay]
2.运行软件(我这里运行WinPatrolEx,其实两个文件运行起来没有什么差别进如的画面都是一样的,以下都是使用这个文件进行分析。没什么原因……个人喜欢!)
看看里面的信息提示,进入Plus选项页面发现这里输入注册信息。
输入我的试验码Name:PeerLessSoul
Reg Code:1234567890123456
点击 Apply按钮出现错误提示“Oops...I'm sorry this is not a Valid Name/Registration Code……”
3.使用W32dsm8.93来搜索字符串,在开头一点就发现
String Resource ID=00620: "Oops...I'm sorry but this is not a valid Name / Registrat"
记录下地址0040F180好了,W32dsm工作到此就结束了!
4.进行具体找注册信息
使用OllyICE载入文件,跳到040F180.下断!启动程序……输入注册信息,点击apply程序断在这里
0040F170 |. 3BC8 cmp ecx, eax
0040F172 |. 74 3F je short 0040F1B3
0040F174 |. 68 00020000 push 200
0040F179 |. 8D85 7CFDFFFF lea eax, [ebp-284]
0040F17F |. 50 push eax
----------------------------------------------------------------------------------------------
0040F180 |. 68 6C020000 push 26C ;程序断在这里先F8走一下看
0040F185 |. E8 D6F20000 call 0041E460
0040F18A |. 33C0 xor eax, eax
0040F18C |. 66:A1 3C38430>mov ax, [43383C]
0040F192 |. 83C4 0C add esp, 0C
0040F195 |. 50 push eax ; /LanguageID
0040F196 |. 68 40000400 push 40040 ;
0040F19B |. 68 A0F34200 push 0042F3A0 ; |Title = "WinPatrol"
0040F1A0 |. 8D85 7CFDFFFF lea eax, [ebp-284] ; |
0040F1A6 |. 50 push eax ; |Text
0040F1A7 |. 53 push ebx ; |hOwner
0040F1A8 |. FF15 A4724200 call [<&USER32.MessageBoxExA>] ; \MessageBoxExA --到这里错误筐出现,后面是程序善后的过程……就不用看下去了……关键的思路在于他是在这个出错筐前面进行的注册验证。所以往上分析……(当然你要往下看我也不反对……)
------------------------------------------------------------------------------------------------
我们继续往中断的地方往上看看见个Je,他跳过了这个出错的对话筐……这个就是关键跳…如果要爆破可以把那个改成jne.头脑中这个时候更要有个思路……他的前面可定是有注册验证过程,经过了验证才能决定这个到底跳不跳!!!你会发现出现注册错误都是在je不实现!我们的目标就是让他实现跳转!继续往上……
------------------------------------------------------------------------------------------------
0040F11A |> \8B5D 08 mov ebx, [ebp+8] ; A 这里是程序段入口;
0040F11D |. 8B35 F0724200 mov esi, [<&USER32.Get>; 取字符串函数
0040F123 |. 6A 40 push 40 ;
0040F125 |. 68 C0EC4200 push 0042ECC0 ; |这里取我们的注册名
0040F12A |. BF 32040000 mov edi, 432 ; |
0040F12F |. 57 push edi ;
0040F130 |. 53 push ebx ; |hWnd
0040F131 |. FFD6 call esi ; \这也是取字符串函数
0040F133 |. 6A 20 push 20 ;
0040F135 |. 68 00ED4200 push 0042ED00 ; |取到了我们输入的假码
0040F13A |. 68 30040000 push 430 ;
0040F13F |. 53 push ebx ;
0040F140 |. 8945 08 mov [ebp+8], eax ;
0040F143 |. FFD6 call esi ; \GetDlgItemTextA--
0040F145 |. 8B4D 08 mov ecx, [ebp+8] ; (ecx=取注册名长度)
0040F148 |. 8D41 FF lea eax, [ecx-1] ; eax=ecx-1
0040F14B |. EB 0A jmp short 0040F157 ; 无条件跳转到下面的0040F157
0040F14D |> 80B8 C0EC4200 2>/cmp byte ptr [eax+42E>; 判断注册名最后一位是否为空格
0040F154 75 07 jnz short 0040F15D ; 从后取到一位非空字符的ASCii后跳出循环
0040F156 |. 48 |dec eax
0040F157 |> 85C0 test eax, eax ; 判断注册名长度是否为空
0040F159 |.^ 7F F2 \jg short 0040F14D ; 注册名为空跳转不实现,回跳到0040F14D
0040F15B |. EB 06 jmp short 0040F163
0040F15D |> 40 inc eax ; eax=eax+1
0040F15E |. 8945 08 mov [ebp+8], eax ; ebp+8=eax
0040F161 |. 8BC8 mov ecx, eax ; ecx=eax
0040F163 |> 80C1 40 add cl, 40 ; Cl=cl+40
0040F166 |. 0FB6C1 movzx eax, cl ; eax=cl
0040F169 |. 0FBE0D 01ED4200 movsx ecx, byte ptr [42E>; ecx=32
0040F170 |. 3BC8 cmp ecx, eax ; 比较ecx是否等于eax
0040F172 |. 74 3F je short 0040F1B3 ; 上面不等就跳死。
------------------------------------------------------------------------------------------------
我们可以在A处下断……把原来的断点先禁止掉!再一次运行程序……输入注册码~点apply发现断了下来……
这个时候停在A处,那么我就F8一步一步的先过一边……看看每个Call大概在搞什么……
通过上面的跟踪……我们要确定几个问题……
4.1.要实现最后一个Je的成功跳转!就能实现注册成功
4.2.实现Je的成功跳转来时ecx与eax的比较。
再来好好的看看ecx与eax的比较,看看ecx与eax的值从什么地方来!
------------------------------------------------------------------------------------------------
0040F14B |. EB 0A jmp short 0040F157 ; 无条件跳转到下面的0040F157
0040F14D |> 80B8 C0EC4200 2>/cmp byte ptr [eax+42E>; 判断注册名最后一位是否为空格
0040F154 75 07 jnz short 0040F15D ; 从后取到一位非空字符的ASCii后跳出循环
0040F156 |. 48 |dec eax
0040F157 |> 85C0 test eax, eax ; 判断注册名长度是否为空
0040F159 |.^ 7F F2 \jg short 0040F14D ; 注册名为空跳转不实现,回跳到0040F14D
0040F15B |. EB 06 jmp short 0040F163 :如果不回跳,程序跳出注册码验证,也就Over拉~
0040F15D |> 40 inc eax ; 从0040F154来的!!eax=eax+1 恢复注册名长度
0040F15E |. 8945 08 mov [ebp+8], eax ; ebp+8=eax
0040F161 |. 8BC8 mov ecx, eax ; ecx=eax
0040F163 |> 80C1 40 add cl, 40 ; Cl=cl+40
0040F166 |. 0FB6C1 movzx eax, cl ; eax=cl
0040F169 |. 0FBE0D 01ED4200 movsx ecx, byte ptr [42E>; ecx=32
0040F170 |. 3BC8 cmp ecx, eax ; 比较ecx是否等于eax
0040F172 |. 74 3F je short 0040F1B3 ; 上面不等就跳死。
清理一下思路……
这里我们要知道byte ptr [42E>的值是多少?还有eax的值是多少?从上面看出eax就是等于注册名长度加上40
最后得出的eax与byte ptr [42E>比较。这里我们输入的是PeerLessSoul 长度为12位,16进值为C再加上40那么最后eax=4C那么就好办了……现在清除所有断点……在
0040F170 |. 3BC8 cmp ecx, eax ; 比较ecx是否等于eax
下断……
更改注册名最后一位来迎合byte ptr [42E>的值,经过试验发现byte ptr [42E>值就是注册码第二位就
所以只要注册名长度+40等于注册码第二位的ASCII就能注册成功……
注册名PeerLessSoul 长度为c 再加上40等于4C(L)
注册码为ll
后话:byte ptr [42E>值应该是从上面字符串中取得的……有兴趣可以自己找找……总的感觉就是填写伪码,要记得伪码的一些资料,比如长度,ASCII码……这样能给你很大帮助……像这个程序,我花了不到两分钟就Over很大程度上在于清楚自己的试验码。第一次发破文,好多地方可能没讲清楚,请大家多多包涵……
注册机器我用VB写的,大体就是这个样子
C = Len(Text1.Text)
eax = C + 64
Label2.Caption = Chr(eax)
下面是注册机下载地址
http://km.liuz.googlepages.com/WinPatrol10.1.rar
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)