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。 欢迎qifeon兄多多发步算法教程! 楼上的你也发些教程来看看撒 感觉就你最懒了 我主要是来学习的,论坛办的很有特色,祝愿论坛发展越来越好。:)
页:
[1]