首页
社区
课程
招聘
[原创]AdultPDFPasswordRecovery算法分析
发表于: 2005-9-28 12:32 4769

[原创]AdultPDFPasswordRecovery算法分析

2005-9-28 12:32
4769
【软件名称】:  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日开班!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
2

什么软件这样子
2005-9-28 12:38
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
3
这个公司的软件算法都差不多~

http://bbs.pediy.com//showthread.php?s=&threadid=16791
2005-9-28 12:45
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
~不错~
     一个菜鸟进阶的心路历程
2005-9-28 20:14
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
5
为什么我就找不到软柿子?
2005-9-29 10:47
0
游客
登录 | 注册 方可回帖
返回