背景:
在推广产品时经常需要搭建演示环境,而每次都需要经过繁琐的序列号申请过程,很是麻烦。尤其是在着急确认某功能时,越是着急越容易出问题,经常需要发送好几遍序列号。我实在受不了这种折腾,就想弄个产品演示版本,远离繁杂耗时的lic申请。
目的:
破解产品序列号限制,不影响产品正常使用。
条件:
无产品源代码;已知产品使用.Net 4.0开发;已知正常序列号为一加密文件;
工具:
.Net Refletor、UE、IDA.Pro.Advanced.v6.1、MSIL微软中间语言
推荐一篇文章
http://www.topzs.com/tech-box/you_qian_ru_shen_ren_shi_cil_de_ji_ben_gou_cheng_cil_cao_zuo_ma_su_ji_biao_cil_cao_zuo_ma_da_quan_su 由浅入深认识CIL的基本构成+CIL操作码速记表+CIL操作码大全速查(二)
方法步骤:
首先,通过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代码需要在编译时进行混淆或加壳防护,对序列号的校验应该增强校验方式。
转载于:https://blog.51cto.com/52861700/1303283