Squn 发表于 2009-1-21 19:08

五步暴力拆解Word to PDF(去NAG+去时间限制+去水印...)

【作者主页】: Word to PDF 破解,注册码,算法,注册机,绿化
【软件名称】: Word to PDF 6.0
【下载地址】: http://www.skycn.com/soft/44098.html
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
软件介绍: Word to PDF 是一个易用和强大的PDF转换器。
你能转换MS Word, RTF, HTML, Htm, XML, TEXT,CSS 和 IMAGES到PDF. Word to PDF(DOC), Word to PDF(RTF),Word to PDF Converter, Html to PDF(Html,Htm), XML TO PDF(Xml), Text to PDF(Txt), CSS to PDF(Css), PNG to PDF, Jpg to PDF, Jpeg to PDF, Bmp to PDF, Gif to PDF

运行软件后发现,这是一个 试用软件,根本没有提示输入用户名和注册码的地方,我晕,算法分析无门 ~_-!!! 由于这软件太好用了,准备暴力拆解,看能不能把它变相为无功能限制的免费版。后来发现了可行性,必须要突破其各种限制了。
我们需要解决的问题有
1、脱壳
2、去注册NAG
3、去时间限制
4、去未注册字符
5、去水印限制
挺繁琐的,但也非常有趣,需要准备的工具有PEdi, DEDE, OD, C32ASM,PE Explorer等,开工!

=================== 第一步:脱壳 ==================

这一步非常简单,ASPack 2.12 -> Alexey Solodovnikov 压缩壳,想怎么脱就怎么脱。

=================== 第二步:去注册NAG =============

每次启动都会先出现一个Splash窗口,然后再出现一个提示注册购买的NAG窗口,必须点Try Now才能进行,非常不方便, 需要把NAG窗口干掉。
思路很多,可以通过DEDE查得 Try Now窗口的事件,在NAG窗口未来得及显示时就跳到Try Now事件,即马上显示主窗口。 于是DEDE载入主程序,在“过程”选项卡中看到几个单元名:welcome,就是所谓的NAG窗口了。其中对应有一个 FormShow事件,对应RAV是004DB63C,到OD里下断看看是干什么的。
F9运行在未显示NAG前就被断下了,哈哈,成功在即!马上 Ctrl+F9并单步跳出这个过程,来到以下过程:

00477838   . C3            RETN
00477839      8D40 00       LEA EAX,DWORD PTR DS:
0047783C   . 53            PUSH EBX
0047783D   . 66:83B8 CA020>CMP WORD PTR DS:,0
00477845      74 10         JE SHORT WordToPD.00477857               ; 此处改为JMP,可以跳过FormShow事件
00477847   . 8BD8          MOV EBX,EAX
00477849   . 8BD0          MOV EDX,EAX
0047784B   . 8B83 CC020000 MOV EAX,DWORD PTR DS:
00477851   . FF93 C8020000 CALL DWORD PTR DS:            ; //FormShow事件
00477857   > 5B            POP EBX                                  ; 0012F988
00477858   . C3            RETN

明显FormShow事件上面有一个跳转可以跳过这个事件
00477845      74 10         JE SHORT WordToPD.00477857
把JE改成JMP,保存,就可以实现把不显示NAG窗口了。

=================== 第三步:去时间限制 =============

程序运行后发现主窗口标题栏有“……UnRegistered (6 days remaining)”等字样,明显是利用了时间比较来
计算使用天数。这里有两种可能。
一种是同时获得系统当前时间 和 自身文件时间,进行相减运算得出使用天数
另一种是同可能把程序安装时的时间保存在某文件或注册表中,然后用当前时间减去它就得出已使用天数。
但无论用哪种方法,到达这个算法过程最简便的方法是 查ASCII “days remaining”字样,定位到

004DCE80 /$ 55            PUSH EBP                                 ; 使用天数计算过程
004DCE81 |. 8BEC          MOV EBP,ESP
004DCE83 |. 81C4 CCFEFFFF ADD ESP,-134
004DCE89 |. 53            PUSH EBX
004DCE8A |. 56            PUSH ESI
004DCE8B |. 57            PUSH EDI
004DCE8C |. 33C9          XOR ECX,ECX
004DCE8E |. 898D CCFEFFFF MOV DWORD PTR SS:,ECX
004DCE94 |. 898D D0FEFFFF MOV DWORD PTR SS:,ECX
004DCE9A |. 898D D4FEFFFF MOV DWORD PTR SS:,ECX
004DCEA0 |. 894D FC       MOV DWORD PTR SS:,ECX
004DCEA3 |. 894D F8       MOV DWORD PTR SS:,ECX
004DCEA6 |. 8BD8          MOV EBX,EAX
004DCEA8 |. 33C0          XOR EAX,EAX
004DCEAA |. 55            PUSH EBP
004DCEAB |. 68 67D04D00   PUSH 去NAG.004DD067
004DCEB0 |. 64:FF30       PUSH DWORD PTR FS:
004DCEB3 |. 64:8920       MOV DWORD PTR FS:,ESP
004DCEB6 |. 68 FF000000   PUSH 0FF                                 ; /BufSize = FF (255.)
004DCEBB |. 8D85 D9FEFFFF LEA EAX,DWORD PTR SS:         ; |
004DCEC1 |. 50            PUSH EAX                                 ; |Buffer
004DCEC2 |. E8 E99DF2FF   CALL <JMP.&kernel32.GetSystemDirectoryA> ; \GetSystemDirectoryA
004DCEC7 |. 8D95 D4FEFFFF LEA EDX,DWORD PTR SS:
004DCECD |. 8D85 D9FEFFFF LEA EAX,DWORD PTR SS:
004DCED3 |. E8 34CAF2FF   CALL 去NAG.0040990C
004DCED8 |. 8B95 D4FEFFFF MOV EDX,DWORD PTR SS:
004DCEDE |. 8D45 F8       LEA EAX,DWORD PTR SS:
004DCEE1 |. B9 80D04D00   MOV ECX,去NAG.004DD080                  ; \
004DCEE6 |. E8 6979F2FF   CALL 去NAG.00404854
004DCEEB |. 8D45 F8       LEA EAX,DWORD PTR SS:
004DCEEE |. BA 8CD04D00   MOV EDX,去NAG.004DD08C                  ; wordwinf20.dll
004DCEF3 |. E8 1879F2FF   CALL 去NAG.00404810                     ; 合并生成路径C:\WINDOWS\system32\wordwinf20.dll
004DCEF8 |. 8B45 F8       MOV EAX,DWORD PTR SS:
004DCEFB |. E8 54C5F2FF   CALL 去NAG.00409454                     ; 读取wordwinf20.dll的创建时间
004DCF00 |. 84C0          TEST AL,AL
004DCF02 |. 74 79         JE SHORT 去NAG.004DCF7D
004DCF04 |. 6A 02         PUSH 2                                 ; /Arg1 = 00000002
004DCF06 |. 8B4D F8       MOV ECX,DWORD PTR SS:             ; |
004DCF09 |. B2 01         MOV DL,1                                 ; |
004DCF0B |. A1 38AC4100   MOV EAX,DWORD PTR DS:            ; |
004DCF10 |. E8 6B2BF4FF   CALL 去NAG.0041FA80                     ; \去NAG.0041FA80
004DCF15 |. 8BF0          MOV ESI,EAX
004DCF17 |. 8BC6          MOV EAX,ESI
004DCF19 |. 8B10          MOV EDX,DWORD PTR DS:
004DCF1B |. FF12          CALL DWORD PTR DS:                  ; 读取wordwinf20.dll文件的大小
004DCF1D |. 83FA 00       CMP EDX,0                              ; 是空吗?
004DCF20 |. 75 4C         JNZ SHORT 去NAG.004DCF6E                  ; 是空则重新创建
004DCF22 |. 83F8 1F       CMP EAX,1F                               ; 是$1F吗?($1F是wordwinf20.dll创建时的大小)
004DCF25 |. 75 47         JNZ SHORT 去NAG.004DCF6E                  ; 不相等则重新创建
004DCF27 |. 8D8D D0FEFFFF LEA ECX,DWORD PTR SS:
004DCF2D |. BA 64AD0C00   MOV EDX,0CAD64
004DCF32 |. 8BC3          MOV EAX,EBX
004DCF34 |. E8 B7FAFFFF   CALL 去NAG.004DC9F0
004DCF39 |. 8B85 D0FEFFFF MOV EAX,DWORD PTR SS:
004DCF3F |. BA A4D04D00   MOV EDX,去NAG.004DD0A4                  ; 77
004DCF44 |. E8 0B7AF2FF   CALL 去NAG.00404954
004DCF49 |. 75 12         JNZ SHORT 去NAG.004DCF5D
004DCF4B |. 8D45 FC       LEA EAX,DWORD PTR SS:
004DCF4E |. BA B0D04D00   MOV EDX,去NAG.004DD0B0                  ; 7
004DCF53 |. E8 8876F2FF   CALL 去NAG.004045E0
004DCF58 |. E9 86000000   JMP 去NAG.004DCFE3
004DCF5D |> 8D4D FC       LEA ECX,DWORD PTR SS:
004DCF60 |. BA 64AD0C00   MOV EDX,0CAD64
004DCF65 |. 8BC3          MOV EAX,EBX
004DCF67 |. E8 30F8FFFF   CALL 去NAG.004DC79C
004DCF6C |. EB 75         JMP SHORT 去NAG.004DCFE3
004DCF6E |> 8D45 FC       LEA EAX,DWORD PTR SS:
004DCF71 |. BA B0D04D00   MOV EDX,去NAG.004DD0B0                  ; 7
004DCF76 |. E8 6576F2FF   CALL 去NAG.004045E0
004DCF7B |. EB 66         JMP SHORT 去NAG.004DCFE3
004DCF7D |> BE B4D04D00   MOV ESI,去NAG.004DD0B4                  ; 01000011010111011010101111010
004DCF82 |. 8D7D D9       LEA EDI,DWORD PTR SS:
004DCF85 |. B9 07000000   MOV ECX,7
004DCF8A |. F3:A5         REP MOVS DWORD PTR ES:,DWORD PTR DS>
004DCF8C |. 66:A5         MOVS WORD PTR ES:,WORD PTR DS:
004DCF8E |. A4            MOVS BYTE PTR ES:,BYTE PTR DS:
004DCF8F |. B2 01         MOV DL,1
004DCF91 |. A1 28AD4100   MOV EAX,DWORD PTR DS:
004DCF96 |. E8 4967F2FF   CALL 去NAG.004036E4
004DCF9B |. 8BF0          MOV ESI,EAX
004DCF9D |. 6A 00         PUSH 0                                 ; /Arg2 = 00000000
004DCF9F |. 6A 00         PUSH 0                                 ; |Arg1 = 00000000
004DCFA1 |. 8BC6          MOV EAX,ESI                              ; |
004DCFA3 |. E8 E025F4FF   CALL 去NAG.0041F588                     ; \去NAG.0041F588
004DCFA8 |. 8D55 D9       LEA EDX,DWORD PTR SS:
004DCFAB |. B9 1F000000   MOV ECX,1F
004DCFB0 |. 8BC6          MOV EAX,ESI
004DCFB2 |. 8B38          MOV EDI,DWORD PTR DS:
004DCFB4 |. FF57 10       CALL DWORD PTR DS:
004DCFB7 |. 8B55 F8       MOV EDX,DWORD PTR SS:
004DCFBA |. 8BC6          MOV EAX,ESI
004DCFBC |. E8 072DF4FF   CALL 去NAG.0041FCC8
004DCFC1 |. 8BC6          MOV EAX,ESI
004DCFC3 |. E8 4C67F2FF   CALL 去NAG.00403714
004DCFC8 |. BA 64AD0C00   MOV EDX,0CAD64
004DCFCD |. 8BC3          MOV EAX,EBX
004DCFCF |. E8 CCFCFFFF   CALL 去NAG.004DCCA0
004DCFD4 |. 8D4D FC       LEA ECX,DWORD PTR SS:
004DCFD7 |. BA 64AD0C00   MOV EDX,0CAD64
004DCFDC |. 8BC3          MOV EAX,EBX
004DCFDE |. E8 B9F7FFFF   CALL 去NAG.004DC79C
004DCFE3 |> 8B45 FC       MOV EAX,DWORD PTR SS:
004DCFE6 |. E8 B9BFF2FF   CALL 去NAG.00408FA4                     ; EAX返回已经使用的天数
004DCFEB |. BA 07000000   MOV EDX,7                              ; 最多能使用7天,我靠,太少了吧??
004DCFF0 |. 2BD0          SUB EDX,EAX                              ; 7 减去 已使用的天数,为剩余可用天数
004DCFF2 |. 8993 CC030000 MOV DWORD PTR DS:,EDX
004DCFF8 |. 8BB3 CC030000 MOV ESI,DWORD PTR DS:
004DCFFE |. 83FE 07       CMP ESI,7                              ; 剩余天数和7比较,如果小于等于0则提示expiered
004DD001 |. 7D 04         JGE SHORT 去NAG.004DD007
004DD003 |. 85F6          TEST ESI,ESI
004DD005 |. 7F 12         JG SHORT 去NAG.004DD019
004DD007 |> 8D83 C8030000 LEA EAX,DWORD PTR DS:
004DD00D |. BA DCD04D00   MOV EDX,去NAG.004DD0DC                  ;   your 7-day trial period has expired!
004DD012 |. E8 8575F2FF   CALL 去NAG.0040459C
004DD017 |. EB 23         JMP SHORT 去NAG.004DD03C
004DD019 |> 8D95 CCFEFFFF LEA EDX,DWORD PTR SS:
004DD01F |. 8BC6          MOV EAX,ESI
004DD021 |. E8 42BEF2FF   CALL 去NAG.00408E68
004DD026 |. 8B95 CCFEFFFF MOV EDX,DWORD PTR SS:
004DD02C |. 8D83 C8030000 LEA EAX,DWORD PTR DS:
004DD032 |. B9 0CD14D00   MOV ECX,去NAG.004DD10C                  ;   days remaining
004DD037 |. E8 1878F2FF   CALL 去NAG.00404854
004DD03C |> 33C0          XOR EAX,EAX
004DD03E |. 5A            POP EDX
004DD03F |. 59            POP ECX
004DD040 |. 59            POP ECX
004DD041 |. 64:8910       MOV DWORD PTR FS:,EDX
004DD044 |. 68 6ED04D00   PUSH 去NAG.004DD06E
004DD049 |> 8D85 CCFEFFFF LEA EAX,DWORD PTR SS:
004DD04F |. BA 03000000   MOV EDX,3
004DD054 |. E8 1375F2FF   CALL 去NAG.0040456C
004DD059 |. 8D45 F8       LEA EAX,DWORD PTR SS:
004DD05C |. BA 02000000   MOV EDX,2
004DD061 |. E8 0675F2FF   CALL 去NAG.0040456C
004DD066 \. C3            RETN

Delphi程序反汇编出来的程序就是简洁明了,比VB程序容易理解多啦 ~~~ I Love Delphi!!
明显程序是通过读取系统目录下一个叫wordwinf20.dll的文件的创建时间,调用了
<JMP.&kernel32.FileTimeToLocalFileTime>
<JMP.&kernel32.FileTimeToDosDateTime>
<JMP.&kernel32.FileTimeToDosDateTime>
系列函数来计算出已经使用的天数。

现在问题是如果让程返回已使用的天数不能大于等于7就行了,这非常容易。看关键比较处:
004DCFE6 |. E8 B9BFF2FF   CALL 去NAG.00408FA4                     ; EAX返回已经使用的天数
004DCFEB |. BA 07000000   MOV EDX,7                              ; 最多能使用7天,我靠,太少了吧??
004DCFF0 |. 2BD0          SUB EDX,EAX                              ; 7 减去 已使用的天数,为剩余可用天数
004DCFF2 |. 8993 CC030000 MOV DWORD PTR DS:,EDX
004DCFF8 |. 8BB3 CC030000 MOV ESI,DWORD PTR DS:
004DCFFE |. 83FE 07       CMP ESI,7                              ; 剩余天数和7比较,如果小于等于0则提示expiered
004DD001 |. 7D 04         JGE SHORT 去NAG.004DD007
想办法实现在004DCFFE处ESI返回值小于7就行啦。 但不能在004DCFEB,004DCFF0 ,004DCFF2 或 004DCFF8 处修改,由于指令长度问题,会覆盖掉下面的代码。 最好的办法是在004DCFE6偏移处进入CALL 00408FA4 里面,直接给EAX返回一个使用天数,比如使用了1天吧。 进入CALL 00408FA4 后,马上修改前两行代码为,并返回
MOV EAX,1
RETN
修改后为:
00408FA4      B8 01000000   MOV EAX,1
00408FA9      C3            RETN
00408FAA      90            NOP
保存起来看看效果,把日期改成2010年看看有没有提示过期??
果然,仍然显示:6 days remaining..证明时限给搞定了。


=================== 第四步:去未注册字符 =============

我们目的是要变为破解免费版本,当然绝对不能出现类似“Unregistered”之类的讨厌字眼,必须把它去掉。 这个过程有做有汉化的朋友一定不陌生。可以用 UltraEdit 或 C32ASM 都可以。本人用 C32Asm,
打开后搜索“Unregistered”和“ days remaining”之类的字眼,替换成你想要的字符,比如“破解 by BeyondMe” 之类的,但保证长度是一致,否则会OVER的。替换时有几处,可以一次全部替换掉。这一步不啰嗦了。

===================== 第五步:去水印 ================

讲了这么多,这才是最重要,也是困难的一步了。由于这是个试用版,在生成PDF文件时,总会插入一个提示未注册 的背景图片,非常令人讨厌。如果这一步不搞定,前面做那么多都没有任何意义。
还是第一次弄水印,没有任何经验,但判断可能是用了某个图片文件作背景引入到生成的PDF文件中,因此可能用到 CreateFileA函数,看看有没有这样的图片文件。
在准备点 Convert 按钮进行转换前,OD下内存断点 bp CreateFileA,然后点转换,被断下了,然后观察 堆栈处 数据,留意文件名,结果终于露出马脚,在按下F9三次之后,堆栈处出现

0012E16C   011B236C /CALL 到 CreateFileA 来自 tx13_bmp.011B2366
0012E170   01111FD4 |FileName = "C:\WINDOWS\system32\worddf9.bmp"
0012E174   80000000 |Access = GENERIC_READ
0012E178   00000001 |ShareMode = FILE_SHARE_READ
0012E17C   00000000 |pSecurity = NULL
0012E180   00000003 |Mode = OPEN_EXISTING
0012E184   00000080 |Attributes = NORMAL
0012E188   00000000 \hTemplateFile = NULL

打开C:\WINDOWS\system32\worddf9.bmp看看,没错,就它了。
http://hiphotos.baidu.com/beyond0769/pic/item/f1fa742ade82c785023bf6ca.jpg

现在想办法能绕过它不让它添加到PDF文件里。但经过调试,发现似乎做不到,因为这个图片文件在程序关闭时会被删除。 然后程序开始运行时并没有生成,只是在点转换按钮时才临时生成,然后直接插入到PDF文件中,如果没有检测到该图片 文件,就会出现异常。看来作者是非要你去买它不可。一看 $29.25,上100块,买它才傻。不可能就此罢手。 忽然想到一个歪主意,既然不给我删除它的图片,我修改它不可以吗?把它变成一个完全白色背景的图片。马上mspaint 打开它处理一下保存。经过调试生成的文件果然看不到什么东东了,水印这样被变相解决掉。有点简单过头了。
但问题是程序在关闭时会删除它。这个也好办,把该图片设置成“只读”属性就OK了。这应该是软件作者没有考虑过的吧。 至此为止,这个试用版本的软件就被完全免费掉了,而且全功能无限制,清爽无障碍。有兴趣的朋友可以写一个文件型patch, 还要加入对图片的处理过程,文件的大小无限制,注意只读属性。文件分析至此为止,收工!

--------------------------------------------------------------------------------
【版权声明】: 本文原创于http://www.unpack.cn, 转载请注明作者并保持文章的完整, 谢谢!

这文章不错,就转啦过来哒~~

产地:http://hi.baidu.com/beyond0769/blog/item/53934bf82ec5ff08d8f9fd0d.html/cmtid/e2ad7ab42e486f7a8ad4b2e3#send

mycsy 发表于 2009-1-21 19:18

我晕 这么快 黄大牛的东西就转来了

shsww 发表于 2009-1-21 20:55

的确强悍啊!!学习。。。

Hmily 发表于 2009-1-21 23:46

这个去水印要好好学习下~

shin 发表于 2009-1-26 17:28

变相去水印 哈~~ 好思路~~

zjhero2006 发表于 2009-1-27 20:20

不错,有空学习下

a2213572 发表于 2009-2-10 08:50

5步破解PDF 軟體!
高手!

dadafashi 发表于 2009-2-10 12:28

好详细...真的要好好学习下

lbmx8 发表于 2009-2-28 00:26

好好学习下,正须要!!!

ljaizxl 发表于 2009-2-28 15:48

高手呀 帮我破解个就好了
页: [1] 2 3
查看完整版本: 五步暴力拆解Word to PDF(去NAG+去时间限制+去水印...)