-
-
超级通讯王算法分析
-
发表于: 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],本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!