【破解作者】 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文档一个工具就搞定了。
CENTER]
这时,如果你直接点击转换按钮,还是会出现天数限制对话框,30天的限制时间后你就不能再用了。
过期后,word中的这个工具栏也就自动卸载了。也就是说仅仅对Foxit Phantom主程序做如上的修改并不是很完善。
既然提供了文档转换功能,那按经验,肯定是在系统中安装了虚拟的pdf打印机。我的电脑->控制面板->打印机和传真,果然我的打印机设置页面多了个Foxit Phantom Printer打印机:
为了找出Foxit Phantom安装的虚拟驱动,我随便新建了个test.txt文档,用notepad打开并打印,这时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处补丁。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)