飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2631|回复: 1

【WAKU申请加入破文3】CoolCapture v1.25注册算法分析

[复制链接]

该用户从未签到

发表于 2006-8-25 16:22:45 | 显示全部楼层 |阅读模式
【破文标题】【WAKU申请加入破文3】CoolCapture v1.25注册算法分析
【破文作者】WAKU
【作者邮箱】[email protected]
【作者主页】
破解工具】PEID OD
【破解平台】XP SP2
【软件名称】CoolCapture v1.25
【软件大小】
【原版下载http://www.coolmp3tool.com/download/coolcapture.exe
【保护方式】无
【软件简介】一个非常好的截图软件,简洁高效,俺非常喜欢
------------------------------------------------------------------------
        PEID检测,无壳,VC6写的.
        OD载入,一运行弹出注册提示,随便输入一个,点OK,弹出错误提示Incorrect information.下断bp MessageBoxA,断下后ALT+F9返回程序领空,在这个位置:

004160F6   > \8B4F 20       mov     ecx, [edi+20]
004160F9   .  6A 10         push    10                               ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004160FB   .  68 B4414200   push    004241B4                         ; |Title = "Cool Capture"
00416100   .  68 3C4B4200   push    00424B3C                         ; |Text = "Incorrect information."
00416105   .  51            push    ecx                              ; |hOwner
00416106   .  FF15 78D74100 call    [<&USER32.MessageBoxA>]          ; \MessageBoxA

        看看004160F6是从哪跳过来的,原来是这里:
        
00415EA5   .  E8 E6B0FFFF   call    00410F90                         ;  关键CALL
00415EAA   .  84C0          test    al, al
00415EAC   .  0F84 44020000 je      004160F6

        又是CALL/TEST验证,在CALL处下断,重来一遍,断下后F7跟进:

00410F90   $  55            push    ebp
00410F91   .  8BEC          mov     ebp, esp
00410F93   .  6A FF         push    -1
00410F95   .  68 D8C14100   push    0041C1D8                         ;  SE 处理程序安装
00410F9A   .  64:A1 0000000>mov     eax, fs:[0]
00410FA0   .  50            push    eax
00410FA1   .  64:8925 00000>mov     fs:[0], esp
00410FA8   .  83EC 48       sub     esp, 48
00410FAB   .  53            push    ebx
00410FAC   .  56            push    esi
00410FAD   .  57            push    edi
00410FAE   .  8B7D 0C       mov     edi, [ebp+C]
00410FB1   .  8BD9          mov     ebx, ecx
00410FB3   .  8965 F0       mov     [ebp-10], esp
00410FB6   .  8B07          mov     eax, [edi]                       ;  注册码 > EAX
00410FB8   .  8378 F8 13    cmp     dword ptr [eax-8], 13            ;  长度要大于0x13
00410FBC   .  7D 15         jge     short 00410FD3
00410FBE   .  32C0          xor     al, al
00410FC0   .  8B4D F4       mov     ecx, [ebp-C]
00410FC3   .  64:890D 00000>mov     fs:[0], ecx
00410FCA   .  5F            pop     edi
00410FCB   .  5E            pop     esi
00410FCC   .  5B            pop     ebx
00410FCD   .  8BE5          mov     esp, ebp
00410FCF   .  5D            pop     ebp
00410FD0   .  C2 0800       retn    8
00410FD3   >  33F6          xor     esi, esi
00410FD5   .  8975 FC       mov     [ebp-4], esi
00410FD8   >  83FE 04       cmp     esi, 4                           ;  ESI从0到4
00410FDB   .  7D 1A         jge     short 00410FF7
00410FDD   .  8B0F          mov     ecx, [edi]
00410FDF   .  8A1431        mov     dl, [ecx+esi]                    ;  取注册码前4位
00410FE2   .  8BCB          mov     ecx, ebx
00410FE4   .  8855 EC       mov     [ebp-14], dl
00410FE7   .  8B45 EC       mov     eax, [ebp-14]
00410FEA   .  50            push    eax                              ;  EAX为注册码的ASCII值
00410FEB   .  E8 B0000000   call    <查表>                     
00410FF0   .  8944B5 AC     mov     [ebp+esi*4-54], eax                                 ;        查得的值放到该地址
00410FF4   .  46            inc     esi
00410FF5   .^ EB E1         jmp     short 00410FD8

        00410FEB的CALL必须要跟进后才能知道它是用来查表的,规则如下:
ASCII 值:        46        51        4E        50        57        54        36        38        43        30        44        4B        4A        37        59        31        34        5A        33        52        4C        55        49        53        41        45        39        56        35        32        58        47        48        42        4D        4F
对应的值:        23        22        21        20        1F        1E        1D        1C        1B        1A        19        18        17        16        15        14        13        12        11        10        0F        0E        0D        0C        0B        0A        09        08        07        06        05        04        03        02        01        00
        其中ASCII值就是PUSH EAX进来的注册码,对应的值从23到00,共36个,也就是26个字母加上10个数字.
        好,往下看:
        
00410FF7   >  83FE 08       cmp     esi, 8                           ;  ESI从4到8
00410FFA   . |7D 21         jge     short 0041101D
00410FFC   . |8B0F          mov     ecx, [edi]
00410FFE   . |8A5431 01     mov     dl, [ecx+esi+1]                  ;  取注册码5到8位
00411002   . |8BCB          mov     ecx, ebx
00411004   . |8855 EC       mov     [ebp-14], dl
00411007   . |8B45 EC       mov     eax, [ebp-14]
0041100A   . |50            push    eax
0041100B   . |E8 90000000   call    <查表>                                     ;  又查表
00411010   . |8944B5 AC     mov     [ebp+esi*4-54], eax
00411014   . |46            inc     esi
00411015   .^\EB E0         jmp     short 00410FF7

        大体跟上面一样,只不过查的是注册码5到8位.继续:

0041101D   > \83CE FF       or      esi, FFFFFFFF
00411020   .  8D4D 0C       lea     ecx, [ebp+C]
00411023   .  8975 FC       mov     [ebp-4], esi
00411026   .  E8 FF8E0000   call    <jmp.&MFC42.#540_CString::CStrin>
0041102B   .  8B55 08       mov     edx, [ebp+8]
0041102E   .  8D4D 0C       lea     ecx, [ebp+C]
00411031   .  51            push    ecx                              ; /Arg3
00411032   .  8D45 AC       lea     eax, [ebp-54]                    ; |
00411035   .  52            push    edx                              ; |Arg2
00411036   .  50            push    eax                              ; |Arg1
00411037   .  8BCB          mov     ecx, ebx                         ; |
00411039   .  C745 FC 02000>mov     dword ptr [ebp-4], 2             ; |
00411040   .  E8 0BFEFFFF   call    00410E50                         ; \CoolCapt.00410E50
00411045   .  84C0          test    al, al
00411047   .  75 20         jnz     short 00411069
00411049   .  8D4D 0C       lea     ecx, [ebp+C]
0041104C   .  8975 FC       mov     [ebp-4], esi
0041104F   .  E8 BE8E0000   call    <jmp.&MFC42.#800_CString::~CStri>
00411054   .  32C0          xor     al, al
00411056   .  8B4D F4       mov     ecx, [ebp-C]
00411059   .  64:890D 00000>mov     fs:[0], ecx
00411060   .  5F            pop     edi
00411061   .  5E            pop     esi
00411062   .  5B            pop     ebx
00411063   .  8BE5          mov     esp, ebp
00411065   .  5D            pop     ebp
00411066   .  C2 0800       retn    8
00411069   >  8B4D 0C       mov     ecx, [ebp+C]                     ;  出现注册码
0041106C   .  8B3F          mov     edi, [edi]
0041106E   .  51            push    ecx                              ; /s2
0041106F   .  57            push    edi                              ; |s1
00411070   .  FF15 A0D64100 call    [<&MSVCRT._mbscmp>]              ; \明码比较

        到00411069内存已经出现注册码,那就是在00411040的CALL产生的了,跟进:

00410E50  /$  55            push    ebp
00410E51  |.  8BEC          mov     ebp, esp
00410E53  |.  6A FF         push    -1
00410E55  |.  68 C0C14100   push    0041C1C0                         ;  SE 处理程序安装
00410E5A  |.  64:A1 0000000>mov     eax, fs:[0]
00410E60  |.  50            push    eax
00410E61  |.  64:8925 00000>mov     fs:[0], esp
00410E68  |.  83EC 08       sub     esp, 8
00410E6B  |.  8B55 0C       mov     edx, [ebp+C]
00410E6E  |.  53            push    ebx
00410E6F  |.  56            push    esi
00410E70  |.  57            push    edi
00410E71  |.  33C0          xor     eax, eax
00410E73  |.  8965 F0       mov     [ebp-10], esp
00410E76  |.  894D EC       mov     [ebp-14], ecx
00410E79  |.  8945 FC       mov     [ebp-4], eax
00410E7C  |.  33FF          xor     edi, edi
00410E7E  |>  8B0A          /mov     ecx, [edx]
00410E80  |.  3B41 F8       |cmp     eax, [ecx-8]
00410E83  |.  7D 09         |jge     short 00410E8E
00410E85  |.  0FBE0C01      |movsx   ecx, byte ptr [ecx+eax]         ;  用户名每一位到ECX
00410E89  |.  03F9          |add     edi, ecx
00410E8B  |.  40            |inc     eax
00410E8C  |.^ EB F0         \jmp     short 00410E7E

        上面的代码很简单,注册名的ASCII码和累加到EDI.

00410E8E  |> \8B75 08       mov     esi, [ebp+8]
00410E91  |.  B9 24000000   mov     ecx, 24                          ;  ECX = 0x24
00410E96  |.  8B46 1C       mov     eax, [esi+1C]                    ;  取注册码第8位查表后的值
00410E99  |.  8B16          mov     edx, [esi]                       ;  取注册码第1位查表后的值
00410E9B  |.  33C2          xor     eax, edx                         ;  异或
00410E9D  |.  03C7          add     eax, edi                         ;  加上用户名ASCII和
00410E9F  |.  99            cdq
00410EA0  |.  F7F9          idiv    ecx                              ;  除上ECX(0x24)
00410EA2  |.  B9 01000000   mov     ecx, 1
00410EA7  |.  8956 20       mov     [esi+20], edx                    ;  保存余数
00410EAA  |>  83F9 08       /cmp     ecx, 8                          ;  下面循环执行上面的步骤
00410EAD  |.  7D 1A         |jge     short 00410EC9
00410EAF  |.  8B448E FC     |mov     eax, [esi+ecx*4-4]
00410EB3  |.  8B1C8E        |mov     ebx, [esi+ecx*4]
00410EB6  |.  33C3          |xor     eax, ebx
00410EB8  |.  BB 24000000   |mov     ebx, 24
00410EBD  |.  03C7          |add     eax, edi
00410EBF  |.  99            |cdq
00410EC0  |.  F7FB          |idiv    ebx
00410EC2  |.  41            |inc     ecx
00410EC3  |.  89548E 1C     |mov     [esi+ecx*4+1C], edx
00410EC7  |.^ EB E1         \jmp     short 00410EAA

        现在我们需要理一下思路了:设用户名ASCII码和为s,注册码前8位为a1,a2...a8,经过查表后变换为b1,b2...b8.那么上面的运算就是
        c1 = (b8 xor b1 + s) mod 0x24
        c2 = (b1 xor b2 + s) mod 0x24
        c3 = (b2 xor b3 + s) mod 0x24
        ...
        c8 = (b7 xor b8 + s) mod 0x24
        得到了c1,c2...c8.

00410EC9  |> \33C9          xor     ecx, ecx
00410ECB  |>  83F9 08       /cmp     ecx, 8
00410ECE  |.  7D 11         |jge     short 00410EE1
00410ED0  |.  8B448E 20     |mov     eax, [esi+ecx*4+20]             ;  刚才求得的余数入EAX
00410ED4  |.  85C0          |test    eax, eax
00410ED6  |.  7D 06         |jge     short 00410EDE
00410ED8  |.  F7D8          |neg     eax
00410EDA  |.  89448E 20     |mov     [esi+ecx*4+20], eax             ;  有负数就取相反数
00410EDE  |>  41            |inc     ecx
00410EDF  |.^ EB EA         \jmp     short 00410ECB

        上面的代码应该没有用,因为求得的余数不能有负的.

00410EE1  |> \8B5D 10       mov     ebx, [ebp+10]
00410EE4  |.  68 844D4200   push    00424D84
00410EE9  |.  8BCB          mov     ecx, ebx
00410EEB  |.  E8 2E900000   call    <jmp.&MFC42.#860_CString::operator=>
00410EF0  |.  33FF          xor     edi, edi
00410EF2  |>  83FF 08       /cmp     edi, 8
00410EF5  |.  7D 17         |jge     short 00410F0E
00410EF7  |.  8B14BE        |mov     edx, [esi+edi*4]                         ;  取b1...b8
00410EFA  |.  8B4D EC       |mov     ecx, [ebp-14]
00410EFD  |.  52            |push    edx
00410EFE  |.  E8 ED010000   |call    <又是查表>
00410F03  |.  50            |push    eax
00410F04  |.  8BCB          |mov     ecx, ebx
00410F06  |.  E8 9B920000   |call    <jmp.&MFC42.#940_CString::operator+=>
00410F0B  |.  47            |inc     edi
00410F0C  |.^ EB E4         \jmp     short 00410EF2
00410F0E  |>  33FF          xor     edi, edi
00410F10  |>  83FF 08       /cmp     edi, 8
00410F13  |.  7D 18         |jge     short 00410F2D
00410F15  |.  8B44BE 20     |mov     eax, [esi+edi*4+20]                      ;  取c1...c8
00410F19  |.  8B4D EC       |mov     ecx, [ebp-14]
00410F1C  |.  50            |push    eax
00410F1D  |.  E8 CE010000   |call    <又是查表>
00410F22  |.  50            |push    eax
00410F23  |.  8BCB          |mov     ecx, ebx
00410F25  |.  E8 7C920000   |call    <jmp.&MFC42.#940_CString::operator+=>
00410F2A  |.  47            |inc     edi
00410F2B  |.^ EB E3         \jmp     short 00410F10
00410F2D  |>  68 AC484200   push    004248AC
00410F32  |.  6A 04         push    4
00410F34  |.  8BCB          mov     ecx, ebx
00410F36  |.  E8 F3940000   call    <jmp.&MFC42.#6779_CString::Insert>        ;  在第4位插入-
00410F3B  |.  68 AC484200   push    004248AC
00410F40  |.  6A 09         push    9
00410F42  |.  8BCB          mov     ecx, ebx
00410F44  |.  E8 E5940000   call    <jmp.&MFC42.#6779_CString::Insert>        ;  在第9位插入-
00410F49  |.  68 AC484200   push    004248AC
00410F4E  |.  6A 0E         push    0E
00410F50  |.  8BCB          mov     ecx, ebx
00410F52  |.  E8 D7940000   call    <jmp.&MFC42.#6779_CString::Insert>        ;  在0xE位插入-
00410F57  |.  B0 01         mov     al, 1
00410F59  |.  8B4D F4       mov     ecx, [ebp-C]
00410F5C  |.  64:890D 00000>mov     fs:[0], ecx
00410F63  |.  5F            pop     edi
00410F64  |.  5E            pop     esi
00410F65  |.  5B            pop     ebx
00410F66  |.  8BE5          mov     esp, ebp
00410F68  |.  5D            pop     ebp
00410F69  \.  C2 0C00       retn    0C

        上面还有一个查表的CALL,跟进后代码如下:
        
004110F0 >/$  8B4424 04     mov     eax, [esp+4]
004110F4  |.  85C0          test    eax, eax
004110F6  |.  7C 0F         jl      short 00411107
004110F8  |.  83F8 24       cmp     eax, 24
004110FB  |.  7D 0A         jge     short 00411107
004110FD  |.  0FBE80 34E841>movsx   eax, byte ptr [eax+41E834]
00411104  |.  C2 0400       retn    4
        
        看41E834位置的数据,为OMBHGX25V9EASIULR3Z41Y7JKD0C86TWPNQF字符串,长度正好为0x24.这样我们就知道该查表的规则为取EAX处的字符.事实上b1...b8经过此处查表就还原为注册码的前8位,也就是a1...a8.而c1...c8经过变换后为d1...d8.
        最后分别在4,9,0xE处插入-分隔符,形成注册码:a1a2a3a4-a5a6a7a8-d1d2d3d4-d5d6d7d8.可见一个用户名对应无数个注册码,主要是确定注册码的前8位.以下是符合条件的一种:
        Name:WAKU
        SN:WAKU-WAKU-XV5E-XV5E
        
        
        完.






        




------------------------------------------------------------------------

------------------------------------------------------------------------
【版权声明】本文原创于PYG论坛,转载请注明作者并保持文章的完整, 谢谢!
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-10-14 09:05
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2006-8-26 20:56:43 | 显示全部楼层
    谢谢,学习了!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表