搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程

去除pdf文件“打印”“拷贝”限制

acrobat reader 5.1中文版+windows2000 sp0+softice
网上下载的pdf文件经常打开后只能阅读,不能打印、拷贝等功能,前几天幸好有一个这样的文件急需打印,破解过程如下:
1。打开softice;
2。打开acrobat reader,打开要阅读的文件;
3。ctrl+d调出softice,下断bpx enablemenuitem
4。在reader中点击菜单file;
5。f12三次,往回找可以看到以下代码;
:00414e71 55           push ebp
:00414e72 8bec          mov ebp, esp
:00414e74 a130f17400       mov eax, dword ptr [0074f130]
:00414e79 56           push esi
:00414e7a 8bf1          mov esi, ecx
:00414e7c 8b8818020000      mov ecx, dword ptr [eax+00000218]
:00414e82 85c9          test ecx, ecx
:00414e84 741a          je 00414ea0
:00414e86 ff7514         push [ebp+14]
:00414e89 8b01          mov eax, dword ptr [ecx]
:00414e8b ff7510         push [ebp+10]
:00414e8e ff750c         push [ebp+0c]
:00414e91 ff7508         push [ebp+08]6。清除所有断点,然后在此下断,f5执行,可以看到push的内容,其是菜单的id号,执行多次,一直到push 1784(print。。。的id号)
:00414e94 ff500c         call [eax+0c]7。进入该调用,将进入如下的程序。
-----------------------------------------------------------------
:00411233 55           push ebp
:00411234 8bec          mov ebp, esp
:00411236 8d4508         lea eax, dword ptr [ebp+08]
:00411239 56           push esi
:0041123a 50           push eax
:0041123b 83c138         add ecx, 00000038
:0041123e ff7508         push [ebp+08]
:00411241 e853450000       call 004157998。该程序得到reader每个菜单的属性表(权且先这么命名)

仔细分析程序415799可以得到acrobat reader中很重要的数据结构。acrobat reader中将所有的菜单分为11个组,即
menugroup *menugrouparray[11];针对不同的菜单项具体在哪个组中可以通过id号来计算。menugroupno=(id>>4) mod 11;

而menugroup是一个链表:
struct menugroup{
menugroup * prevmenugroup;
dword menugroupno;
dword menuid;
menuattribute * menuattrptr;
}
知道了某个菜单的id号,最重要的数据是menuattrptr,知道了这个值就可以找到每个菜单项对应的属性以及该菜单对应的执行程序。

:00411246 8bf0          mov esi, eaxesi=*menuattrptr
:00411248 f7de          neg esi
:0041124a 1bf6          sbb esi, esi
:0041124c 237508         and esi, dword ptr [ebp+08]
:0041124f 85f6          test esi, esi
:00411251 7440          je 00411293
:00411253 57           push edi
:00411254 8b7d10         mov edi, dword ptr [ebp+10]
:00411257 85ff          test edi, edi
:00411259 742b          je 00411286
:0041125b 53           push ebx
:0041125c 8b1f          mov ebx, dword ptr [edi]
:0041125e 56           push esi;esi=*menuattrptr
:0041125f e8387a0700       call 00488c9c9。该程序的调用返回结果直接影响下面的enablemenuitem,跟进去;
:00411264 0fb7c0         movzx eax, ax
:00411267 59           pop ecx
:00411268 50           push eax
:00411269 8bcf          mov ecx, edi
:0041126b ff13          call dword ptr [ebx]10。enablemenuitem在该程序中调用。
:0041126d 8b1f          mov ebx, dword ptr [edi]
:0041126f 56           push esi
:00411270 e8c07a0700       call 00488d35
:00411275 66f7d8         neg ax
:00411278 1bc0          sbb eax, eax
:0041127a 59           pop ecx
:0041127b f7d8          neg eax
:0041127d 50           push eax
:0041127e 8bcf          mov ecx, edi
:00411280 ff5304         call [ebx+04]
:00411283 5b           pop ebx
:00411284 eb07          jmp 0041128d
------------------------------------------------------------------
:00488c9c b890c36900       mov eax, 0069c390
:00488ca1 e8dafdfdff       call 00468a80;加入seh例外处理
:00488ca6 83ec18         sub esp, 00000018
:00488ca9 53           push ebx
:00488caa 56           push esi
:00488cab 8b7508         mov esi, dword ptr [ebp+08]
:00488cae 57           push edi
:00488caf 33ff          xor edi, edi
:00488cb1 8965f0          push 00000001
:00488cc2 5b           pop ebx
:00488cc3 895d08         mov dword ptr [ebp+08], ebx
:00488cc6 7450          je 00488d18
:00488cc8 57           push edi
:00488cc9 e8ece4ffff       call 004871ba
:00488cce 6685c0         test ax, ax
:00488cd1 59           pop ecx
:00488cd2 7544          jne 00488d18
:00488cd4 53           push ebx
:00488cd5 e830e5ffff       call 0048720a
:00488cda 59           pop ecx
:00488cdb 897dfc         mov dword ptr [ebp-04], edi
:00488cde e8ff141700       call 005fa1e2
:00488ce3 8945ec         mov dword ptr [ebp-14], eax
:00488ce6 8b08          mov ecx, dword ptr [eax]
:00488ce8 894de4         mov dword ptr [ebp-1c], ecx
:00488ceb 8d4de4         lea ecx, dword ptr [ebp-1c]
:00488cee 8908          mov dword ptr [eax], ecx
:00488cf0 c745e8c3a15f00     mov [ebp-18], 005fa1c3
:00488cf7 ff7634         push [esi+34]
:00488cfa 885dfc         mov byte ptr [ebp-04], bl
:00488cfd ff5630         call [esi+30]11.*(*menuattrptr+30)对应不同菜单项的可执行程序,call 49f7c4
------------------------------------------------------------------------------

:0049f7c4 56           push esi
:0049f7c5 ff742408        push [esp+08]
:0049f7c9 e8b6f4ffff       call 0049ec84
:0049f7ce 8bf0          mov esi, eax
:0049f7d0 59           pop ecx
:0049f7d1 85f6          test esi, esi
:0049f7d3 7429          je 0049f7fe
:0049f7d5 6a0a          push 0000000a
:0049f7d7 6a01          push 00000001
:0049f759 5b           push esi
:0049f7da e8bfeefdff       call 0047e69e12.跟进去。
:0049f7df 83c40c         add esp, 0000000c
:0049f7e2 6685c0         test ax, ax
:0049f7e5 7512          jne 0049f7f9
:0049f7e7 6a0b          push 0000000b
:0049f7e9 6a01          push 00000001
:0049f7eb 56           push esi
:0049f7ec e8adeefdff       call 0047e69e
:0049f7f1 83c40c         add esp, 0000000c
:0049f7f4 6685c0         test ax, ax
:0049f7f7 7405          je 0049f7fe
--------------------------------------------------------------------
:0047e69e 53           push ebx
:0047e69f 8b5c2410        mov ebx, dword ptr [esp+10];0a
:0047e6a3 56           push esi
:0047e6a4 8b74240c        mov esi, dword ptr [esp+0c];*menuattrptr
:0047e6a8 57           push edi
:0047e6a9 8b7c2414        mov edi, dword ptr [esp+14];01
:0047e6ad 83ff01         cmp edi, 00000001
:0047e6b0 7523          jne 0047e6d5
:0047e6b2 83fb13         cmp ebx, 00000013
:0047e6b5 751e          jne 0047e6d513.跳转
:0047e6b7 85f6          test esi, esi
:0047e6b9 7504          jne 0047e6bf
:0047e6bb 33c0          xor eax, eax
:0047e6bd eb03          jmp 0047e6c2

* referenced by a (u)nconditional or (c)onditional jump at address:
:0047e6b9(c)

:0047e6bf 8b4650         mov eax, dword ptr [esi+50]

* referenced by a (u)nconditional or (c)onditional jump at address:
:0047e6bd(u)

:0047e6c2 50           push eax
:0047e6c3 e884cf0600       call 004eb64c
:0047e6c8 50           push eax
:0047e6c9 e8984e0900       call 00513566
:0047e6ce 59           pop ecx
:0047e6cf 6685c0         test ax, ax
:0047e6d2 59           pop ecx
:0047e6d3 7463          je 0047e738

* referenced by a (u)nconditional or (c)onditional jump at addresses:
:0047e6b0(c), :0047e6b5(c)

:0047e6d5 56           push esi;esi=*menuattrptr
:0047e6d6 e874ffffff       call 0047e64f
:0047e6db 6685c0         test ax, ax
:0047e6de 59           pop ecx
:0047e6df 7429          je 0047e70a;跳转
:0047e6e1 83ff01         cmp edi, 00000001
:0047e6e4 7415          je 0047e6fb
:0047e6e6 83ff02         cmp edi, 00000002
:0047e6e9 7409          je 0047e6f4
:0047e6eb 761d          jbe 0047e70a
:0047e6ed 83ff08         cmp edi, 00000008
:0047e6f0 7718          ja 0047e70a
:0047e6f2 eb44          jmp 0047e738

* referenced by a (u)nconditional or (c)onditional jump at address:
:0047e6e9(c)

:0047e6f4 83fb05         cmp ebx, 00000005
:0047e6f7 7411          je 0047e70a
:0047e6f9 eb3d          jmp 0047e738

* referenced by a (u)nconditional or (c)onditional jump at address:
:0047e6e4(c)

:0047e6fb 83fb04         cmp ebx, 00000004
:0047e6fe 7438          je 0047e738
:0047e700 83fb14         cmp ebx, 00000014
:0047e703 7433          je 0047e738
:0047e705 83fb09         cmp ebx, 00000009
:0047e708 742e          je 0047e738

* referenced by a (u)nconditional or (c)onditional jump at addresses:
:0047e6df(c), :0047e6eb(c), :0047e6f0(c), :0047e6f7(c)

:0047e70a 8d4610         lea eax, dword ptr [esi+10];menuattrptr+10
:0047e70d 85c0          test eax, eax
:0047e70f 742c          je 0047e73d
:0047e711 8b08          mov ecx, dword ptr [eax]
:0047e713 83f938         cmp ecx, 00000038
:0047e716 7625          jbe 0047e73d;跳转
:0047e718 6683783800       cmp word ptr [eax+38], 0000
:0047e71d 741e          je 0047e73d
:0047e71f 83f93c         cmp ecx, 0000003c
:0047e722 7619          jbe 0047e73d
:0047e724 8b403c         mov eax, dword ptr [eax+3c]
:0047e727 85c0          test eax, eax
:0047e729 7412          je 0047e73d
:0047e72b 53           push ebx
:0047e72c 57           push edi
:0047e72d 56           push esi
:0047e72e ffd0          call eax
:0047e730 83c40c         add esp, 0000000c
:0047e733 6685c0         test ax, ax
:0047e736 7405          je 0047e73d

* referenced by a (u)nconditional or (c)onditional jump at addresses:
:0047e6d3(c), :0047e6f2(u), :0047e6f9(u), :0047e6fe(c), :0047e703(c)
:0047e708(c)

:0047e738 6633c0         xor ax, ax
:0047e73b eb1e          jmp 0047e75b

* referenced by a (u)nconditional or (c)onditional jump at addresses:
:0047e70f(c), :0047e716(c), :0047e71d(c), :0047e722(c), :0047e729(c)
:0047e736(c)

:0047e73d 85f6          test esi, esi
:0047e73f 7504          jne 0047e745;跳转
:0047e741 33c0          xor eax, eax
:0047e743 eb03          jmp 0047e748

* referenced by a (u)nconditional or (c)onditional jump at address:
:0047e73f(c)

:0047e745 8b4650         mov eax, dword ptr [esi+50]

* referenced by a (u)nconditional or (c)onditional jump at address:
:0047e743(u)

:0047e748 6a00          push 00000000
:0047e74a 53           push ebx
:0047e74b 57           push edi
:0047e74c 50           push eax
:0047e74d e842eb0a00       call 0052d294;14。跟进此程序
:0047e752 83c410         add esp, 00000010

:0052d294 55           push ebp
:0052d295 8bec          mov ebp, esp
:0052d297 53           push ebx
:0052d298 56           push esi
:0052d299 57           push edi
:0052d29a 8b7d08         mov edi, dword ptr [ebp+08];*menuattrptr
:0052d29d 85ff          test edi, edi
:0052d29f 7508          jne 0052d2a9

* referenced by a (u)nconditional or (c)onditional jump at address:
:0052d3db(c)

:0052d2a1 6633c0         xor ax, ax
:0052d2a4 e943010000       jmp 0052d3ec

* referenced by a (u)nconditional or (c)onditional jump at address:
:0052d29f(c)

:0052d2a9 8b4770         mov eax, dword ptr [edi+70];15。菜单的属性,如果可以打印此处将是0。
:0052d2ac 85c0          test eax, eax
:0052d2ae 7405          je 0052d2b5
:0052d2b0 8b5808         mov ebx, dword ptr [eax+08]
:0052d2b3 eb02          jmp 0052d2b7

修改程序,ultraedit打开程序acro32。exe,查找8b477085c074058b5808,将8b4770改成33c090,(xor eax,eax;nop;)
存盘,退出。
运行改过的acro32.exe
打开有打印限制的文件,此时打印菜单已经可以点击。在文本中选择,右键点击,可以看到“复制、全选”都可用。
时间关系写的简单,凑合看。

()

相关文章:
© 2006   www.java-asp.net