最近在需要在代码中编辑Word文档,引用COM组件 Microsoft.Office.Interop.Word是一种常见的方式。但是弊端就是操作系统必须安装Microsoft Office,并且代码中引用的Word版本必须与安装的Office一致。这里涉及到部署与Office版权的问题,所以不是最佳的方案。之前使用过大名鼎鼎的GemBox.SpreadSheet来操作Excel,觉得非常好用,刚好它旗下也有操作Word的库GemBox.Document,所以想试试效果。
在未确定购买License之前,习惯性地网上搜索破解版,可惜大失所望,居然没有破解补丁或者其它免费方案。CSDN上有搜索到,但是需要金币,也不知道资源是否有效,所以就放弃了从网上寻求解决方案。不如研究下动态库的源码,看看能否找到方法。众所周知,C#语言开发的dll或和exe文件,能通过Reflector或者ILSpy等工具进行反编译,如果未进行加壳、混淆加密等处理方式,几乎能得到全部的源码。那么我们来分析下GemBox.Document的反编译结果,反编译的截图如下。不出意外,该动态库进行了混淆加密,很难进行分析。
道高一尺魔高一丈,有混淆就有反混淆,使用de4dot可以进行反混淆,点击文中的链接从github下载源码进行编译,关于de4dot的操作方法,本文就不在叙述。使用de4dot反混淆后的结果如下图所示,虽然看着比上图舒服点,但是还是难以理解,先硬着头皮试试吧。
逆向工程
尝试一:保存代码后再重新编译。使用ILSpy反编译源码并进行保存,然后使用VS2019打开,结果很多错误。按照自己的理解,修改了很多内容,但是仍有部分方法的报错,无法解决。破解失败!
尝试二:使用Reflexil直接编译DLL。使用Reflector反编译源码,然后使用Reflexil插件修改代码,在编译的时候依然报错。破解失败!
尝试三:从注册机制入手。通过“尝试一”中的源码,终于发现一处破绽,最终的验证时通过如下图方法进行的,起初认为“ComponentInfo.nullable_0 = true”代表专业版,当反推出一组序列号之后,才发现方向反了。通过逆向工程,基本得到GemBox.Doucment的注册码机制:16个字符,字符满足[0-9A-Z],每4个字符用“-”分开,字符首字母是“D”,最后一位是对前15个字符的校验,例如:D02V-DS67-00RF-KCUB。其中这16个字符经过一系列的计算,得到一个值,该值与一常量值(上图中的int_0)相等。我发现GemBox这一点做的非常棒,通过分析源代码,仍然无法获取该常量值,似乎又做了一层加密。但是这个很容易破解,使用反射,反射可以得到私有成员的值。
至此,GemBox.Document的注册机制都搞清楚了,但是如何去反推呢?我们不用反推,正向推即可,使用穷举法,只要有一个符合就行。这个自然是很耗计算机资源的,但是比起那杀死更多脑细胞去反推,还是很划算的。16个字符,每个字符36种可能,排除第一个和最后一个,也就是最多遍历36^14次。再研究代码,发现只有第2位到第5位参与了计算,所以又大大减少了循环次数,最多遍历36^4次就能获得一个有效的注册码。果不其然,使用获得的注册码解锁了所有的功能。
思维发散
既然GemBox.Document是这种注册机制,那么GemBox系列的其它产品是不是这种机制呢?再次研究GemBox.Spreadsheet、GemBox.Presentation、GemBox.Pdf和GemBox.Email,发现他们的注册机制与GemBox.Document相似,所以顺便写了一个注册机,供大家学习。
立即下载
写在最后
本文章只是提供一种破解注册码的一种思路,并不提倡大家去恶意破解别人的软件,还是希望大家购买正版,尊重知识产权。
文章评论
谢谢博主,我下载了注册机,使用了GemBox.Spreadsheet V43.0.35.1140,的确可以使用。请问有V45版本的破解方法吗?
@侯亮平 抱歉,为了避免不必要的纠纷,暂不对最新的版本进行破解。另外最新版本的注册码不再是16位了,算法改变了,破解的难度也加大了,有兴趣的可以自己尝试。