首页
社区
课程
招聘
[原创]PDF Split-Merge V3.1 算法简单分析
2008-11-17 23:30 5818

[原创]PDF Split-Merge V3.1 算法简单分析

2008-11-17 23:30
5818
【文章标题】: 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 [ebp-20], 14
  0040E5F7  |.  33D2          xor     edx, edx
  0040E5F9  |.  8955 FC       mov     dword ptr [ebp-4], edx
  0040E5FC  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
  0040E5FF  |.  FF45 EC       inc     dword ptr [ebp-14]
  0040E602  |.  8B83 18030000 mov     eax, dword ptr [ebx+318]
  0040E608  |.  E8 B7D21D00   call    005EB8C4                         ;  取注册码长度
  0040E60D  |.  66:C745 E0 08>mov     word ptr [ebp-20], 8
  0040E613  |.  837D FC 00    cmp     dword ptr [ebp-4], 0             ;  注册码是否为空?
  0040E617  |.  74 05         je      short 0040E61E
  0040E619  |.  8B55 FC       mov     edx, dword ptr [ebp-4]           ;  EDX指向注册码
  0040E61C  |.  EB 03         jmp     short 0040E621
  0040E61E  |>  8D56 1D       lea     edx, dword ptr [esi+1D]
  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 [ebp-20], 20
  0040E632  |.  8D56 1E       lea     edx, dword ptr [esi+1E]
  0040E635  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
  0040E638  |.  E8 07562400   call    00653C44
  0040E63D  |.  FF45 EC       inc     dword ptr [ebp-14]
  0040E640  |.  8B10          mov     edx, dword ptr [eax]
  0040E642  |.  8B83 20030000 mov     eax, dword ptr [ebx+320]
  0040E648  |.  E8 A7D21D00   call    005EB8F4
  0040E64D  |.  FF4D EC       dec     dword ptr [ebp-14]
  0040E650  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
  0040E653  |.  BA 02000000   mov     edx, 2
  0040E658  |.  E8 47572400   call    00653DA4
  0040E65D  |.  6A 10         push    10
  0040E65F  |.  8D4E 5F       lea     ecx, dword ptr [esi+5F]
  0040E662  |.  51            push    ecx
  0040E663  |.  8D46 2C       lea     eax, dword ptr [esi+2C]
  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 [ebp-14]
  0040E677  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
  0040E67A  |.  BA 02000000   mov     edx, 2
  0040E67F  |.  E8 20572400   call    00653DA4
  0040E684  |.  8B4D D0       mov     ecx, dword ptr [ebp-30]
  0040E687  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
  0040E68E  |.  E9 9F000000   jmp     0040E732
  0040E693  |>  837D FC 00    cmp     dword ptr [ebp-4], 0
  0040E697  |.  74 05         je      short 0040E69E
  0040E699  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
  0040E69C  |.  EB 03         jmp     short 0040E6A1
  0040E69E  |>  8D4E 65       lea     ecx, dword ptr [esi+65]
  0040E6A1  |>  33D2          xor     edx, edx
  0040E6A3  |.  8BC3          mov     eax, ebx
  0040E6A5  |.  E8 5E020000   call    0040E908
  0040E6AA  |.  66:C745 E0 2C>mov     word ptr [ebp-20], 2C
  0040E6B0  |.  8D56 66       lea     edx, dword ptr [esi+66]
  0040E6B3  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
  0040E6B6  |.  E8 89552400   call    00653C44
  0040E6BB  |.  FF45 EC       inc     dword ptr [ebp-14]
  0040E6BE  |.  8B10          mov     edx, dword ptr [eax]
  0040E6C0  |.  8B83 20030000 mov     eax, dword ptr [ebx+320]
  0040E6C6  |.  E8 29D21D00   call    005EB8F4
  0040E6CB  |.  FF4D EC       dec     dword ptr [ebp-14]
  0040E6CE  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
  0040E6D1  |.  BA 02000000   mov     edx, 2
  0040E6D6  |.  E8 C9562400   call    00653DA4
  0040E6DB  |.  8D8E B7000000 lea     ecx, dword ptr [esi+B7]
  0040E6E1  |.  6A 40         push    40
  0040E6E3  |.  51            push    ecx
  0040E6E4  |.  8D46 79       lea     eax, dword ptr [esi+79]
  0040E6E7  |.  50            push    eax
  0040E6E8  |.  8BC3          mov     eax, ebx
  0040E6EA  |.  C705 40816600>mov     dword ptr [668140], 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 [ebp-14]
  0040E71B  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
  0040E71E  |.  BA 02000000   mov     edx, 2
  0040E723  |.  E8 7C562400   call    00653DA4
  0040E728  |.  8B4D D0       mov     ecx, dword ptr [ebp-30]
  0040E72B  |.  64:890D 00000>mov     dword ptr fs:[0], 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 [ebx+2]            ;  ESI=第3位注册码ASCII值
  0040EA85  |.  8BC6          mov     eax, esi                         ;  EAX=ESI
  0040EA87  |.  0FBE7B 08     movsx   edi, byte ptr [ebx+8]            ;  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 [ebx+5]            ;  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。
  
--------------------------------------------------------------------------------

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (4)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
toonames 2008-11-22 17:18
2
0
真是不简单,一点也看不懂
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 7 2008-11-22 17:31
3
0
支持支持....1234
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
newjueqi 7 2008-11-22 17:54
4
0
支持一下楼主,(*^__^*) 嘻嘻……
雪    币: 340
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Squn 2008-11-22 18:21
5
0
qifeon偷偷闭关,我竟然不知道...

现在竟然如此厉害..

我到现在还是对算法没感觉,甚为头痛..
游客
登录 | 注册 方可回帖
返回