好友
阅读权限25
听众
最后登录1970-1-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 [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。 |
|