首页
社区
课程
招聘
超级通讯王算法分析
发表于: 2004-6-26 09:31 4853

超级通讯王算法分析

2004-6-26 09:31
4853

【破解作者】 WXHing[BCG]
【作者邮箱】 [email]WXHing@163.com[/email]
【使用工具】 OllyDbg1.09,
【破解平台】 Win9x/NT/2000/XP
【软件名称】 超级通讯王
【下载地址】 google搜索吧,我是从‘网友世界’附赠的光盘里获得的
【软件简介】 超级通讯王是为中国人精心设计的个人信息管理(PIM)软件。包括通讯录、网上即时聊天、手机短信、信息速查等功能。您可以用它来管理通讯录、网上点对点聊天、发送手机短信(正在制作)、以及自定义丰富的日常信息库。支持任意多文件同时管理,自由分组,全方位支持鼠标拖放。拥有超级通讯王,会极大加强您与他人的沟通能力。
【软件大小】 3.03Mb
【保护方式】 序列号保护,30次试用
【破解声明】 初学破解,纯属技术交流,别无他意!
--------------------------------------------------------------------------------
【破解内容】这是我第二次写这个软件的破文,不知这个软件都升过几极了,软件作者该不会怪我了吧,由于上次没有找出算法,故而搁浅了,
laoqian[FCG]大侠建议我还是写一下算法,呵呵.........有点乱,见笑!

ollydbg载入主程序SuperPIM.exe
00452044 S> $  6A 60              push 60                  ;停在这里,F9运行
00452046    .  68 D83D4B00        push SuperPIM.004B3DD8
0045204B    .  E8 04160000        call SuperPIM.00453654
00452050    .  BF 94000000        mov edi, 94
00452055    .  8BC7               mov eax, edi
00452057    .  E8 14FAFFFF        call SuperPIM.00451A70
0045205C    .  8965 E8            mov dword ptr ss:[ebp-18], esp

出现一些错误提示,确定之,直到程序运行起来,如果没过期会提示你还可以使用几次,如果过期会直接要求你注册,确定之。
选择帮助-注册会出现注册对话框程序会在安装时自动生成一个序列号,我机子上的序列号为‘V1L2T26FBL01VNJ’,
我输入试练码‘987654321’,注册。会提示你注册码错误,不要关闭该对话框。在ollydbg中按ALT+M,搜索‘987654321',有两处,
第二处下内存访问断点,然后关闭对话框,再次确定之,拦下。

77DF70A9     8027 00              and byte ptr ds:[edi], 0              ; 中断在此
77DF70AC     8B4D 08              mov ecx, dword ptr ss:[ebp+8]
77DF70AF     E8 1CBFFFFF          call USER32.77DF2FD0
77DF70B4     8BF0                 mov esi, eax
77DF70B6     8975 E4              mov dword ptr ss:[ebp-1C], esi
77DF70B9     85F6                 test esi, esi
77DF70BB     0F84 84AA0200        je USER32.77E21B45
77DF70C1     56                   push esi
77DF70C2     E8 B5D1FFFF          call USER32.77DF427C
77DF70C7     85C0                 test eax, eax

一路按F8.........

0040FB08    .  50                 push eax
0040FB09    .  E8 483B0200        call SuperPIM.00433656                ;  经过这里,看堆栈中出现 一大串字符,一定有问题,从新运行F7跟进
0040FB0E    .  59                 pop ecx
0040FB0F    .  8D77 74            lea esi, dword ptr ds:[edi+74]
0040FB12    .  8B06               mov eax, dword ptr ds:[esi]
0040FB14    .  33DB               xor ebx, ebx
0040FB16    .  3958 F4            cmp dword ptr ds:[eax-C], ebx
0040FB19    .  895D FC            mov dword ptr ss:[ebp-4], ebx
0040FB1C    .  74 6D              je short SuperPIM.0040FB8B

进入后来到这里
00433669   |.  50                 push eax
0043366A   |.  E8 FEFEFFFF        call SuperPIM.0043356D           ;获取序列号
0043366F   |.  8365 FC 00         and dword ptr ss:[ebp-4], 0
00433673   |.  6A 14              push 14
00433675   |.  8D45 EC            lea eax, dword ptr ss:[ebp-14]     ;eax指向序列号
00433678   |.  50                 push eax
00433679   |.  8D45 F0            lea eax, dword ptr ss:[ebp-10]
0043367C   |.  50                 push eax
0043367D   |.  E8 0791FFFF        call SuperPIM.0042C789             ;F7跟进
00433682   |.  6A 28              push 28
00433684   |.  8D45 F0            lea eax, dword ptr ss:[ebp-10]
00433687   |.  50                 push eax
00433688   |.  FF75 08            push dword ptr ss:[ebp+8]
0043368B   |.  C645 FC 01         mov byte ptr ss:[ebp-4], 1
0043368F   |.  E8 F590FFFF        call SuperPIM.0042C789               
00433694   |.  8B4D F0            mov ecx, dword ptr ss:[ebp-10]        ;  ecx指向
00433697   |.  83C4 1C            add esp, 1C
0043369A   |.  83C1 F0            add ecx, -10
0043369D   |.  E8 56E5FCFF        call SuperPIM.00401BF8
004336A2   |.  8B4D EC            mov ecx, dword ptr ss:[ebp-14]
004336A5   |.  83C1 F0            add ecx, -10
004336A8   |.  E8 4BE5FCFF        call SuperPIM.00401BF8
004336AD   |.  8B4D F4            mov ecx, dword ptr ss:[ebp-C]
004336B0   |.  8B45 08            mov eax, dword ptr ss:[ebp+8]
004336B3   |.  64:890D 00000000   mov dword ptr fs:[0], ecx
004336BA   |.  C9                 leave
004336BB   \.  C3                 retn
004336BC    .  B8 25764900        mov eax, SuperPIM.00497625

来到这里

0042C789   /$  B8 A16C4900        mov eax, SuperPIM.00496CA1
0042C78E   |.  E8 55330200        call SuperPIM.0044FAE8
0042C793   |.  83EC 14            sub esp, 14
0042C796   |.  53                 push ebx
0042C797   |.  56                 push esi
0042C798   |.  33DB               xor ebx, ebx                    ;ebx=0
0042C79A   |.  57                 push edi
0042C79B   |.  895D E0            mov dword ptr ss:[ebp-20], ebx
0042C79E   |.  E8 02640300        call SuperPIM.00462BA5
0042C7A3   |.  8B10               mov edx, dword ptr ds:[eax]
0042C7A5   |.  8BC8               mov ecx, eax
0042C7A7   |.  FF52 0C            call dword ptr ds:[edx+C]
0042C7AA   |.  8D78 10            lea edi, dword ptr ds:[eax+10]
0042C7AD   |.  897D F0            mov dword ptr ss:[ebp-10], edi
0042C7B0   |.  8B45 0C            mov eax, dword ptr ss:[ebp+C]
0042C7B3   |.  8B00               mov eax, dword ptr ds:[eax]            ;eax指向序列号
0042C7B5   |.  8B70 F4            mov esi, dword ptr ds:[eax-C]           ;esi为序列号位数
0042C7B8   |.  3BF3               cmp esi, ebx
0042C7BA   |.  895D FC            mov dword ptr ss:[ebp-4], ebx
0042C7BD   |.  8975 E0            mov dword ptr ss:[ebp-20], esi
0042C7C0   |.  0F84 AD000000      je SuperPIM.0042C873
0042C7C6   |.  8B45 10            mov eax, dword ptr ss:[ebp+10]
0042C7C9   |.  3BC6               cmp eax, esi
0042C7CB   |.  8945 E8            mov dword ptr ss:[ebp-18], eax
0042C7CE   |.  7F 03              jg short SuperPIM.0042C7D3
0042C7D0   |.  8975 E8            mov dword ptr ss:[ebp-18], esi
0042C7D3   |>  395D E8            cmp dword ptr ss:[ebp-18], ebx
0042C7D6   |.  0F8E 97000000      jle SuperPIM.0042C873
0042C7DC   |>  8BC3               /mov eax, ebx                        ;eax=0
0042C7DE   |.  99                 |cdq
0042C7DF   |.  F7FE               |idiv esi
0042C7E1   |.  8B45 0C            |mov eax, dword ptr ss:[ebp+C]      
0042C7E4   |.  8B00               |mov eax, dword ptr ds:[eax]
0042C7E6   |.  53                 |push ebx
0042C7E7   |.  8A0402             |mov al, byte ptr ds:[edx+eax]         ;获取一串字符虚序列号
0042C7EA   |.  8845 E4            |mov byte ptr ss:[ebp-1C], al
0042C7ED   |.  FF75 E4            |push dword ptr ss:[ebp-1C]
0042C7F0   |.  E8 5AFEFFFF        |call SuperPIM.0042C64F                                ;F7跟进
0042C7F5   |.  59                 |pop ecx
0042C7F6   |.  59                 |pop ecx                                   
0042C7F7   |.  6A 2B              |push 2B                        
0042C7F9   |.  33D2               |xor edx, edx                                      
0042C7FB   |.  59                 |pop ecx                                              ;ecx=2b
0042C7FC   |.  F7F1               |div ecx                                              ;eax=eax/2b,edx存其余数
0042C7FE   |.  8BCA               |mov ecx, edx                                          ;ecx=edx
0042C800   |.  80C1 30            |add cl, 30                                            ;ecx=ecx+30
0042C803   |.  80F9 39            |cmp cl, 39                                             ; ecx>39 吗
0042C806   |.  884D EC            |mov byte ptr ss:[ebp-14], cl
0042C809   |.  7E 0B              |jle short SuperPIM.0042C816                          ;小于则跳转
0042C80B   |.  80F9 41            |cmp cl, 41                                           ;ecx<41吗
0042C80E   |.  7D 06              |jge short SuperPIM.0042C816                          ;大于则跳转
0042C810   |.  80C1 F6            |add cl, 0F6                                           ;ecx=ecx+0xF6
0042C813   |.  884D EC            |mov byte ptr ss:[ebp-14], cl
0042C816   |>  3B5D 10            |cmp ebx, dword ptr ss:[ebp+10]
0042C819   |.  7D 0D              |jge short SuperPIM.0042C828
0042C81B   |.  FF75 EC            |push dword ptr ss:[ebp-14]
0042C81E   |.  8D4D F0            |lea ecx, dword ptr ss:[ebp-10]                         ;ecx指向上面计算出来的16进制数
0042C821   |.  E8 CCB1FEFF        |call SuperPIM.004179F2                          ; 这个call是将计算后的ecx的16进制数转换为字符形式,然后累送到eax中返回
0042C826   |.  EB 3E              |jmp short SuperPIM.0042C866
0042C828   |>  8BC3               |mov eax, ebx
0042C82A   |.  99                 |cdq
0042C82B   |.  F77D 10            |idiv dword ptr ss:[ebp+10]
0042C82E   |.  0FBEC9             |movsx ecx, cl
0042C831   |.  6A 2B              |push 2B
0042C833   |.  8BF2               |mov esi, edx
0042C835   |.  0FBE043E           |movsx eax, byte ptr ds:[esi+edi]
0042C839   |.  8D4408 A0          |lea eax, dword ptr ds:[eax+ecx-60]
0042C83D   |.  99                 |cdq
0042C83E   |.  59                 |pop ecx
0042C83F   |.  F7F9               |idiv ecx
0042C841   |.  80C2 30            |add dl, 30
0042C844   |.  80FA 39            |cmp dl, 39
0042C847   |.  8855 EC            |mov byte ptr ss:[ebp-14], dl
0042C84A   |.  7E 0B              |jle short SuperPIM.0042C857
0042C84C   |.  80FA 41            |cmp dl, 41
0042C84F   |.  7D 06              |jge short SuperPIM.0042C857
0042C851   |.  80C2 F6            |add dl, 0F6
0042C854   |.  8855 EC            |mov byte ptr ss:[ebp-14], dl
0042C857   |>  FF75 EC            |push dword ptr ss:[ebp-14]
0042C85A   |.  8D4D F0            |lea ecx, dword ptr ss:[ebp-10]
0042C85D   |.  56                 |push esi
0042C85E   |.  E8 A9FEFFFF        |call SuperPIM.0042C70C
0042C863   |.  8B75 E0            |mov esi, dword ptr ss:[ebp-20]
0042C866   |>  8B7D F0            |mov edi, dword ptr ss:[ebp-10]
0042C869   |.  43                 |inc ebx                                                             ;ebx为计数器
0042C86A   |.  3B5D E8            |cmp ebx, dword ptr ss:[ebp-18]                                      ;字符串处理完了吗
0042C86D   |.^ 0F8C 69FFFFFF      \jl SuperPIM.0042C7DC                                                 ;没有,继续处理   
0042C873   |>  8B4D 08            mov ecx, dword ptr ss:[ebp+8]                                        ;这里设断
0042C876   |.  8D45 F0            lea eax, dword ptr ss:[ebp-10]
0042C879   |.  50                 push eax
0042C87A   |.  E8 5C57FDFF        call SuperPIM.00401FDB
0042C87F   |.  8D4F F0            lea ecx, dword ptr ds:[edi-10]
0042C882   |.  E8 7153FDFF        call SuperPIM.00401BF8
0042C887   |.  8B4D F4            mov ecx, dword ptr ss:[ebp-C]
0042C88A   |.  8B45 08            mov eax, dword ptr ss:[ebp+8]
0042C88D   |.  5F                 pop edi
0042C88E   |.  5E                 pop esi
0042C88F   |.  5B                 pop ebx
0042C890   |.  64:890D 00000000   mov dword ptr fs:[0], ecx
0042C897   |.  C9                 leave
0042C898   \.  C3                 retn

跟进0042C7F0 处的call来到这里

0042C64F   /$  55                 push ebp
0042C650   |.  8BEC               mov ebp, esp
0042C652   |.  51                 push ecx
0042C653   |.  0FB645 08          movzx eax, byte ptr ss:[ebp+8]                                                  ;eax指向序列号
0042C657   |.  8B4D 0C            mov ecx, dword ptr ss:[ebp+C]
0042C65A   |.  8945 FC            mov dword ptr ss:[ebp-4], eax
0042C65D   |.  8BC1               mov eax, ecx                                                                    ;eax=ecx
0042C65F   |.  0FAFC1             imul eax, ecx                                                                    ;eax=eax*ecx
0042C662   |.  8D4440 07          lea eax, dword ptr ds:[eax+eax*2+7]                                             ; eax=eax+eax*2+7
0042C666   |.  0FAFC1             imul eax, ecx                                                                   ;eax=eax*ecx
0042C669   |.  83C0 0D            add eax, 0D                                                                       ;eax=eax+0xD
0042C66C   |.  0FAFC1             imul eax, ecx                                                                      ;eax=eax*ecx
0042C66F   |.  56                 push esi
0042C670   |.  8D71 05            lea esi, dword ptr ds:[ecx+5]
0042C673   |.  56                 push esi
0042C674   |.  8945 08            mov dword ptr ss:[ebp+8], eax
0042C677   |.  8D45 08            lea eax, dword ptr ss:[ebp+8]
0042C67A   |.  6A 04              push 4
0042C67C   |.  50                 push eax
0042C67D   |.  E8 6DFFFFFF        call SuperPIM.0042C5EF                                                            ;跟进      
0042C682   |.  56                 push esi
0042C683   |.  8D45 FC            lea eax, dword ptr ss:[ebp-4]
0042C686   |.  6A 04              push 4
0042C688   |.  50                 push eax
0042C689   |.  E8 91FFFFFF        call SuperPIM.0042C61F                                                               ;跟进
0042C68E   |.  8B45 08            mov eax, dword ptr ss:[ebp+8]                                    ;[ebp+8]存的是 0042C689处call的计算结果
0042C691   |.  83C4 18            add esp, 18
0042C694   |.  3345 FC            xor eax, dword ptr ss:[ebp-4]                                  ;[ebp-4]存的是0042C612处call的计算结果,两数异或存入eax返回
0042C697   |.  5E                 pop esi
0042C698   |.  C9                 leave
0042C699   \.  C3                 retn
进入0042C67D处的call来到这里
0042C5EF   /$  8B4424 0C          mov eax, dword ptr ss:[esp+C]
0042C5F3   |.  56                 push esi
0042C5F4   |.  8B7424 0C          mov esi, dword ptr ss:[esp+C]
0042C5F8   |.  8BCE               mov ecx, esi
0042C5FA   |.  C1E1 03            shl ecx, 3
0042C5FD   |.  3BC1               cmp eax, ecx
0042C5FF   |.  7C 05              jl short SuperPIM.0042C606
0042C601   |.  99                 cdq
0042C602   |.  F7F9               idiv ecx
0042C604   |.  8BC2               mov eax, edx
0042C606   |>  85C0               test eax, eax
0042C608   |.  74 13              je short SuperPIM.0042C61D
0042C60A   |.  57                 push edi
0042C60B   |.  8BF8               mov edi, eax
0042C60D   |>  56                 /push esi
0042C60E   |.  FF7424 10          |push dword ptr ss:[esp+10]
0042C612   |.  E8 5FFFFFFF        |call SuperPIM.0042C576                     ;跟进
0042C617   |.  4F                 |dec edi                                    ;edi为计数器
0042C618   |.  59                 |pop ecx
0042C619   |.  59                 |pop ecx
0042C61A   |.^ 75 F1              \jnz short SuperPIM.0042C60D                 ;整个过程是eax=eax*2的[ecx+5]次方,ecx为大循环计数器
0042C61C   |.  5F                 pop edi
0042C61D   |>  5E                 pop esi
0042C61E   \.  C3                 retn
。。。。。。。进入42c612处call来到这里
0042C594   |> /8A08               /mov cl, byte ptr ds:[eax]                                       ; cl=[eax]是42c66c计算出来的
0042C596   |. |33DB               |xor ebx, ebx                                                    ;ebx=0
0042C598   |. |8AD9               |mov bl, cl                                                      ;bl=cl
0042C59A   |. |D0E1               |shl cl, 1                                                          ;cl=cl*2
0042C59C   |. |8808               |mov byte ptr ds:[eax], cl
0042C59E   |. |23DA               |and ebx, edx                                                     ;ebx=ebx and edx  
0042C5A0   |. |85FF               |test edi, edi                                                     ;ebx=0则跳走
0042C5A2   |. |74 05              |je short SuperPIM.0042C5A9
0042C5A4   |. |80C9 01            |or cl, 1                                                           ;否则cl=cl or 1
0042C5A7   |. |8808               |mov byte ptr ds:[eax], cl
0042C5A9   |> |40                 |inc eax                                                          ;eax指针移向下一位
0042C5AA   |. |4E                 |dec esi                                                          ;esi=esi-1
0042C5AB   |. |8BFB               |mov edi, ebx                                                       ;edi=ebx
0042C5AD   |.^\75 E5              \jnz short SuperPIM.0042C594                                       ;循环回去,这个过程实际是使eax=eax*2   
0042C5AF   |.  5B                 pop ebx
0042C5B0   |>  5F                 pop edi
0042C5B1   |.  5E                 pop esi
0042C5B2   \.  C3                 retn

跟进42c689处的call来到这里,
0042C63D  |> 56             /PUSH ESI
0042C63E  |. FF7424 10      |PUSH DWORD PTR SS:[ESP+10]
0042C642  |. E8 6CFFFFFF    |CALL SuperPIM.0042C5B3                                                   ;跟进
0042C647  |. 4F             |DEC EDI                                                                  ;edi为计数器
0042C648  |. 59             |POP ECX
0042C649  |. 59             |POP ECX
0042C64A  |.^75 F1          \JNZ SHORT SuperPIM.0042C63D                                               ;循环计算

跟进42c642处的call来到这里
0042C5D0  |> 8A08           /MOV CL,BYTE PTR DS:[EAX]                                                  ;cl=序列号
0042C5D2  |. 33D2           |XOR EDX,EDX
0042C5D4  |. 8AD1           |MOV DL,CL
0042C5D6  |. D0E9           |SHR CL,1                                                                   ;cl=cl/2
0042C5D8  |. 8808           |MOV BYTE PTR DS:[EAX],CL
0042C5DA  |. 83E2 01        |AND EDX,1
0042C5DD  |. 85F6           |TEST ESI,ESI
0042C5DF  |. 74 05          |JE SHORT SuperPIM.0042C5E6
0042C5E1  |. 80C9 80        |OR CL,80
0042C5E4  |. 8808           |MOV BYTE PTR DS:[EAX],CL
0042C5E6  |> 48             |DEC EAX
0042C5E7  |. 4F             |DEC EDI
0042C5E8  |. 8BF2           |MOV ESI,EDX
0042C5EA  |.^75 E4          \JNZ SHORT SuperPIM.0042C5D0
0042C5EC  |. 5F             POP EDI
0042C5ED  |> 5E             POP ESI
0042C5EE  \. C3             RETN                                                      

继续跟踪就会发现,不久你又会来到上面的那一大串代码处,没错是一个大循环,程序将序列号处理后得到的注册码又进行了一次
同样的计算,算出一串超级字符串,然后又一次循环将试练码转换为另一个超级字符串进行比较。
..........................................
..........................................
0040FB37    .  83C4 14            add esp, 14
0040FB3A    .  83C1 F0            add ecx, -10         
0040FB3D    .  8845 F3            mov byte ptr ss:[ebp-D], al                  
0040FB40    .  E8 B320FFFF        call SuperPIM.00401BF8               
0040FB45    .  385D F3            cmp byte ptr ss:[ebp-D], bl
0040FB48    .  74 41              je short SuperPIM.0040FB8B            ;  关键一跳,呵呵
0040FB4A    .  53                 push ebx
0040FB4B    .  53                 push ebx
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
原来程序是用同一个函数循环计算三次,来实现不出现明码比较的,当然第一次计算出的是正确的注册码,
大概计算流程是           for  i=0 to 14
                             x=i+5,
                             a[i]={[(i*i*3+7)*i]+0xD}*i*(2^x)
                             b[i]=(0x80000000+name[i])/(2^x)
                             a[i]=a[i] xor b[i]
                             a[i]=a[i] mod 2B
                             a[i]=a[i]+0x30
                               if(a[i]<39 and a[i]<41)
                                 a[i]=a[i]+0xF6
                               else a[i]=a[i]
                         next i
                                      name[i]为注册码字符的16进制
  最后感谢您看望本文,谢谢!
                           
--------------------------------------------------------------------------------
【版权声明】  CRACK BY WXHing[BCG],本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 8
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//