此文,是2年前对国内某TOP报表厂商的(F厂商)的报表产品的注册码注册激活机制的研究。
1、客户端软件的,信息收集码(激活码)
2、服务端软件,上传license激活
3、服务器未注册,有并发用户数限制
4、服务端注册,多实例环境下,支持LicenseServer,集中认证
5、有插件市场,插件的注册机器,与服务器的注册不同。
服务端和客户端,均使用java开发。
目前主流版本为10.0,之前的版本9.0的服务器端license机制,包括8.0的license机制,都有很大的不同。
license机制研究难点:
1、license的核心类,并不在jar包中体现,是java的class文件的加密后的文件,通过instrument,在class加载前加载agent解密,加载license核心类到内存,此处有自定义类加载器;
【解决手段】在运行后,从内存已加载的class文件,dump出来。【工具】dumpclass,https://github.com/hengyunabc/dumpclass,也可以使用jdk自带的HSDB工具
2、10版本,最高版本的实现方式,其class文件的加密后的文件解密,是rsa解密,并且是在dll(linux是so文件)中实现的
9.0版本(记得好像是这个版本),嵌套了100层,进行对称解密,此可以逆向出来。
3、报表服务的核心类是混淆过的,并且通过代码在发布前,插入license验证代码,相当于“污染”了正常业务类,并且是很大的范围的。
最终10版本的实现方式:
1、dump出来license核心类,分析其核心license校验逻辑;
2、更改license核心类的核心方法,得到修改的核心方法的字节码 【工具】https://github.com/tinylcy/ClassAnalyzer
3、开发agent,替换license核心类的核心方法,直接以字节码的形式进行替换;
4、使用.lic文件的非加密版本,执行在线注册(上传明文的license文件),加载数据,执行修改的lincense验证方法,绕过license检查
5、rsa不可逆,不对注册码加解密进行分析处理
6、最好host添加屏蔽,因为帆软的代码中对license的处理异常有发邮件,可能也有信息收集,至于web报表前端是否有信息收集,就不太清楚了,这个最好网络抓包分析。
参考资料:
52pj论坛的搜索资料,此处不列出了,别人直接给了代码和项目了。O(∩_∩)O