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