qifeon 发表于 2008-11-17 23:16

PDF Split-Merge V3.1 算法简单分析

【文章标题】: PDF Split-Merge V3.1 算法简单分析
【文章作者】: qifeon
【软件名称】: PDF Split-Merge
【下载地址】: http://tele.skycn.com/soft/28472.html
【加壳方式】: ASProtect 2.1x SKE
【保护方式】: 壳+注册码
【编写语言】: Borland C++ 1999
【使用工具】: OD,PEID
【操作平台】: WINXP SP2
【软件介绍】: 一个用来分解/合并PDF文件的工具。支持拖拽功能,
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一、PEID查壳,为 ASProtect 2.1x SKE -> Alexey Solodovnikov,猛壳。我用脚本来脱掉,也可以直接带壳调试。

脱壳后显示为Borland C++ 1999。

二、试运行软件。有试用版显示,输入试炼码“123456”,有错误提示框出现。

三、好了,了解这么多我们可以下手了。用DEDE找按钮事件;0040E5D8

OD载入程序,F9运行,有异常,俩次“SHIFT+F9”,出现注册对话框。“CTRL+G”输入0040E5D8,来到反汇编后此处下断。

输入试炼码“123456”点注册按钮,断下,OK。0040E5D8/.55            push    ebp                                  按钮事件
0040E5D9|.8BEC          mov   ebp, esp
0040E5DB|.83C4 BC       add   esp, -44
0040E5DE|.53            push    ebx
0040E5DF|.56            push    esi
0040E5E0|.8BD8          mov   ebx, eax
0040E5E2|.BE D3EE6600   mov   esi, 0066EED3
0040E5E7|.B8 E0F06600   mov   eax, 0066F0E0
0040E5EC|.E8 CF5D2300   call    006443C0
0040E5F1|.66:C745 E0 14>mov   word ptr , 14
0040E5F7|.33D2          xor   edx, edx
0040E5F9|.8955 FC       mov   dword ptr , edx
0040E5FC|.8D55 FC       lea   edx, dword ptr
0040E5FF|.FF45 EC       inc   dword ptr
0040E602|.8B83 18030000 mov   eax, dword ptr
0040E608|.E8 B7D21D00   call    005EB8C4                         ;取注册码长度
0040E60D|.66:C745 E0 08>mov   word ptr , 8
0040E613|.837D FC 00    cmp   dword ptr , 0             ;注册码是否为空?
0040E617|.74 05         je      short 0040E61E
0040E619|.8B55 FC       mov   edx, dword ptr          ;EDX指向注册码
0040E61C|.EB 03         jmp   short 0040E621
0040E61E|>8D56 1D       lea   edx, dword ptr
0040E621|>8BC3          mov   eax, ebx
0040E623|.E8 40040000   call    0040EA68                            关键call,跟进
0040E628|.84C0          test    al, al                           ;标志位
0040E62A|.75 67         jnz   short 0040E693                   ;关键跳转
0040E62C|.66:C745 E0 20>mov   word ptr , 20
0040E632|.8D56 1E       lea   edx, dword ptr
0040E635|.8D45 F8       lea   eax, dword ptr
0040E638|.E8 07562400   call    00653C44
0040E63D|.FF45 EC       inc   dword ptr
0040E640|.8B10          mov   edx, dword ptr
0040E642|.8B83 20030000 mov   eax, dword ptr
0040E648|.E8 A7D21D00   call    005EB8F4
0040E64D|.FF4D EC       dec   dword ptr
0040E650|.8D45 F8       lea   eax, dword ptr
0040E653|.BA 02000000   mov   edx, 2
0040E658|.E8 47572400   call    00653DA4
0040E65D|.6A 10         push    10
0040E65F|.8D4E 5F       lea   ecx, dword ptr
0040E662|.51            push    ecx
0040E663|.8D46 2C       lea   eax, dword ptr
0040E666|.50            push    eax
0040E667|.8BC3          mov   eax, ebx
0040E669|.E8 6A391E00   call    005F1FD8
0040E66E|.50            push    eax                              ; |hOwner
0040E66F|.E8 78962500   call    <jmp.&user32.MessageBoxA>      ; \错误对话框
0040E674|.FF4D EC       dec   dword ptr
0040E677|.8D45 FC       lea   eax, dword ptr
0040E67A|.BA 02000000   mov   edx, 2
0040E67F|.E8 20572400   call    00653DA4
0040E684|.8B4D D0       mov   ecx, dword ptr
0040E687|.64:890D 00000>mov   dword ptr fs:, ecx
0040E68E|.E9 9F000000   jmp   0040E732
0040E693|>837D FC 00    cmp   dword ptr , 0
0040E697|.74 05         je      short 0040E69E
0040E699|.8B4D FC       mov   ecx, dword ptr
0040E69C|.EB 03         jmp   short 0040E6A1
0040E69E|>8D4E 65       lea   ecx, dword ptr
0040E6A1|>33D2          xor   edx, edx
0040E6A3|.8BC3          mov   eax, ebx
0040E6A5|.E8 5E020000   call    0040E908
0040E6AA|.66:C745 E0 2C>mov   word ptr , 2C
0040E6B0|.8D56 66       lea   edx, dword ptr
0040E6B3|.8D45 F4       lea   eax, dword ptr
0040E6B6|.E8 89552400   call    00653C44
0040E6BB|.FF45 EC       inc   dword ptr
0040E6BE|.8B10          mov   edx, dword ptr
0040E6C0|.8B83 20030000 mov   eax, dword ptr
0040E6C6|.E8 29D21D00   call    005EB8F4
0040E6CB|.FF4D EC       dec   dword ptr
0040E6CE|.8D45 F4       lea   eax, dword ptr
0040E6D1|.BA 02000000   mov   edx, 2
0040E6D6|.E8 C9562400   call    00653DA4
0040E6DB|.8D8E B7000000 lea   ecx, dword ptr
0040E6E1|.6A 40         push    40
0040E6E3|.51            push    ecx
0040E6E4|.8D46 79       lea   eax, dword ptr
0040E6E7|.50            push    eax
0040E6E8|.8BC3          mov   eax, ebx
0040E6EA|.C705 40816600>mov   dword ptr , 2710
0040E6F4|.E8 DF381E00   call    005F1FD8
0040E6F9|.50            push    eax                              ; |hOwner
0040E6FA|.E8 ED952500   call    <jmp.&user32.MessageBoxA>      ; \成功对话框
0040E6FF|.6A 00         push    0
0040E701|.68 60F00000   push    0F060
0040E706|.68 12010000   push    112
0040E70B|.8BC3          mov   eax, ebx
0040E70D|.E8 C6381E00   call    005F1FD8
0040E712|.50            push    eax                              ; |hWnd
0040E713|.E8 52962500   call    <jmp.&user32.SendMessageA>       ; \SendMessageA
0040E718|.FF4D EC       dec   dword ptr
0040E71B|.8D45 FC       lea   eax, dword ptr
0040E71E|.BA 02000000   mov   edx, 2
0040E723|.E8 7C562400   call    00653DA4
0040E728|.8B4D D0       mov   ecx, dword ptr
0040E72B|.64:890D 00000>mov   dword ptr fs:, ecx
0040E732|>5E            pop   esi
0040E733|.5B            pop   ebx
0040E734|.8BE5          mov   esp, ebp
0040E736|.5D            pop   ebp
0040E737\.C3            retn************************************************************************************************************

单步粗跟一次,可以发现错误对话框。判断出关键跳转和关键CALL,我们跟进call    0040EA68

************************************************************************************************************0040EA68/$53            push    ebx
0040EA69|.56            push    esi
0040EA6A|.57            push    edi
0040EA6B|.8BDA          mov   ebx, edx                         ;注册码指针传递给EBX
0040EA6D|.85DB          test    ebx, ebx
0040EA6F|.74 0C         je      short 0040EA7D
0040EA71|.53            push    ebx
0040EA72|.E8 71542300   call    00643EE8                         ;取注册码长度
0040EA77|.59            pop   ecx
0040EA78|.83F8 10       cmp   eax, 10                        ;是否是16位?
0040EA7B|.74 04         je      short 0040EA81                   ;不等则跳向失败,显然注册码必须为16位
0040EA7D|>33C0          xor   eax, eax                         ;失败标志位
0040EA7F|.EB 2F         jmp   short 0040EAB0
0040EA81|>0FBE73 02   movsx   esi, byte ptr             ;ESI=第3位注册码ASCII值
0040EA85|.8BC6          mov   eax, esi                         ;EAX=ESI
0040EA87|.0FBE7B 08   movsx   edi, byte ptr             ;EDI=注册码第9位ASCII值
0040EA8B|.03C7          add   eax, edi                         ;此时EAX值为第3位与第9位之和
0040EA8D|.3D 9B000000   cmp   eax, 9B                        ;比较第三位与第9位之和是否等于9B?
0040EA92|.75 1A         jnz   short 0040EAAE                   ;不等则跳向失败
0040EA94|.8BCE          mov   ecx, esi                         ;ECX=ESI=第3位注册码ASCII值
0040EA96|.2BCF          sub   ecx, edi                         ;注册码第3位减第9位ASCII值
0040EA98|.8BC1          mov   eax, ecx                         ;保存在EAX
————————————————————————————————

注册码第3位与第9位ASCII值之差传递到EAX,决定了EDX的值

当EAX >=0 ,CDQ结果   EDX=0
当EAX < 0 ,CDQ结果   EDX=-1

此处为算法关键处,易忽略

——————————————————————————————------
0040EA9A|.99            cdq                                    ;扩展为符号位到EDX
0040EA9B|.33C2          xor   eax, edx                         ;EAX=EAX XOR EDX
0040EA9D|.2BC2          sub   eax, edx                         ;EAX=EAX-EDX



0040EA9F|.83C0 41       add   eax, 41                        ;EAX=EAX+41h
0040EAA2|.0FBE53 05   movsx   edx, byte ptr             ;EDX=第6位注册码ASCII值
0040EAA6|.3BC2          cmp   eax, edx                         ;注册码第6位与上面计算值相比较
0040EAA8|.75 04         jnz   short 0040EAAE                   ;跳则失败
0040EAAA|.B0 01         mov   al, 1                            ;注册成功标志位
0040EAAC|.EB 02         jmp   short 0040EAB0
0040EAAE|>33C0          xor   eax, eax                         ;失败标志位,可以作为爆破点
0040EAB0|>5F            pop   edi
0040EAB1|.5E            pop   esi
0040EAB2|.5B            pop   ebx
0040EAB3\.C3            retn****************************************************************************************************************


四、算法总结
猛壳加弱算法,注册码必须满足以下三个条件

1、注册码长度必须为16位;

2.第3位与第9位ASCII值之和必须为155(9Bh);

3、第6位ASCII值=(第3位与第9位ASCII值之差)xor (EDX) -EDX+41h。

注:EDX为0或-1

提供一个可用注册码:

12345v78h0152LCG

注册码存放在程序目录apset.ini。

Hmily 发表于 2008-11-20 13:35

欢迎qifeon兄多多发步算法教程!

wesley 发表于 2008-11-20 14:02

楼上的你也发些教程来看看撒      感觉就你最懒了

qifeon 发表于 2008-11-20 20:06

我主要是来学习的,论坛办的很有特色,祝愿论坛发展越来越好。:)
页: [1]
查看完整版本: PDF Split-Merge V3.1 算法简单分析