【软件名称】: Adult PDF Password Recovery v2.2.0 2004-7
【加壳类型】:
7b6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4V1N6h3I4@1M7r3c8X3i4K6u0W2j5$3!0E0i4K6u0r3M7s2u0G2k6s2g2U0N6s2y4Q4x3V1k6H3N6$3c8J5k6h3#2G2N6X3g2J5i4K6u0r3K9h3&6V1k6i4S2Q4x3X3g2Z5N6r3@1`.
【加壳类型】: ASPack 2.12 -> Alexey Solodovnikov
【注册方式】: e-mail+注册码
【破解作者】: firefly firefly.CN@Gmail.com
【破解声明】: 还是菜鸟,纯属学习,别无他意!希望多多鼓励,给些意见!
【破解过程】:
先用peid查看,得知文件用aspack 2.12加壳,有专门的脱壳工具就不必自己脱壳!(暴破留下的习惯*^_^*)
脱壳后,先运行一下,看程序是否正常!
一运行程序就出对话框,要求注册,随便添入一个邮箱和序列号
出现messagebox提示错误!这很好!我们可以通过messagebox提示很容易找到注册码的比较处。打开olldbg,载入脱壳后的程序,在命令行输入 bp MessageBoxA,按F9运行程序,挡弹出对话框要求注册时,随便输入email和序列号,点ok!
这时候,ollbdg提示中断在USER32.MessageBoxA,很好,按ctrl+F9运行到retn,按F7返回到程序领空。到这儿,我们已经成功了一半,看来软件的作者并不想给我们这些菜鸟制造很打的麻烦,既然有注册错误提示,那多半就应该有成功提示,在olldbg的汇编窗口里上下观察
=================================================================
00403F35 E8 E6070000 call Unpacked.00404720 //这里应该是注册码进行运算比较的地方
00403F3A 84C0 test al,al
00403F3C 75 76 jnz short Unpacked.00403FB4 //这里是关键的跳转
00403F3E 66:C747 10 2C00 mov word ptr ds:[edi+10],2C
00403F44 8D56 1E lea edx,dword ptr ds:[esi+1E]
00403F47 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00403F4A E8 6D070D00 call Unpacked.004D46BC
00403F4F FF47 1C inc dword ptr ds:[edi+1C]
00403F52 8B10 mov edx,dword ptr ds:[eax]
00403F54 8B83 2C050000 mov eax,dword ptr ds:[ebx+52C]
00403F5A E8 E9B80600 call Unpacked.0046F848
00403F5F FF4F 1C dec dword ptr ds:[edi+1C]
00403F62 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00403F65 BA 02000000 mov edx,2
00403F6A E8 AD080D00 call Unpacked.004D481C
00403F6F 6A 10 push 10
00403F71 8D4E 69 lea ecx,dword ptr ds:[esi+69]
00403F74 51 push ecx
00403F75 8D46 2C lea eax,dword ptr ds:[esi+2C]
00403F78 50 push eax
00403F79 8BC3 mov eax,ebx
00403F7B E8 AC1F0700 call Unpacked.00475F2C
00403F80 50 push eax
00403F81 E8 B61A0D00 call <jmp.&USER32.MessageBoxA>
00403F86 FF4F 1C dec dword ptr ds:[edi+1C] //我们停在这里
00403F89 8D45 F8 lea eax,dword ptr ss:[ebp-8]
00403F8C BA 02000000 mov edx,2
00403F91 E8 86080D00 call Unpacked.004D481C
00403F96 FF4F 1C dec dword ptr ds:[edi+1C]
00403F99 8D45 FC lea eax,dword ptr ss:[ebp-4]
00403F9C BA 02000000 mov edx,2
00403FA1 E8 76080D00 call Unpacked.004D481C
00403FA6 8B0F mov ecx,dword ptr ds:[edi]
00403FA8 64:890D 00000000 mov dword ptr fs:[0],ecx
00403FAF E9 BD000000 jmp Unpacked.00404071
00403FB4 837D F8 00 cmp dword ptr ss:[ebp-8],0
00403FB8 74 05 je short Unpacked.00403FBF
00403FBA 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
00403FBD EB 03 jmp short Unpacked.00403FC2
00403FBF 8D4E 70 lea ecx,dword ptr ds:[esi+70]
00403FC2 837D FC 00 cmp dword ptr ss:[ebp-4],0
00403FC6 74 05 je short Unpacked.00403FCD
00403FC8 8B55 FC mov edx,dword ptr ss:[ebp-4]
00403FCB EB 03 jmp short Unpacked.00403FD0
00403FCD 8D56 6F lea edx,dword ptr ds:[esi+6F]
00403FD0 8BC3 mov eax,ebx
00403FD2 E8 8D050000 call Unpacked.00404564
00403FD7 66:C747 10 3800 mov word ptr ds:[edi+10],38
00403FDD 8D56 71 lea edx,dword ptr ds:[esi+71]
00403FE0 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00403FE3 E8 D4060D00 call Unpacked.004D46BC
00403FE8 FF47 1C inc dword ptr ds:[edi+1C]
00403FEB 8B10 mov edx,dword ptr ds:[eax]
00403FED 8B83 2C050000 mov eax,dword ptr ds:[ebx+52C]
00403FF3 E8 50B80600 call Unpacked.0046F848
00403FF8 FF4F 1C dec dword ptr ds:[edi+1C]
00403FFB 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00403FFE BA 02000000 mov edx,2
00404003 E8 14080D00 call Unpacked.004D481C
00404008 8D8E EB000000 lea ecx,dword ptr ds:[esi+EB]
0040400E 6A 40 push 40
00404010 51 push ecx
00404011 8D86 84000000 lea eax,dword ptr ds:[esi+84]
00404017 50 push eax
00404018 8BC3 mov eax,ebx
0040401A C705 A4864D00 10270>mov dword ptr ds:[4D86A4],2710
00404024 E8 031F0700 call Unpacked.00475F2C
00404029 50 push eax
0040402A E8 0D1A0D00 call <jmp.&USER32.MessageBoxA> //看到这里没有,还有一个messageboxa的调用
0040402F 6A 00 push 0
00404031 68 60F00000 push 0F060
00404036 68 12010000 push 112
0040403B 8BC3 mov eax,ebx
0040403D E8 EA1E0700 call Unpacked.00475F2C
00404042 50 push eax
00404043 E8 6C1A0D00 call <jmp.&USER32.SendMessageA>
00404048 FF4F 1C dec dword ptr ds:[edi+1C]
0040404B 8D45 F8 lea eax,dword ptr ss:[ebp-8]
0040404E BA 02000000 mov edx,2
00404053 E8 C4070D00 call Unpacked.004D481C
00404058 FF4F 1C dec dword ptr ds:[edi+1C]
0040405B 8D45 FC lea eax,dword ptr ss:[ebp-4]
0040405E BA 02000000 mov edx,2
00404063 E8 B4070D00 call Unpacked.004D481C
00404068 8B0F mov ecx,dword ptr ds:[edi]
0040406A 64:890D 00000000 mov dword ptr fs:[0],ecx
00404071 5F pop edi
00404072 5E pop esi
00404073 5B pop ebx
00404074 8BE5 mov esp,ebp
00404076 5D pop ebp
00404077 C3 retn
====================================================================
可以看到的确有两处messageboxa,猜想不错!
想爆破应该没问题!
但是,往往软件都有重起验证,所以
还是先跟进注册码比较的地方看看
============================================
00404720 56 push esi
00404721 8BF2 mov esi,edx
00404723 85F6 test esi,esi //注册码是否为空
00404725 75 04 jnz short unpacked.0040472B
00404727 33C0 xor eax,eax
00404729 5E pop esi
0040472A C3 retn
0040472B 803E 00 cmp byte ptr ds:[esi],0
0040472E 75 04 jnz short unpacked.00404734
00404730 33C0 xor eax,eax
00404732 5E pop esi
00404733 C3 retn
00404734 56 push esi
00404735 E8 AE390C00 call unpacked.004C80E8 //获取注册码长度
0040473A 59 pop ecx
0040473B 83F8 10 cmp eax,10 //比较注册码长度是不是是16位
0040473E 74 04 je short unpacked.00404744
00404740 33C0 xor eax,eax
00404742 5E pop esi
00404743 C3 retn
00404744 33D2 xor edx,edx
00404746 8BC6 mov eax,esi
00404748 0FBE08 movsx ecx,byte ptr ds:[eax] //此处为一循环看注册码是不是全是大写字母
0040474B 83F9 41 cmp ecx,41
0040474E 7C 05 jl short unpacked.00404755
00404750 83F9 5A cmp ecx,5A
00404753 7E 04 jle short unpacked.00404759
00404755 33C0 xor eax,eax
00404757 5E pop esi
00404758 C3 retn
00404759 42 inc edx
0040475A 40 inc eax
0040475B 83FA 10 cmp edx,10
0040475E ^ 7C E8 jl short unpacked.00404748
00404760 0FBE56 09 movsx edx,byte ptr ds:[esi+9] //取注册码第10位
00404764 0FBE4E 0C movsx ecx,byte ptr ds:[esi+C] //取注册码第13位
00404768 03D1 add edx,ecx //将10位和13位相加
0040476A 81FA 9B000000 cmp edx,9B //所的结果与0x9b比较
00404770 74 04 je short unpacked.00404776 //相等就跳
00404772 33C0 xor eax,eax
00404774 5E pop esi
00404775 C3 retn
00404776 B0 01 mov al,1 //设置al 为1
00404778 5E pop esi
00404779 C3 retn
================================================================
可以看出,注册算法超级简单!!!!!!!
注册码必须全部为大写字母,长度为16位,第10位和第13位字母的ascii值之和是0x9B!
================================================================
【心得体会】:
很早以前的时候,技术太烂,光想着怎么暴破!
以前暴破这个软件的时候费了些周折,现在分析它的注册算法才发现,原来注册算法很简单!!!
相比暴破而言还简单些!!因为软件有重启验证,暴破要还要找到注册码存放的地方,分析了它的注册算法,很明显,暴破要麻烦些!
想想,其实脱壳也是没有必要的,只是当时是想爆破只有脱壳才行!
这么简单的注册算法,我感觉没有写帖子的必要!
但我想想,还是写了,我想借这帖子告诉那些和我一样的就会暴破的菜鸟们,也许注册算法不是很难!
我们是不是应该先看看注册算法,然后再决定是不是暴破!
[培训]科锐逆向工程师培训第53期2025年7月8日开班!