【软件名称】:全能音频转换通
【加壳类型】:无壳
【破文作者】:firefly(http://fireflyCN.blog.tom.com/)
【注册方式】:sn
【破解工具】:Olldbg,peid
【破解声明】:初学cracking,研究算法,学习交流!
【破解过程】:
首先用peid查查,无壳vc编译,难得啊!
运行软件,提示注册,随便输入注册码后,提示重起验证!
不想太麻烦,先看看软件所在的文件夹,发现有有个ini文件,打开一看,果然有刚才输入的注册码!看来运气比较好!
od载入,下断 bpx GetPrivateProfileStringA 最后找到
如下地址:
===================================================
00407170 56 push esi ; 全能音频.004B4BD0
00407171 6A 0A push 0A
00407173 6A 00 push 0
00407175 68 0CB94A00 push 全能音频.004AB90C ; ASCII "AppNum"
0040717A 68 D0B84A00 push 全能音频.004AB8D0 ; ASCII "App"
0040717F B9 C84B4B00 mov ecx,全能音频.004B4BC8 ; ASCII "hhI"
00407184 E8 47AE0100 call 全能音频.00421FD0 ;关键算法,跟进
00407189 8BC8 mov ecx,eax
0040718B BE E8030000 mov esi,3E8
00407190 99 cdq
00407191 F7FE idiv esi
00407193 8D04D5 0000000>lea eax,dword ptr ds:[edx*8] ; eax=edx*8
0040719A 2BC2 sub eax,edx
0040719C 8D0440 lea eax,dword ptr ds:[eax+eax*2] ; eax=eax+eax*2
0040719F 8D7442 10 lea esi,dword ptr ds:[edx+eax*2+10] ; esi=edx+eax*2+10
004071A3 B8 D34D6210 mov eax,10624DD3
004071A8 F7E9 imul ecx ; ecx*10624DD3
004071AA C1FA 06 sar edx,6
004071AD 8BCA mov ecx,edx
004071AF 33C0 xor eax,eax
004071B1 C1E9 1F shr ecx,1F
004071B4 03D1 add edx,ecx
004071B6 3BD6 cmp edx,esi
004071B8 5E pop esi
004071B9 0F94C0 sete al
004071BC C3 retn
========================================================================
跟进后发现很多call,最终来到如下地址:
========================================================================
0046D33B 55 push ebp
0046D33C 8BEC mov ebp,esp
0046D33E 83EC 0C sub esp,0C
0046D341 53 push ebx
0046D342 8365 F8 00 and dword ptr ss:[ebp-8],0
0046D346 56 push esi
0046D347 57 push edi
0046D348 8B7D 08 mov edi,dword ptr ss:[ebp+8] ;ss:[ebp+8]存放注册码
0046D34B 8A1F mov bl,byte ptr ds:[edi] ;取注册码第一位
0046D34D 8D77 01 lea esi,dword ptr ds:[edi+1]
0046D350 8975 FC mov dword ptr ss:[ebp-4],esi
0046D353 833D 28214B00 >cmp dword ptr ds:[4B2128],1
0046D35A 7E 0F jle short 全能音频.0046D36B
0046D35C 0FB6C3 movzx eax,bl
0046D35F 6A 08 push 8
0046D361 50 push eax
0046D362 E8 79420000 call 全能音频.004715E0 ; __isctype
0046D367 59 pop ecx
0046D368 59 pop ecx
0046D369 EB 0F jmp short 全能音频.0046D37A
0046D36B 8B0D 1C1F4B00 mov ecx,dword ptr ds:[4B1F1C] ; 全能音频.004B1F26
0046D371 0FB6C3 movzx eax,bl
0046D374 8A0441 mov al,byte ptr ds:[ecx+eax*2]
0046D377 83E0 08 and eax,8
0046D37A 85C0 test eax,eax
0046D37C 74 05 je short 全能音频.0046D383
0046D37E 8A1E mov bl,byte ptr ds:[esi]
0046D380 46 inc esi
0046D381 ^ EB D0 jmp short 全能音频.0046D353
0046D383 80FB 2D cmp bl,2D
0046D386 8975 FC mov dword ptr ss:[ebp-4],esi
0046D389 75 06 jnz short 全能音频.0046D391
0046D38B 834D 14 02 or dword ptr ss:[ebp+14],2
0046D38F EB 05 jmp short 全能音频.0046D396
0046D391 80FB 2B cmp bl,2B
0046D394 75 06 jnz short 全能音频.0046D39C
0046D396 8A1E mov bl,byte ptr ds:[esi]
0046D398 46 inc esi
0046D399 8975 FC mov dword ptr ss:[ebp-4],esi
0046D39C 8B45 10 mov eax,dword ptr ss:[ebp+10]
0046D39F 85C0 test eax,eax
0046D3A1 0F8C 89010000 jl 全能音频.0046D530
0046D3A7 83F8 01 cmp eax,1
0046D3AA 0F84 80010000 je 全能音频.0046D530
0046D3B0 83F8 24 cmp eax,24
0046D3B3 0F8F 77010000 jg 全能音频.0046D530
0046D3B9 6A 10 push 10
0046D3BB 85C0 test eax,eax
0046D3BD 59 pop ecx
0046D3BE 75 24 jnz short 全能音频.0046D3E4
0046D3C0 80FB 30 cmp bl,30
0046D3C3 74 09 je short 全能音频.0046D3CE
0046D3C5 C745 10 0A0000>mov dword ptr ss:[ebp+10],0A
0046D3CC EB 32 jmp short 全能音频.0046D400
0046D3CE 8A06 mov al,byte ptr ds:[esi]
0046D3D0 3C 78 cmp al,78
0046D3D2 74 0D je short 全能音频.0046D3E1
0046D3D4 3C 58 cmp al,58
0046D3D6 74 09 je short 全能音频.0046D3E1
0046D3D8 C745 10 080000>mov dword ptr ss:[ebp+10],8
0046D3DF EB 1F jmp short 全能音频.0046D400
0046D3E1 894D 10 mov dword ptr ss:[ebp+10],ecx
0046D3E4 394D 10 cmp dword ptr ss:[ebp+10],ecx
0046D3E7 75 17 jnz short 全能音频.0046D400
0046D3E9 80FB 30 cmp bl,30
0046D3EC 75 12 jnz short 全能音频.0046D400
0046D3EE 8A06 mov al,byte ptr ds:[esi]
0046D3F0 3C 78 cmp al,78
0046D3F2 74 04 je short 全能音频.0046D3F8
0046D3F4 3C 58 cmp al,58
0046D3F6 75 08 jnz short 全能音频.0046D400
0046D3F8 8A5E 01 mov bl,byte ptr ds:[esi+1]
0046D3FB 46 inc esi
0046D3FC 46 inc esi
0046D3FD 8975 FC mov dword ptr ss:[ebp-4],esi
0046D400 83C8 FF or eax,FFFFFFFF
0046D403 33D2 xor edx,edx
0046D405 F775 10 div dword ptr ss:[ebp+10]
0046D408 BF 03010000 mov edi,103
0046D40D 8945 F4 mov dword ptr ss:[ebp-C],eax
0046D410 833D 28214B00 >cmp dword ptr ds:[4B2128],1 ; 循环处理注册码
0046D417 0FB6F3 movzx esi,bl
0046D41A 7E 0C jle short 全能音频.0046D428
0046D41C 6A 04 push 4
0046D41E 56 push esi
0046D41F E8 BC410000 call 全能音频.004715E0
0046D424 59 pop ecx
0046D425 59 pop ecx
0046D426 EB 0B jmp short 全能音频.0046D433
0046D428 A1 1C1F4B00 mov eax,dword ptr ds:[4B1F1C]
0046D42D 8A0470 mov al,byte ptr ds:[eax+esi*2]
0046D430 83E0 04 and eax,4
0046D433 85C0 test eax,eax
0046D435 74 08 je short 全能音频.0046D43F
0046D437 0FBECB movsx ecx,bl
0046D43A 83E9 30 sub ecx,30 ; 注册码的ascii值减30
0046D43D EB 32 jmp short 全能音频.0046D471
0046D43F 833D 28214B00 >cmp dword ptr ds:[4B2128],1
0046D446 7E 0B jle short 全能音频.0046D453
0046D448 57 push edi
0046D449 56 push esi
0046D44A E8 91410000 call 全能音频.004715E0
0046D44F 59 pop ecx
0046D450 59 pop ecx
0046D451 EB 0B jmp short 全能音频.0046D45E
0046D453 A1 1C1F4B00 mov eax,dword ptr ds:[4B1F1C]
0046D458 66:8B0470 mov ax,word ptr ds:[eax+esi*2]
0046D45C 23C7 and eax,edi
0046D45E 85C0 test eax,eax
0046D460 74 4A je short 全能音频.0046D4AC
0046D462 0FBEC3 movsx eax,bl
0046D465 50 push eax
0046D466 E8 89F0FFFF call 全能音频.0046C4F4
0046D46B 59 pop ecx
0046D46C 8BC8 mov ecx,eax
0046D46E 83E9 37 sub ecx,37
0046D471 3B4D 10 cmp ecx,dword ptr ss:[ebp+10] ; 判断注册码是不是数字
0046D474 73 36 jnb short 全能音频.0046D4AC
0046D476 8B75 F8 mov esi,dword ptr ss:[ebp-8]
0046D479 834D 14 08 or dword ptr ss:[ebp+14],8
0046D47D 3B75 F4 cmp esi,dword ptr ss:[ebp-C]
0046D480 72 14 jb short 全能音频.0046D496
0046D482 75 0C jnz short 全能音频.0046D490
0046D484 83C8 FF or eax,FFFFFFFF
0046D487 33D2 xor edx,edx
0046D489 F775 10 div dword ptr ss:[ebp+10]
0046D48C 3BCA cmp ecx,edx
0046D48E 76 06 jbe short 全能音频.0046D496
0046D490 834D 14 04 or dword ptr ss:[ebp+14],4
0046D494 EB 09 jmp short 全能音频.0046D49F
0046D496 0FAF75 10 imul esi,dword ptr ss:[ebp+10] ; esi=esi*Ah
0046D49A 03F1 add esi,ecx ; esi=esi+ecx ecx=注册码
0046D49C 8975 F8 mov dword ptr ss:[ebp-8],esi ;存放注册码计算结果
0046D49F 8B45 FC mov eax,dword ptr ss:[ebp-4]
0046D4A2 FF45 FC inc dword ptr ss:[ebp-4]
0046D4A5 8A18 mov bl,byte ptr ds:[eax]
0046D4A7 ^ E9 64FFFFFF jmp 全能音频.0046D410
0046D4AC 8B45 14 mov eax,dword ptr ss:[ebp+14]
0046D4AF FF4D FC dec dword ptr ss:[ebp-4]
0046D4B2 8B5D 0C mov ebx,dword ptr ss:[ebp+C]
0046D4B5 A8 08 test al,8
0046D4B7 75 10 jnz short 全能音频.0046D4C9
0046D4B9 85DB test ebx,ebx
0046D4BB 74 06 je short 全能音频.0046D4C3
0046D4BD 8B45 08 mov eax,dword ptr ss:[ebp+8]
0046D4C0 8945 FC mov dword ptr ss:[ebp-4],eax
0046D4C3 8365 F8 00 and dword ptr ss:[ebp-8],0
0046D4C7 EB 4B jmp short 全能音频.0046D514
0046D4C9 A8 04 test al,4
0046D4CB BE FFFFFF7F mov esi,7FFFFFFF
0046D4D0 75 1B jnz short 全能音频.0046D4ED
0046D4D2 A8 01 test al,1
0046D4D4 75 3E jnz short 全能音频.0046D514
0046D4D6 83E0 02 and eax,2
0046D4D9 74 09 je short 全能音频.0046D4E4
0046D4DB 817D F8 000000>cmp dword ptr ss:[ebp-8],80000000
0046D4E2 77 09 ja short 全能音频.0046D4ED
0046D4E4 85C0 test eax,eax
0046D4E6 75 2C jnz short 全能音频.0046D514
0046D4E8 3975 F8 cmp dword ptr ss:[ebp-8],esi
0046D4EB 76 27 jbe short 全能音频.0046D514
0046D4ED E8 BD1B0000 call 全能音频.0046F0AF
0046D4F2 F645 14 01 test byte ptr ss:[ebp+14],1
0046D4F6 C700 22000000 mov dword ptr ds:[eax],22
0046D4FC 74 06 je short 全能音频.0046D504
0046D4FE 834D F8 FF or dword ptr ss:[ebp-8],FFFFFFFF
0046D502 EB 10 jmp short 全能音频.0046D514
0046D504 8B45 14 mov eax,dword ptr ss:[ebp+14]
0046D507 24 02 and al,2
0046D509 F6D8 neg al
0046D50B 1BC0 sbb eax,eax
0046D50D F7D8 neg eax
0046D50F 03C6 add eax,esi
0046D511 8945 F8 mov dword ptr ss:[ebp-8],eax
0046D514 85DB test ebx,ebx
0046D516 74 05 je short 全能音频.0046D51D
0046D518 8B45 FC mov eax,dword ptr ss:[ebp-4]
0046D51B 8903 mov dword ptr ds:[ebx],eax
0046D51D F645 14 02 test byte ptr ss:[ebp+14],2
0046D521 74 08 je short 全能音频.0046D52B
0046D523 8B45 F8 mov eax,dword ptr ss:[ebp-8]
0046D526 F7D8 neg eax
0046D528 8945 F8 mov dword ptr ss:[ebp-8],eax
0046D52B 8B45 F8 mov eax,dword ptr ss:[ebp-8] ;将注册码最终计算结果赋给eax
0046D52E EB 0B jmp short 全能音频.0046D53B
0046D530 8B45 0C mov eax,dword ptr ss:[ebp+C]
0046D533 85C0 test eax,eax
0046D535 74 02 je short 全能音频.0046D539
0046D537 8938 mov dword ptr ds:[eax],edi
0046D539 33C0 xor eax,eax
0046D53B 5F pop edi
0046D53C 5E pop esi
0046D53D 5B pop ebx
0046D53E C9 leave
0046D53F C3 retn
0046D540 6A 01 push 1
0046D542 FF7424 10 push dword ptr ss:[esp+10]
0046D546 FF7424 10 push dword ptr ss:[esp+10]
0046D54A FF7424 10 push dword ptr ss:[esp+10]
0046D54E E8 E8FDFFFF call 全能音频.0046D33B
0046D553 83C4 10 add esp,10
0046D556 C3 retn
======================================================================
程序返回到下面地址
=============================================================
00407189 8BC8 mov ecx,eax ;eax存放运算后的注册码
0040718B BE E8030000 mov esi,3E8
00407190 99 cdq
00407191 F7FE idiv esi ;将计算出来的注册码除以3E8h
00407193 8D04D5 0000000>lea eax,dword ptr ds:[edx*8]
0040719A 2BC2 sub eax,edx
0040719C 8D0440 lea eax,dword ptr ds:[eax+eax*2]
0040719F 8D7442 10 lea esi,dword ptr ds:[edx+eax*2+10] ;即esi=余数*43+16;
004071A3 B8 D34D6210 mov eax,10624DD3
004071A8 F7E9 imul ecx ;计算出来的注册码*10624DD3
004071AA C1FA 06 sar edx,6 ;取结果的高位右移6位
004071AD 8BCA mov ecx,edx ;移位后给ecx
004071AF 33C0 xor eax,eax ;eax清零
004071B1 C1E9 1F shr ecx,1F
004071B4 03D1 add edx,ecx ;将高位再移1Fh位后与移位前相加
004071B6 3BD6 cmp edx,esi ;比较两次运算的结果是不是相等
004071B8 5E pop esi
004071B9 0F94C0 sete al ;若相等则al=1,注册成功!
004071BC C3 retn
【破解总结】:
注册码计算过程并不复杂,
设Z=0,
依次取一位注册码
如果是数字:
则 Z=Z*Ah
Z=Z+(一位注册码)
取下一位注册码,继续循环
如果不是数字:
则 over
最后取 Z除以3E8h 的余数,ESI=余数*7+16
Z乘10624DD3h,右移结果的高位6位得m,再右移1Fh位后与m相加的结果与esi比较!
我的数学不好! ,算法没描述好,也不知道怎么倒回去!!!
不过,最后我发现3E8h是10进制的1000,如果是其整数倍的话,那么esi恒等于10h!
终于我凑出一个注册码来16000!!!
数学不好,感觉很失败!!!!
还请各位大侠指点指点!我也好好补补数学!
补:
脑子开窍了,明白了,先确定注册码的后三位,然后用后三位*43+16则得出注册码的前边几位,如注册码后三位为123,123*43+16=5305,那么注册码就是5305123