- UID
- 37950
注册时间2007-12-1
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 难过 2022-2-6 09:25 |
---|
签到天数: 6 天 [LV.2]偶尔看看I
|
标 题: 【原创】PDFcamp Printer (PDF Writer) V2.2 最新版破解分析
作 者: playboysen
时 间: 2008-06-18
【文章标题】:【原创】PDFcamp Printer (PDF Writer) V2.2 最新版破解分析
【文章作者】: playboysen
【作者邮箱】: [email protected]
【作者相册】: playboysen2.photo.163.com
【软件名称】: PDFcamp Printer (PDF Writer) V2.2
【使用工具】: ollydbg
【操作平台】: Windows XP SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
接触破解一年多,付出的心血多少自己知道,每天面对一堆的汇编指令,多少次想到了放弃,但是最终还是坚守住了自己的兴趣,一年多来经手的软件不下200个,大多是对她们实行”**“,只因水平不高,还看不太懂算法,这个小程序是我算法分析的**作,虽然简单,但是整体分析下来却很不易,希望能给小鸟一点提示,高手掠过:
PDFcamp Printer,可以将doc、xls、ppt、txt文档直接“打印”成pdf文件,未注册版本试用30天,且转换后的pdf文件有水印。程序只有几百K,安装后在安装目录中没有主文件,经过半天的摸索才找到如何注册,汗,呵呵,随便打开一个word文档,选择“文件”——“打印(Ctrl+P)”,调出打印框后点“属性”可以看到它的界面,在About选项卡中就有注册框了,如图1
未命名.jpeg
(29.95 KB, 下载次数: 23)
大家看到了,只有一个文本框,没有机器码和用户名输入提示,输入任意假码后点“Register”,弹出提示框 “Your register number error ……”,用Wsyscheck查看word.exe加载的模块发现两个可疑dll—— pdfui.dll和pdfprn.dll(而且这两个文件是加了UPX壳的),由此猜测它是dll文件注册类型
打开任意一个word文档,OD附加word.exe,bp GetWindowTextA下断后点注册,OD提示断下,Alt+F9返回后F8单步- 032961D9 8BB424 D0000000 mov esi, dword ptr [esp+D0]
- 032961E0 8B3D 04112903 mov edi, dword ptr [3291104] ; USER32.GetDlgItemTextA
- 032961E6 8D4C24 4C lea ecx, dword ptr [esp+4C]
- 032961EA 68 80000000 push 80
- 032961EF 51 push ecx
- 032961F0 68 EC030000 push 3EC
- 032961F5 56 push esi
- 032961F6 FFD7 call edi
- 032961F8 8D5424 0C lea edx, dword ptr [esp+C]
- 032961FC 6A 40 push 40
- 032961FE 52 push edx
- 032961FF 68 EF030000 push 3EF
- 03296204 56 push esi
- 03296205 FFD7 call edi
- 03296207 8D4424 0C lea eax, dword ptr [esp+C] ; 取假码
- 0329620B 8D4C24 4C lea ecx, dword ptr [esp+4C]
- 0329620F 50 push eax ; 假码入栈
- 03296210 51 push ecx
- 03296211 E8 FA220000 call 03298510 ; 关键Call,F7跟进
- 03296216 85C0 test eax, eax
- 03296218 0F84 9A000000 je 032962B8 ;关键跳转,不能跳
- 0329621E 8D5424 0C lea edx, dword ptr [esp+C]
- 03296222 8D4424 4C lea eax, dword ptr [esp+4C]
复制代码 在03296211处F7跟进后到这里- 03298510 8B5424 08 mov edx, dword ptr [esp+8]
- 03298514 85D2 test edx, edx
- 03298516 74 27 je short 0329853F
- 03298518 803A 00 cmp byte ptr [edx], 0
- 0329851B 74 22 je short 0329853F ; 比较输入的注册码是否为空
- 0329851D 57 push edi
- 0329851E 8BFA mov edi, edx
- 03298520 83C9 FF or ecx, FFFFFFFF
- 03298523 33C0 xor eax, eax
- 03298525 F2:AE repne scas byte ptr es:[edi]
- 03298527 F7D1 not ecx
- 03298529 49 dec ecx
- 0329852A 5F pop edi
- 0329852B 83F9 0D cmp ecx, 0D ; ecx中是假码位数,与13相比较,如果注册码小于等于13位就跳向错误
- 0329852E 7E 0F jbe short 0329853F
- 03298530 52 push edx
- 03298531 E8 4AFFFFFF call 03298480 ; 唯一的“算法”比较处F7进去
- 03298536 F7D8 neg eax
- 03298538 1BC0 sbb eax, eax
- 0329853A F7D8 neg eax
- 0329853C C2 0800 retn 8
复制代码 在03298531处F7跟进到下面- 03298483 56 push esi
- 03298484 8B7424 20 mov esi, dword ptr [esp+20]
- 03298488 8D5424 04 lea edx, dword ptr [esp+4]
- 0329848C 57 push edi
- 0329848D 8A06 mov al, byte ptr [esi]
- 0329848F 8A4E 01 mov cl, byte ptr [esi+1]
- 03298492 884424 14 mov byte ptr [esp+14], al
- 03298496 32C0 xor al, al
- 03298498 52 push edx
- 03298499 884424 19 mov byte ptr [esp+19], al
- 0329849D 884C24 0C mov byte ptr [esp+C], cl
- 032984A1 884424 0D mov byte ptr [esp+D], al
- 032984A5 E8 D0000000 call 0329857A ; 跟踪发现,至此假码第二位的十六进制放入ECX,得知此处为关键比较1,F7跟进
- 032984AA 8BF8 mov edi, eax
- 032984AC 8D4424 18 lea eax, dword ptr [esp+18]
- 032984B0 50 push eax
- 032984B1 E8 C4000000 call 0329857A ; 此处为关键比较2
- 032984B6 03F8 add edi, eax ; 上面两个call过去后这里的add的作用是:把注册码一二位数值的16进制值分别减去30后,两个余数相加——>结果放到EDI
- 032984B8 83C4 08 add esp, 8
- 032984BB 83FF 08 cmp edi, 8 ; EDI必须是8 ****注册码的第一个约束条件****
- 032984BE 74 0A je short 032984CA
- 032984C0 5F pop edi
- 032984C1 33C0 xor eax, eax
- 032984C3 5E pop esi
- 032984C4 83C4 18 add esp, 18
- 032984C7 C2 0400 retn 4
- 032984CA 807E 02 56 cmp byte ptr [esi+2], 56 ; 注册码第三位是“V”
- 032984CE 74 0A je short 032984DA
- 032984D0 5F pop edi
- 032984D1 33C0 xor eax, eax
- 032984D3 5E pop esi
- 032984D4 83C4 18 add esp, 18
- 032984D7 C2 0400 retn 4
- 032984DA 807E 03 32 cmp byte ptr [esi+3], 32 ; 注册码第四位是“2”
- 032984DE 74 0A je short 032984EA
- 032984E0 5F pop edi
- 032984E1 33C0 xor eax, eax
- 032984E3 5E pop esi
- 032984E4 83C4 18 add esp, 18
- 032984E7 C2 0400 retn 4
- 032984EA 807E 05 31 cmp byte ptr [esi+5], 31 ; 注册码第六位是“1”
- 032984EE 74 0A je short 032984FA
- 032984F0 5F pop edi
- 032984F1 33C0 xor eax, eax
- 032984F3 5E pop esi
- 032984F4 83C4 18 add esp, 18
- 032984F7 C2 0400 retn 4
- 032984FA 8A4E 0F mov cl, byte ptr [esi+F] ; 注册码第十六位的十六进制放入cl
- 032984FD 33C0 xor eax, eax
- 032984FF 80F9 38 cmp cl, 38 ; 注册码第十六位是“8”
- 03298502 5F pop edi
- 03298503 0F94C0 sete al ;如果条件全部满足则al置1
- 03298506 5E pop esi
- 03298507 83C4 18 add esp, 18
- 0329850A C2 0400 retn 4
- 0329850D 90 nop
- 0329850E 90 nop
复制代码 在跟进032984A5的CALL,到这里- 7C944C36 55 push ebp
- 7C944C37 8BEC mov ebp, esp
- 7C944C39 56 push esi
- 7C944C3A 8B75 08 mov esi, dword ptr [ebp+8]
- 7C944C3D 85F6 test esi, esi
- 7C944C3F 0F84 B3AA0200 je 7C96F6F8
- 7C944C45 833D 70C1997C 0>cmp dword ptr [7C99C170], 1
- 7C944C4C 0FB606 movzx eax, byte ptr [esi] ; 假码第二位十六进制放入eax
- 7C944C4F 0F8F AAAA0200 jg 7C96F6FF
- 7C944C55 8B0D 30C3997C mov ecx, dword ptr [7C99C330]
- 7C944C5B 0FB60441 movzx eax, byte ptr [ecx+eax*2]
- 7C944C5F 83E0 08 and eax, 8
- 7C944C62 85C0 test eax, eax
- 7C944C64 0F85 A4AA0200 jnz 7C96F70E ; 这几句没看懂什么功能,但并不影响分析
- 7C944C6A 0FB60E movzx ecx, byte ptr [esi] ; 假码第二位十六进制放入ecx
- 7C944C6D 46 inc esi
- 7C944C6E 83F9 2D cmp ecx, 2D ; 假码第二位十六进制与“-”连接符比较
- 7C944C71 8BD1 mov edx, ecx
- 7C944C73 74 2A je short 7C944C9F
- 7C944C75 83F9 2B cmp ecx, 2B
- 7C944C78 74 25 je short 7C944C9F
- 7C944C7A 33C0 xor eax, eax
- 7C944C7C 83F9 30 cmp ecx, 30 ; ********************************
- 7C944C7F 7C 19 jl short 7C944C9A ; 这四句是比较第二位是否为数字
- 7C944C81 83F9 39 cmp ecx, 39
- 7C944C84 7F 14 jg short 7C944C9A ; **************************************
- 7C944C86 83E9 30 sub ecx, 30 ; 假码第二位十六进制减去30——>值放入ECX
- 7C944C89 83F9 FF cmp ecx, -1
- 7C944C8C ^ 74 8A je short 7C944C18
- 7C944C8E 8D0480 lea eax, dword ptr [eax+eax*4]
- 7C944C91 8D0441 lea eax, dword ptr [ecx+eax*2] ; ecx+eax*2(其实这里eax大部分时候是0,那么这句就是把ecx值放入eax)——>值放入EAX
- 7C944C94 0FB60E movzx ecx, byte ptr [esi]
- 7C944C97 46 inc esi
- 7C944C98 ^ EB E2 jmp short 7C944C7C
- 7C944C9A 83C9 FF or ecx, FFFFFFFF
- 7C944C9D ^ EB EA jmp short 7C944C89
- 7C944C9F 0FB60E movzx ecx, byte ptr [esi]
- 7C944CA2 46 inc esi
- 7C944CA3 ^ EB D5 jmp short 7C944C7A
复制代码 至此分析全部结束,算法过程总结如下:
首先注册码必须大于13位;
注册码第一二位16进制分别减去30后的余数之和必须等于8 ;
注册码第三位必须是 V;
第四位 2 ;
第六位 1 ;
十六位 8 ;
比如这组注册码可用:
17V201playboyse8
注册机及其源码已经放出,详情请看10楼!!
附件在这里:
https://www.chinapyg.com/viewthr ... &extra=page%3D1
[ 本帖最后由 playboysen 于 2008-7-27 07:35 编辑 ] |
评分
-
查看全部评分
|