天天看点

关于《Foxit Phantom的完美破解》的一点补充——打印驱动破解

【破解作者】 solo_lxy

【使用工具】 OD,IDA Pro

【软件名称】 Foxit Phantom 1.0.2.1123

【软件简介】 Foxit Phantom是一个商业级的PDF应用软件,是一个集创建,阅读和编辑PDF为一体的新工具.

【下载地址】 http://www.skycn.com/soft/57351.html

【破解声明】 只是感兴趣,没有其他目的。失误之处敬请赐教!

      看雪论坛上TopmenC的一篇关于《Foxit Phantom的完美破解》(http://bbs.pediy.com/showthread.php?t=102691)对Foxit Phantom 1.0.2.1123的破解给我们提供了重要的线索。其中最关键的地方就是在0044DB23位置处将jnz修改为如下:

                    0044DB23 . /E9 89020000 jmp 0044DDB1

                    0044DB28 |90 nop

     原来的jnz指令占6个字节,改后分解为两个指令,在OD中这个改变自动完成,我们只需要按空格键,将jnz该为jmp即可。这样整个软件基本上绝大部分功能都能用了,真的很好用。不过,我还是在使用的过程中发现了有个小瑕疵。

     安装完Foxit Phantom 1.0.2.1123后,如果你系统中安装了Office Word,它会自动地在word中添加一个工具栏,通过这个工具栏我们可以直接将word文档转换成pdf格式。以前为了使用这个功能,我好象是要下载安装一个忘了叫什么名字的驱动,现在好了只要安装了Foxit Phantom,阅读、编辑、转换pdf文档一个工具就搞定了。

关于《Foxit Phantom的完美破解》的一点补充——打印驱动破解

     这时,如果你直接点击转换按钮,还是会出现天数限制对话框,30天的限制时间后你就不能再用了。

     过期后,word中的这个工具栏也就自动卸载了。也就是说仅仅对Foxit Phantom主程序做如上的修改并不是很完善。

既然提供了文档转换功能,那按经验,肯定是在系统中安装了虚拟的pdf打印机。我的电脑->控制面板->打印机和传真,果然我的打印机设置页面多了个Foxit Phantom Printer打印机:

关于《Foxit Phantom的完美破解》的一点补充——打印驱动破解

    为了找出Foxit Phantom安装的虚拟驱动,我随便新建了个test.txt文档,用notepad打开并打印,这时Foxit Phantom会打开主程序,并提示会提醒你:

关于《Foxit Phantom的完美破解》的一点补充——打印驱动破解

    这里请注意,Foxit Phantom主程序是可以关闭的,并不影响打印。通过上图状态栏的提示我们可以发现,打印机驱动程序代码直接运行在notepad的进程空间中。这时,用OD附加notepad(测试文档:test.txt),ALT+M寻找可以模块,很快发现notepad进程中有个fpmvpr_d的模块,这个很有可能是Foxit Phantom的虚拟打印机驱动。搜索fpmvpr_d文件,发现以下两位置有此文件:C:/WINDOWS/system32/spool/drivers/w32x86/3;C:/WINDOWS/system32/spool/drivers/w32x86/,文件全称fpmvpr_drv.dll。查看文件属性可发现其描述为:Foxit Phantom Printer: Virtual Printer Driver。通过这我们可以断定这个就是我们要找的驱动。不过这里有两个一样名字的文件,只不过储存位置不同。要想知道那个是我们关注的,这里有个最简单快速的办法,在notepad中点击打印选择打印机确定后,分别删除上面两个文件夹中的fpmvpr_drv.dll文件,这样很快知道C:/WINDOWS/system32/spool/drivers/w32x86/3中的fpmvpr_drv.dll正是我们要找的(因为系统不让我们删)。

     用Resource Hacker打开fpmvpr_drv.dll,查看对话框资源发现124(16进制7C)号对话框就是我们上面看到的天数限制对话框。用OD加载,查找常量7C,很快就定位到如下代码(通过字符串参考“Sorry,your free trial period for Foxit Phantom has expired! ”同样可以):

10027704 |. 3BC3 cmp eax, ebx

10027706 |. A1 50B10D10 mov eax, dword ptr [100DB150]

1002770B /74 31 je short 1002773E ;改为jmp

1002770D |. |3BC3 cmp eax, ebx

1002770F |74 12 je short 10027723 ; 注意这里的跳转:会弹出过期对话框,程序直接退出,要将这里的je改为jmp (可不改,上面已经跳过了)

10027711 |. |53 push ebx ; /Style

10027712 |. |68 B02F0D10 push 100D2FB0 ; |Title = "Foxit Phantom"

10027717 |. |68 C42E0D10 push 100D2EC4 ; |Text = "Sorry, your free trial period for Foxit Phantom has expired!.

; Please visit the Foxit Phantom site to order it online."

1002771C |. |53 push ebx ; |hOwner

1002771D |. |FF15 84720910 call dword ptr [<&USER32.MessageBoxW>>; /MessageBoxW

10027723 |> |891D 50B10D10 mov dword ptr [100DB150], ebx

10027729 |. |33C0 xor eax, eax

1002772B |. |8B4D F4 mov ecx, dword ptr [ebp-C]

1002772E |. |64:890D 00000>mov dword ptr fs:[0], ecx

10027735 |. |5F pop edi

10027736 |. |5E pop esi

10027737 |. |5B pop ebx

10027738 |. |8BE5 mov esp, ebp

1002773A |. |5D pop ebp

1002773B |. |C2 0C00 retn 0C

1002773E |> /3BC3 cmp eax, ebx

10027740 74 17 je short 10027759 ; 在这里将je改为jmp,跳过下面的对话框

10027742 |. 8B15 40A70D10 mov edx, dword ptr [100DA740]

10027748 |. 68 10710210 push 10027110

1002774D |. 53 push ebx

1002774E |. 6A 7C push 7C ; 注意这里就是弹出还剩下多少天对话框的ID=124=0x7C

10027750 |. 52 push edx

10027751 |. E8 EA9CFDFF call 10001440

10027756 |. 83C4 10 add esp, 10

10027759 |> /891D 50B10D10 mov dword ptr [100DB150], ebx

1002775F |. 885D FC mov byte ptr [ebp-4], bl

10027762 |. 897D EC mov dword ptr [ebp-14], edi

10027765 |> 8B45 08 mov eax, dword ptr [ebp+8]

10027768 |. 8B70 08 mov esi, dword ptr [eax+8]

1002776B |. 8B8E BC070000 mov ecx, dword ptr [esi+7BC]

10027771 |. 3BCB cmp ecx, ebx

10027773 |. 75 5A jnz short 100277CF ;这里如果跳转,就直接退出函数,在这里nop掉jnz

10027775 |. 68 58040000 push 458

1002777A |. E8 F52E0000 call 1002A674

1002777F |. 8BC8 mov ecx, eax

10027781 |. 83C4 04 add esp, 4

10027784 |. 894D 08 mov dword ptr [ebp+8], ecx

10027787 |. 3BCB cmp ecx, ebx

10027789 |. C645 FC 02 mov byte ptr [ebp-4], 2

1002778D |. 74 09 je short 10027798

1002778F |. E8 9CB0FDFF call 10002830

10027794 |. 8BC8 mov ecx, eax

10027796 |. EB 02 jmp short 1002779A

10027798 |> 33C9 xor ecx, ecx

1002779A |> 56 push esi ; /Arg1

1002779B |. 885D FC mov byte ptr [ebp-4], bl ; |

1002779E |. 898E BC070000 mov dword ptr [esi+7BC], ecx ; |

100277A4 |. E8 F7C2FDFF call 10003AA0 ; /fpmvpr_d.10003AA0

100277A9 |. 8B4D 10 mov ecx, dword ptr [ebp+10]

100277AC |. 8B55 0C mov edx, dword ptr [ebp+C]

100277AF |. 51 push ecx ; /Arg2

100277B0 |. 8B8E BC070000 mov ecx, dword ptr [esi+7BC] ; |

100277B6 |. 52 push edx ; |Arg1

100277B7 |. E8 34C7FDFF call 10003EF0 ; /fpmvpr_d.10003EF0 ; 开启一个线程,转换pdf

100277BC |. 8B4D F4 mov ecx, dword ptr [ebp-C]

100277BF |. 64:890D 00000>mov dword ptr fs:[0], ecx

100277C6 |. 5F pop edi

100277C7 |. 5E pop esi

100277C8 |. 5B pop ebx

100277C9 |. 8BE5 mov esp, ebp

100277CB |. 5D pop ebp

100277CC |. C2 0C00 retn 0C

100277CF |> 8B7D 10 mov edi, dword ptr [ebp+10]

100277D2 |. 3BFB cmp edi, ebx

100277D4 |. 74 40 je short 10027816

100277D6 |. E8 B5B5FDFF call 10002D90

100277DB |. 8B8E BC070000 mov ecx, dword ptr [esi+7BC]

100277E1 |. 56 push esi ; /Arg1

100277E2 |. E8 B9C2FDFF call 10003AA0 ; /fpmvpr_d.10003AA0

100277E7 |. 8B86 BC070000 mov eax, dword ptr [esi+7BC]

100277ED |. 8B4D 0C mov ecx, dword ptr [ebp+C]

100277F0 |. 57 push edi ; /Arg2

100277F1 |. 51 push ecx ; |Arg1

100277F2 |. 8998 A0010000 mov dword ptr [eax+1A0], ebx ; |

100277F8 |. 8B8E BC070000 mov ecx, dword ptr [esi+7BC] ; |

100277FE |. E8 EDC6FDFF call 10003EF0 ; /fpmvpr_d.10003EF0

10027803 |. 8B4D F4 mov ecx, dword ptr [ebp-C]

10027806 |. 64:890D 00000>mov dword ptr fs:[0], ecx

1002780D |. 5F pop edi

1002780E |. 5E pop esi

1002780F |. 5B pop ebx

10027810 |. 8BE5 mov esp, ebp

10027812 |. 5D pop ebp

10027813 |. C2 0C00 retn 0C

     上面的反汇编代码中,我已经做了关键注释,破解该驱动可以做如下修改:

                    1、1002770B 将je改为jmp

                    2、10027740 将je改为jmp

                    3、10027773 将jnz改为nop

     通过如上修改,基本上我想要的功能算是全了。

    上面的代码分析,其实我在做的时候主要使用的还是IDA Pro,通过IDA Pro反汇编出来的代码还是比OD方面看多了。不过使用IDA Pro,不太好查找UNICODE字符串参考,所以辅助使用了OD。

     这里有个疑问,还请知道的认识颠簸。通过如上分析我们知道打印的时候使用了fpmvpr_drv.dll,也就是说fpmvpr_drv.dll存在于你用于打印的程序空间中,那么如何才能用OD动态调试fpmvpr_drv.dll能,我在破解的时候发现,只要一用OD附加,再执行打印,OD就直接死了。各位有办法的话,请指教一二,谢谢。

     这段时间的使用,发现Foxit Phantom真的是很好用,比Adobe Reader要小,要快同时可编辑pdf稳当,支持多种格式到pdf的转换,作为一般用户,有这个软件,处理阅读pdf文档的确足够。

我这里有全部修改的破解文件,有需要的可以E-mail我,其实看了上面的解释,改动也不多,只有两个文件共4处补丁。

继续阅读