本帖最后由 GeekCat 于 2016-1-20 21:04 编辑
【文章标题】: Cool Capture v1.25 算法分析 【软件大小】: 1.19 MB (1,252,703 字节)
【加壳方式】: 无壳 【保护方式】: 注册码
【编写语言】: Microsoft Visual C++ 6.0 【使用工具】: OD、PEID
【操作平台】: XP SP3 【破解声明】: 破解在于交流思路和过程,结果并不重要,请不要用于非法用途;
【软件介绍】: Cool Capture是一款一站式的屏幕截图软件。用户可以包括全屏幕截图,区域截图,窗口截图,卷轴截图等多种方式来截取画面,该软件支持剪贴板,打印机,编辑软件等多种方式的输出。 --------------------------------------------------------------------------------------------------------------------------------
程序内置一张表:OMBHGX25V9EASIULR3Z41Y7JKD0C86TWPNQF
0、OD调试程时序的注册窗口不能最小化和移动,遮挡住OD部分界面调试起来有点蛋疼;
1、字符串、万能断点、F12、API快速切入关键点;
2、关键点代码如下:
- 00415E7F . 8D8C24 A00000>lea ecx,dword ptr ss:[esp+0xA0]
- 00415E86 . E8 B5ADFFFF call CoolCapt.00410C40 ; 不是关键的关键点 [ecx+0xC]=0x11赋值的常量后面运算时要用到
- 00415E8B . 8D77 64 lea esi,dword ptr ds:[edi+0x64] ; (ASCII "1234567890qwertYUIOP")
- 00415E8E . 8D6F 60 lea ebp,dword ptr ds:[edi+0x60] ; (ASCII "GeekCat")
- 00415E91 . 56 push esi
- 00415E92 . 55 push ebp
- 00415E93 . 8D8C24 A80000>lea ecx,dword ptr ss:[esp+0xA8]
- 00415E9A . C78424 D40100>mov dword ptr ss:[esp+0x1D4],0x0
- 00415EA5 . E8 E6B0FFFF call CoolCapt.00410F90 ; 算法CALL
- 00415EAA . 84C0 test al,al
- 00415EAC . 0F84 44020000 je CoolCapt.004160F6 ; 关键跳转 不能跳转
- 00415EB2 . 8D8424 C00000>lea eax,dword ptr ss:[esp+0xC0]
复制代码
3、F7进算法CALL 代码如下:
- 00410FB8 . 8378 F8 13 cmp dword ptr ds:[eax-0x8],0x13 ; 注册码要大于等于0x13-->19位
- 00410FBC . 7D 15 jge short CoolCapt.00410FD3
- ————————————————————————略代码N行——————————————————————————————————
- 00410FDD . 8B0F mov ecx,dword ptr ds:[edi] ; (ASCII "1234567890qwertYUIOP")
- 00410FDF . 8A1431 mov dl,byte ptr ds:[ecx+esi] ; 取注册码每1位,取前四位
- 00410FE2 . 8BCB mov ecx,ebx
- 00410FE4 . 8855 EC mov byte ptr ss:[ebp-0x14],dl
- 00410FE7 . 8B45 EC mov eax,dword ptr ss:[ebp-0x14]
- 00410FEA . 50 push eax
- 00410FEB . E8 B0000000 call CoolCapt.004110A0 ; 计算CLL -1 查表找到表中的位置 14、6、11、13
- 00410FF0 . 8944B5 AC mov dword ptr ss:[ebp+esi*4-0x54],eax
- ————————————————————————略代码N行——————————————————————————————————
- 00410FFC . 8B0F mov ecx,dword ptr ds:[edi] ; (ASCII "1234567890qwertYUIOP")
- 00410FFE . 8A5431 01 mov dl,byte ptr ds:[ecx+esi+0x1] ; 从第6~9位开始取每次取1位,循环4次
- 00411002 . 8BCB mov ecx,ebx
- 00411004 . 8855 EC mov byte ptr ss:[ebp-0x14],dl
- 00411007 . 8B45 EC mov eax,dword ptr ss:[ebp-0x14]
- 0041100A . 50 push eax
- 0041100B . E8 90000000 call CoolCapt.004110A0 ; 计算CLL -2 查表找到表中的位置 1D、16、1C、9
- 00411010 . 8944B5 AC mov dword ptr ss:[ebp+esi*4-0x54],eax
- ————————————————————————略代码N行——————————————————————————————————
- 00411037 . 8BCB mov ecx,ebx
- 00411039 . C745 FC 02000>mov dword ptr ss:[ebp-0x4],0x2
- 00411040 . E8 0BFEFFFF call CoolCapt.00410E50 ; 计算CLL -3 计算注册码后两段(共8位)
- 00411045 . 84C0 test al,al
- ————————————————————————略代码N行——————————————————————————————————
- 00411069 > \8B4D 0C mov ecx,dword ptr ss:[ebp+0xC] ; (ASCII "1234-6789-XTFU-0J7N") 真码
- 0041106C . 8B3F mov edi,dword ptr ds:[edi] ; (ASCII "1234567890qwertYUIOP") 假码
- 0041106E . 51 push ecx ; /s2
- 0041106F . 57 push edi ; |s1
- 00411070 . FF15 A0D64100 call dword ptr ds:[<&MSVCRT._mbscmp>] ; \对比CALL
- 00411076 . 83C4 08 add esp,0x8
复制代码
4、F7进计算CLL -3 代码如下:
- 00410E50 /$ 55 push ebp
- ————————————————————————略代码N行——————————————————————————————————
- 00410E79 |. 8945 FC mov dword ptr ss:[ebp-0x4],eax
- 00410E7C |. 33FF xor edi,edi ; 这个循环注册名AS值累加
- 00410E7E |> 8B0A /mov ecx,dword ptr ds:[edx] ; (ASCII "GeekCat")
- 00410E80 |. 3B41 F8 |cmp eax,dword ptr ds:[ecx-0x8]
- 00410E83 |. 7D 09 |jge short CoolCapt.00410E8E
- 00410E85 |. 0FBE0C01 |movsx ecx,byte ptr ds:[ecx+eax] ; 取注册名的每1位
- 00410E89 |. 03F9 |add edi,ecx ; 注册名各字符串AS值累加和 294
- 00410E8B |. 40 |inc eax
- 00410E8C |.^ EB F0 \jmp short CoolCapt.00410E7E
- 00410E8E |> 8B75 08 mov esi,dword ptr ss:[ebp+0x8] ; 前面查表的第1个值 14
- 00410E91 |. B9 24000000 mov ecx,0x24
- 00410E96 |. 8B46 1C mov eax,dword ptr ds:[esi+0x1C] ; 前面查表的第8个值(最生1个) 9
- 00410E99 |. 8B16 mov edx,dword ptr ds:[esi] ; 14
- 00410E9B |. 33C2 xor eax,edx ; 14 xor 9 = 1D
- 00410E9D |. 03C7 add eax,edi ; 1D+294=2B1
- 00410E9F |. 99 cdq
- 00410EA0 |. F7F9 idiv ecx ; 2B1 mod 24 =5
- 00410EA2 |. B9 01000000 mov ecx,0x1
- 00410EA7 |. 8956 20 mov dword ptr ds:[esi+0x20],edx ; 5
- 00410EAA |> 83F9 08 /cmp ecx,0x8
- 00410EAD |. 7D 1A |jge short CoolCapt.00410EC9 ; 这个循环是查表的值依次xor运算
- 00410EAF |. 8B448E FC |mov eax,dword ptr ds:[esi+ecx*4-0x4] ; 查表的值第1、2、3、4、5、6、7
- 00410EB3 |. 8B1C8E |mov ebx,dword ptr ds:[esi+ecx*4] ; 查表的值第2、3、4、5、6、7、8
- 00410EB6 |. 33C3 |xor eax,ebx ; 14 xor 6 =12
- 00410EB8 |. BB 24000000 |mov ebx,0x24
- 00410EBD |. 03C7 |add eax,edi ; 12 + 294 = 2A6
- 00410EBF |. 99 |cdq
- 00410EC0 |. F7FB |idiv ebx ; 2A6 mod 24 =1E
- 00410EC2 |. 41 |inc ecx
- 00410EC3 |. 89548E 1C |mov dword ptr ds:[esi+ecx*4+0x1C],edx
- 00410EC7 |.^ EB E1 \jmp short CoolCapt.00410EAA
- ——————————略代码N行(两个循环:一个无用一个反查注册名前8位)—————————
- 00410F10 |> /83FF 08 /cmp edi,0x8
- 00410F13 |. |7D 18 |jge short CoolCapt.00410F2D
- 00410F15 |. |8B44BE 20 |mov eax,dword ptr ds:[esi+edi*4+0x20]
- 00410F19 |. |8B4D EC |mov ecx,dword ptr ss:[ebp-0x14]
- 00410F1C |. |50 |push eax
- 00410F1D |. |E8 CE010000 |call CoolCapt.004110F0 ; 00410EA0(1个值)、00410EC0(7个值)两处xor计算的结果为位置来查表得到注册码9~12及14~17位
- 00410F22 |. |50 |push eax
- 00410F23 |. |8BCB |mov ecx,ebx
- 00410F25 |. |E8 7C920000 |call <jmp.&MFC42.#940>
- 00410F2A |. |47 |inc edi
- 00410F2B |.^\EB E3 \jmp short CoolCapt.00410F10
- 00410F2D |> 68 AC484200 push CoolCapt.004248AC ; -
- 00410F32 |. 6A 04 push 0x4
- 00410F34 |. 8BCB mov ecx,ebx
- 00410F36 |. E8 F3940000 call <jmp.&MFC42.#6779> ; 第5位为‘-’
- 00410F3B |. 68 AC484200 push CoolCapt.004248AC ; -
- 00410F40 |. 6A 09 push 0x9
- 00410F42 |. 8BCB mov ecx,ebx
- 00410F44 |. E8 E5940000 call <jmp.&MFC42.#6779> ; 第10位为‘-’
- 00410F49 |. 68 AC484200 push CoolCapt.004248AC ; -
- 00410F4E |. 6A 0E push 0xE
- 00410F50 |. 8BCB mov ecx,ebx
- 00410F52 |. E8 D7940000 call <jmp.&MFC42.#6779> ; 第15位为‘-’
复制代码--------------------------------------------------------------------------------------------------------------------------- 算法总结:
1、注册码要大于等于0x13-->19位;
2、注册码两段(前8位):数字和大写字母组成;
3、注册码格式:XXXX-XXXX-XXXX-XXXX ;
4、用注册码的前8位通过查表一得到8个数,并把查表得到的第1个和最后1个xor运算结果,设为A;
5、A加上注册名各字符AS值累加值,最后的和跟0x24 mod运算 结果设为B;
6、00410EA0(1个值)、00410EC0(7个值)两处xor计算的结果来查表得到注册码9~12及14~17位 一组可用的注册信息:
注册名:GeekCat
注册码:PYGG-PYGC-F66S-S665(必须带PYG标记) --------------------------------------------------------------------------------------------------------------------------- 【版权声明】: 本文原创于GeekCat/P.Y.G,转载请注明作者及论坛并保存文章的完整! 来自群组: 我们都爱月姐姐 |