• 标 题:胡乱说说pj棣南文电通(简体中文4.80) -:) (7千字)
  • 作 者:henryw
  • 时 间:2002-2-2 13:00:18
  • 链 接:http://bbs.pediy.com

软件名称:棣南文电通(简体中文4.80)
下载:www.zeon.com.tw
工具:Dasm, softice, regmon, filemon

几个月没破解了,此次放假,看到这个软件不错,就试着破了一下。不过刚开始解的是5.0英文版,回来再看4.80的中文版就不太认真了,可能会有错误之处。

不知道诸位有没有想过自己做pdf文档。当然,使用adobe的pdf driver非常正宗,不过,不容易找到它。还有很多其他的用来做pdf的驱动,比如easy pdf之类的,说是苗条,可也在3兆左右。还有一点就是这些驱动很少支持中文。其实只有这个台湾人开发的pdf驱动最最苗条,不到2兆,自然也能支持我们的简体汉字。只要在word中写好东东,不管是不是带表格或者图片,或者文字颜色,转换一下,就成了pdf文件了,非常不错,至少我如此认为。

闲言少叙,进入正题。

下载软件的时候可以看到它说的注册方法。大意是说注册后有个启动全部功能的程序会发给你,给人的感觉好像是个打开交验的补丁。观察一下,每次打印的时候,会跳出一个对话框,告诉你现在你用的是trial版本,来买正式版吧,不然给你颜色看。果然,每个打印出来的文件都有水印,不忘提醒你现在是trial version和网站地址。好了,来试着去掉水印吧。

经过filemon查找,发现程序需要pdfdrv95.drv, zn32.dll, znsl.dll等文件,这是三个破解时较重要的文件。全部反汇编。pdfdrv95.drv是个NE的文件,我这等菜鸟脑袋开始有些大了。看看znsl.dll文件里面,有个注册表的东东很有意思,local\software\zeon\znsl,管他呢,先写到注册表里面再说。

<== 第一部分:去掉水印 ==>
--------------------------

然后经过多次试验,发现zn32.dll中个输出函数MyGetSecurity可以在提醒窗体前被拦住:
(拦不住可能和没有在注册表中写入local\software\zeon\znsl有关?)
======================================================
Exported fn(): MyGetSecurity - Ord:0027h  <-----  (zn32.dll)
:1000AB90 55                      push ebp
:1000AB91 8BEC                    mov ebp, esp
...
...
...
* Reference To: KERNEL32.GetProcAddress, Ord:0153h
                                  |
:1000ABE3 FF1550D30510            Call dword ptr [1005D350]
:1000ABE9 8985F8FEFFFF            mov dword ptr [ebp+FFFFFEF8], eax
:1000ABEF 6820700710              push 10077020
:1000ABF4 E827030000              call 1000AF20
:1000ABF9 83C404                  add esp, 00000004
:1000ABFC 85C0                    test eax, eax
:1000ABFE 7417                    je 1000AC17
:1000AC00 8D8510FEFFFF            lea eax, dword ptr [ebp+FFFFFE10]
:1000AC06 50                      push eax
:1000AC07 6820700710              push 10077020
:1000AC0C FF95F8FEFFFF            call dword ptr [ebp+FFFFFEF8]  <--- 调用znsl.dll中的CheckBuy函数。
:1000AC12 83C408                  add esp, 00000008
:1000AC15 EB1B                    jmp 1000AC32

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000ABFE(C)
|
:1000AC17 8B8DFCFEFFFF            mov ecx, dword ptr [ebp+FFFFFEFC]
:1000AC1D 51                      push ecx

* Reference To: KERNEL32.FreeLibrary, Ord:00C3h
                                  |
:1000AC1E FF15D8D10510            Call dword ptr [1005D1D8]
:1000AC24 8B5514                  mov edx, dword ptr [ebp+14]
:1000AC27 C70201000000            mov dword ptr [edx], 00000001  <--- 确定dx的值,想没有水印必须为0,edx+2的地方必须为1。
:1000AC2D E9AC000000              jmp 1000ACDE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000AC15(U)
|
:1000AC32 8B85FCFEFFFF            mov eax, dword ptr [ebp+FFFFFEFC]
:1000AC38 50                      push eax

* Reference To: KERNEL32.FreeLibrary, Ord:00C3h
                                  |
:1000AC39 FF15D8D10510            Call dword ptr [1005D1D8]
...
...
...
:1000ACD6 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01C3h
                                  |
:1000ACD8 FF15E4D40510            Call dword ptr [1005D4E4]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000AC2D(U), :1000AC79(U), :1000AC84(U), :1000AC8F(U), :1000AC9A(U)
|:1000ACA5(U), :1000ACB0(U), :1000ACBB(U), :1000ACC6(U), :1000ACC8(U)
|
:1000ACDE 5F                      pop edi
:1000ACDF 5E                      pop esi
:1000ACE0 5B                      pop ebx
:1000ACE1 8BE5                    mov esp, ebp
:1000ACE3 5D                      pop ebp
:1000ACE4 C21000                  ret 0010
=============================================================
这是上面函数返回后的代码:(pdfdrv95.drv)
============================================================
:0004.615F EB13                  jmp 6174    <---  返回这里

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0004.6136(C)
|
:0004.6161 6A00                  push 0000
:0004.6163 1E                    push ds
:0004.6164 FF36AC17              push word ptr [17AC]
:0004.6168 1E                    push ds
:0004.6169 FF36B417              push word ptr [17B4]
:0004.616D 6A00                  push 0000
:0004.616F 9A48620000            call USER.MESSAGEBOX

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0004.615F(U)
|
:0004.6174 8B46F6                mov ax, [bp-0A]    <---- 确定ax的值,必须为0.
:0004.6177 A38E17                mov word ptr [178E], ax               

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0004.610A(U), :0004.6116(U)
|
:0004.617A 8D66FE                lea sp, [bp-02]
:0004.617D 1F                    pop ds
:0004.617E 5D                    pop bp
:0004.617F 4D                    dec bp
:0004.6180 CB                    retf
====================================================================
这是是上述函数返回的地方。(pdfdrv95.drv)
===================================================================
:0006.0468 9AAA618E04            call 0004.61AA
:0006.046D 8946FA                mov [bp-06], ax  <------ 返回这里。ax必需为0,和前面dll中的值相对应。
:0006.0470 8956FC                mov [bp-04], dx  <---------------  dx必需为1,
:0006.0473 68B704                push SEG ADDR of Segment 0041
:0006.0476 685E05                push 055E
:0006.0479 1E                    push ds
======================================================================
这样的话程序认为已经注册,trial水印便没有了。但这仅限于编辑软件启动后没有更换壁纸的打印,如果临时更换的话,可能会有些问题,所以,需要注意的是找到合适的相对位置,写入自己的代码。

改法就不多写了,我是在zn32.dll文件1000AC27处写入自己的代码,使得edx和edx+2处设置正确值。

现在还有过期问题:
===================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0004.61EB(U)
|
:0004.61DD 99                    cwd
:0004.61DE E9D000                jmp 62B1

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0004.61C1(C), :0004.61CC(C), :0004.61D8(C)
|
:0004.61E1 833E8E177F            cmp word ptr [178E], 007F
:0004.61E6 7405                  je 61ED      <-----  这里必须跳,才能不过期。
:0004.61E8 A18E17                mov ax, word ptr [178E]
:0004.61EB EBF0                  jmp 61DD

对于那个checkbuy的东东,好像注册的内容是以blowfish加密的,俺知难而退,哪位大侠有兴趣帮着看看。

不管是5.0英文版还是4.80中文版,[bp-0A]和[bp-08]处的值和zn32.dll的GetMySecurity函数需要注意,就不难破解了。看到国外有4.80的破解patch,不过是给英文版的,所以不知道它补丁的是哪些文件,或许只有pdfdrv95.drv一个,不过由于我对ne的东东实在不了解,不敢在里面妄动,还是改改32位的dll比较容易。