本贴仅用于学习交流,禁止用于商业用途
PDFElement 是我非常喜欢的pdf编辑器,界面简洁好看,功能很强大。PDFElement7 专业版我用了功能还是很赞的,但是不太稳定,处理的pdf文件过大的时候很容易报错甚至于崩溃,以前用过他家iPad版的应用,也是各种不稳定就上架。。。不过这个就不管了,本贴只是简单说一下怎么patch。其实已经有人过破解过6了,7好像也有了,但是没人发帖。我自己新人小白,纯属练手。
这个软件使用 .NET写的,我自己之前也没接触过,还是看了一些简单的MSIL和C#才敢开始试着破解的。
工具:dnSpy
之前年少不更事,用x64dbg逆向,搞得我怀疑人生,最后老老实实上了dnSpy的船。本贴就简简单单说几句,没有深入分析,稍微水一水。最先用exeinfope 看到使用.NET编写,用dnSpy打开后也没发现有对程序做任何混淆等保护措施,所以dnSpy反编译出来的代码很清晰和易读。
1,登录框。PDFElement7是要先登录才能使用,我本来想去掉登录环节,但是试了一天多(原谅小白我能力差),搞得程序直接崩溃,一想到登录一下也没啥,最后就放弃要去掉登录环节的执念了。所以正常用微信或账号登录算了,登录后界面如下,在账户旁边会有购买按钮。大佬有精力要跳过登录应该也不难。
批注 2019-12-10 163446.png
2,注册信息。登陆账户后,账户状态包含注册信息,主要是trial,standard,professional,也分为registered和unregistered。试用用户使用高级功能,比如转换为word,或者保存OCR识别后的PDF时,会弹出购买窗口:
批注 2019-12-10 163658.png
批注 2019-12-10 175915_LI.jpg
试用的话还会有页数限制和水印等问题。所以破解的要点就是要解决这个问题。
作为小白的我,要找到关键的类和函数还是很麻烦的,我自己并没有什么捷径和技巧,只是重复了很多遍,进入函数寻找关键信息,最先找到的是ProductAuthMgr类,看名字就大概知道其是管理授权信息的。他的初始化函数为:
批注 2019-12-10 181156.png
其中g()函数比较关键,进入其中会找到如下两个句子:
ProductAuthMgr.ProductAuth = new WULRegProductAuth(false)
ProductAuthMgr.ProductAuth = new WSIDProductAuth(ProductAuthMgr.e())
可见真正管理授权信息保存在ProductAuthMgr类中的ProductAuth成员变量里,而且其包含WULRegProductAuth和 WSIDProductAuth两种不同授权类型或者途径,这两个类都位于ProductAuthor.dll中。进入其中,找到这两个类包含了我们要找的用户信息:
批注 2019-12-10 182310.png
批注 2019-12-10 182727.png
显然,get_RegStatus就是突破口,其返回不同的register的状态,其中Registered状态对应于0x00000002,右键打开il指令编辑框,将所有ret前的指令改为idc.i4.2,就可保证每次查询RegStatus得到的都是Registered了。注意,
WULRegProductAuth和 WSIDProductAuth两个类中的get_RegStatus都要按照上面的改。
更改后,步骤1中的购买按钮不见了,高级功能(转换为doc,OCR后保存PDF)能够使用,但是使用前还是会弹出步骤2前两张截图所示的购买窗口。意即,功能其实已经破解,但是使用前还是会弹出窗口骚扰一下。
3,跳过购买窗。购买窗口是在点击 转换为doc 按钮时弹出的。这个按钮可以在dnSpy的局部变量窗口中展开this中找到,this指向的是MainForm,其中包含了窗体上的各种按钮,根据按钮的名称可以找到其类型为WUL.CTRLs.Gbutton派生的RibbonButton,进而找到其onClick函数,用笨办法不断的下断点和进入函数结合,终于找到在onClick函数中会调用PEStudio.PDFElement.Base.Authorisation.trails中TrailFunctionWindows成员变量中所定义的的a()函数,他们都位于PEStudio.PDFElement.Base.dll文件中。a()函数包含如下信息:
批注 2019-12-10 185038.png
ShowAuthForm显然就是展示购买窗口的入口。分析a()流程如下图,switch下会经过到case 5,随后一条if语句,要么到case 3后立马return true,要么进入另一条途径最终调用ShowAuthForm,显然我们要选择前者。右键进入IL指令编辑界面,将bne.un改为beq以改变if的跳转,从而绕过了显示购买窗的环节。
批注 2019-12-10 185401.png
至此,破解基本完成,将修改后的PEStudio.PDFElement.Base.dll和ProductAuthor.dll替换掉原程序中的文件即可,高级功能都能不受限制的自由使用。不过还有很多可以小修小补的地方,但是总体上到这里也就够用了。
这里不提供程序下载,仅分享经历供学习讨论,欢迎自己尝试。上述过程可能由于记忆而有所偏差,可自行修正。
.NET 逆向刚接触这一点,可以学的还很多。。。。
后续更新:
1,强制登录框
【【【经@wwb66668 补充,在PEStudio.PDFElement.UI.dll中找到ForceLoginForChinaBrand函数是生成登陆框的入口,使其直接return即可直接跳过强制登陆账户后才能使用的限制。感谢!!!】】】
2,登录按钮
可以免登录使用且去掉购买按钮后,主界面上还有留着一个用户登录的按钮,看着有些碍眼。这个按钮名字叫 rbReg,是通过在MainFrame的类成员中找到的,通过搜索rbReg可以找到其创建位置位于PEStudio.PDFElement.UI.Controls.Ribbon.Pages.BaseRibbonPage的InitializeComponent方法,将this.AutoSize改为false,将minimumsize和size都改为(0,0),则可以完全隐藏掉这个用户登录按钮。
批注 2019-12-11 152347.png
最终效果如图,一切专业版功能正常,且去掉了UI上多余购买和登录的按钮,无需登录即可正常使用。
批注 2019-12-11 153303.png