Skip to main content

 路由器设置 > 新闻资讯 >

那些年干过的事:系统序列号破解与防护

2013-09-30 00:12 浏览:

背景:

在推广产品时经常需要搭建演示环境,而每次都需要经过繁琐的序列号申请过程,很是麻烦。尤其是在着急确认某功能时,越是着急越容易出问题,经常需要发送好几遍序列号。我实在受不了这种折腾,就想弄个产品演示版本,远离繁杂耗时的lic申请。

目的:

破解产品序列号限制,不影响产品正常使用。

条件:

无产品源代码;已知产品使用.Net 4.0开发;已知正常序列号为一加密文件;

工具:

.Net Refletor、UE、IDA.Pro.Advanced.v6.1、MSIL微软中间语言 

方法步骤:

首先,通过reflector找到与序列号相关的程序代码,这个比较好达到,明显的标志licenseValidate类;

第二,分析license验证机制,寻找突破口。验证流程为读取加密lic文件,解密文件,通过RSA算法进行序列号校验,根据校验结果返回验证结果。这个校验还是比较糙的,我们可以直接对校验结果的返回值进行patch,也就是不管验证结果是否正确,都返回true,这样就绕开序列号限制了。

第三,使用IDA打开待破解的文件,按照在reflector看到的方法名进行定位,IDA中提供图形化界面及对应的16进制联动功能,可以很方便的帮我们定位到需要修改的16进制地址。IDA中显示的是IL文件格式,我们通过走读可以找到最终校验返回的代码位置,就是将返回false的地方修改为返回true。这个地方需要使用《CIL操作码速记表+CIL操作码大全速查》,以便于我们理解程序。

第四,使用UE打开待修改文件,定位到我们要修改的位置,可以按照每行的16进制地址号定位,我们需要返回false对应的中间语言部分ldc.i4.0修改为ldc.i4.1,对应到hex模式下就是将ldc.i4.0对应的操作码为16,修改为ldc.i4.1对应的操作码为17。

第四,修改完成后直接保存,测试程序是否可正常运行。

感悟:

对于.net代码需要在编译时进行混淆或加壳防护,对序列号的校验应该增强校验方式。