首页
社区
课程
招聘
[原创]PDFcamp Printer (PDF Writer) V2.2 最新版算法分析及Keygen源码
2008-6-18 15:11 13342

[原创]PDFcamp Printer (PDF Writer) V2.2 最新版算法分析及Keygen源码

2008-6-18 15:11
13342
【文章标题】:【原创】PDFcamp Printer (PDF Writer) V2.2 最新版破解分析
【文章作者】: playboysen
【作者邮箱】: playboysen@126.com
【作者相册】: 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
     
   大家看到了,只有一个文本框,没有机器码和用户名输入提示,输入任意假码后点“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



至此分析全部结束,算法过程总结如下:
注册码第一二位16进制分别减去30后的余数之和必须等于8
注册码第三位必须是 V
第四位 2
第六位 1
十六位 8

顺便写出注册机,源码公布如下(Delphi 7.0编译通过):
procedure TForm1.btn1Click(Sender: TObject);
var
a,b,c,Temp:integer;
begin
    randomize; //初始化随机数
    repeat
    a:=Random(10);
    b:=Random(10);
    c:=Random(10);
    Temp:=a + b;
    until Temp=8;
    Form1.Edit1.Text:=IntToStr(a) + IntToStr(b) + 'V2'+IntToStr(c)+'1Senhuan018';
end;

end.

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (29)
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
血草 1 2008-6-18 15:25
2
0
分析的很详细,学习了。。
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
xiaojiam 2 2008-6-18 15:40
3
0
好东西值得学习啊!先收下慢慢看!
雪    币: 575
活跃值: (147)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
playboysen 16 2008-6-18 21:00
4
0
真是太感谢版主的信任和大家的支持了!
我的处女作被收录为精华帖,这本身就是一种鼓励和荣耀,更多的学习,更好的文章,加油!
雪    币: 26435
活跃值: (18462)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2008-6-18 21:04
5
0
希望看到你更多的文章,另外,目标软件不要选国产软件(理由见置顶的公告)。
雪    币: 575
活跃值: (147)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
playboysen 16 2008-6-18 21:16
6
0
我明白 ,这个软件是国外的,我确定呵呵
其实破解不是最终目的,钓胜于鱼,学习逆向和分析的过程才是我们想要的,对吗?
雪    币: 368
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
快雪时晴 4 2008-6-18 21:59
7
0
TAG: PDF WRITER DOC PRINT CRACK
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
petnt 12 2008-6-18 22:39
8
0
好帖要留名。
雪    币: 1843
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yingyue 2008-6-18 23:45
9
0
楼主顺手写个注册机,让你的精华精神一些
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mayibusi 2008-6-18 23:55
10
0
不错,学习的榜样
雪    币: 575
活跃值: (147)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
playboysen 16 2008-6-19 11:35
11
0
现在已经写出了注册机了,呵呵
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
topclay 2008-6-19 18:07
12
0
学习下,慢慢看着!
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
小子贼野 10 2008-6-19 18:48
13
0
不错,分析的挺详细的,学习了
雪    币: 292
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
clide2000 7 2008-6-19 20:28
14
0
写的很详细,辛苦了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
生命延续 2008-6-19 22:01
15
0
我现在的水平还看不懂,
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
生命延续 2008-6-19 22:01
16
0
不过正在努力中
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
doszyh 2008-6-19 22:02
17
0
http://bbs.pediy.com/showthread.php?t=66896
我发的这个帖子,希望您给分析下,我感觉和这个有点相同,我不会,我学习,期待你的出招!期待中....
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大醉侠 2008-6-19 22:07
18
0
学习的榜样 !!!!
雪    币: 312
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jinyh 2008-6-19 22:17
19
0
要顶,不过现在的软件加密更强一些了!
雪    币: 575
活跃值: (147)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
playboysen 16 2008-6-20 17:06
20
0
我简单分析了一下,你看一看吧
雪    币: 381
活跃值: (125)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
HSQ 8 2008-6-20 18:35
21
0
LZ辛苦了,鼓励一下,一定坚持下去,慢慢的就容易了
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xieph 2008-6-24 11:30
22
0
感谢分享,终于用一个钟的时间练习完了,呵~~
雪    币: 38
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
funlxd 2008-6-24 13:40
23
0
学习,谢谢楼主
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
颠er 2008-6-24 18:26
24
0
分析的不错顶起
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hack杰 2008-6-25 10:36
25
0
好东西 啊  一定要顶啊  
   好好学习  了
               收下了
游客
登录 | 注册 方可回帖
返回