- UID
- 20229
注册时间2006-8-10
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
【破文标题】【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论坛,转载请注明作者并保持文章的完整, 谢谢! |
|