【破解作者】solo_lxy
【使用工具】OD,IDA Pro
【软件名称】 FoxitPhantom 1.0.2.1123
【软件简介】FoxitPhantom是一个商业级的PDF应用软件,是一个集创建,阅读和编辑PDF为一体的新工具.
【下载地址】 http://www.skycn.com/soft/57351.html
【破解声明】 只是感兴趣,没有其他目的。失误之处敬请赐教!

    论坛上TopmenC的一篇关于《Foxit Phantom的完美破解》(http://bbs.pediy.com/showthread.php?t=102691)对FoxitPhantom 1.0.2.1123的破解给我们提供了重要的线索。其中最关键的地方就是在0044DB23位置处将jnz修改为如下:
0044DB23   . /E9 89020000   jmp     0044DDB1
0044DB28     |90            nop
原来的jnz指令占6个字节,改后分解为两个指令,在OD中这个改变自动完成,我们只需要按空格键,将jnz该为jmp即可。这样整个软件基本上绝大部分功能都能用了,真的很好用。不过,我还是在使用的过程中发现了有个小瑕疵。
  安装完FoxitPhantom 1.0.2.1123后,如果你系统中安装了Office Word,它会自动地在word中添加一个工具栏,通过这个工具栏我们可以直接将word文档转换成pdf格式。以前为了使用这个功能,我好象是要下载安装一个忘了叫什么名字的驱动,现在好了只要安装了FoxitPhantom,阅读、编辑、转换pdf文档一个工具就搞定了。
[CENTER]CENTER]

这时,如果你直接点击转换按钮,还是会出现天数限制对话框,30天的限制时间后你就不能再用了。
  过期后,word中的这个工具栏也就自动卸载了。也就是说仅仅对FoxitPhantom主程序做如上的修改并不是很完善。
  既然提供了文档转换功能,那按经验,肯定是在系统中安装了虚拟的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处补丁。