.NET 逆向:Patch 一款实时日志查看软件
我的第一个逆向作品:https://pan.baidu.com/s/1pZTRFOk-xzuNqChGcpIQ5A,和大家分享。
一款我很喜欢的实现日志查看软件,官网:https://www.logfusion.ca/。
个人感觉和免费的如logExpert相比,最大的优势就是高分支持做的比较好,在高分屏上UI依旧非常清晰。
废话不多说,正文开始。
一、环境
- dnSpy 4.5.1(x64)
- de4dot 3.2.0(x64)
- Snipaste... 😀
dnSpy 和 de4dot 都是搞.NET逆向必不可少的工具,它们都github开源。我们可以去下载最新源码后,自己用VS编译,来获取最佳的效果。
由于主题和篇幅,这里暂时不具体介绍他们的功能和编译方法。
二、去混淆
直接用dnSpy打开,发现代码被混淆过了。故拖到de4dot上去看看,发现是用了SmartAssembly混淆的。最新版的de4dot反混淆成功。
三、修改注册逻辑
发现软件是通过输入注册码后,点击apply来进行注册的,故从apply入手。
发现apply按钮处理函数,会调用一个验证函数method_60。
接下来Class295.smethod_5是一个关键验证。我们详细的看看这个函数。
发现其会排除掉一些非法注册码,如果满足条件则会调用一个smethod_6,进一步验证。
好了,修改这个smethod_5函数就已经足够实现暴力破解了。当然,如果我们直接想写注册机的话,可以继续深入研究smethod_6,来研究它的验证算法细节。这里就不继续下去了。
经研究发现,bflicenseKeyStatusEnum_0、bflicenseKeyTypeEnum_0、bflicenseKeyVersionEnum_0、bflicenseProEnum_0、dateTime_0对注册是否成功起到了关键作用。
我们将smethod_5直接修改为以下代码。
public static bool smethod_5(BFPublicData bfpublicData_0, string string_0, bool bool_0, BFPublicEnums.BFLicenseCheckListEnum bflicenseCheckListEnum_0, out string string_1, out string string_2, out DateTime dateTime_1, out BFPublicEnums.BFLicenseKeyVersionEnum bflicenseKeyVersionEnum_0, out BFPublicEnums.BFLicenseKeyTypeEnum bflicenseKeyTypeEnum_0, out Guid guid_0, out bool bool_1, out BFPublicEnums.BFLicenseKeyStatusEnum bflicenseKeyStatusEnum_0, out BFPublicEnums.BFLicenseProEnum bflicenseProEnum_0) { bool result = true; string_1 = "I am plain8."; //注册码 string_2 = "plain8 (www.cnblogs.com/plain8)"; //注册名 dateTime_1 = new DateTime(1980, 1, 1); bflicenseKeyStatusEnum_0 = BFPublicEnums.BFLicenseKeyStatusEnum.Valid; bflicenseKeyTypeEnum_0 = BFPublicEnums.BFLicenseKeyTypeEnum.ProPersonalLicense; bflicenseKeyVersionEnum_0 = BFPublicEnums.BFLicenseKeyVersionEnum.V2; bflicenseProEnum_0 = BFPublicEnums.BFLicenseProEnum.ProLicensed; bool_1 = false; guid_0 = Guid.Empty; return result; }
现在,在输入激活码处输入任意字符,即可完成注册。
四、去除联网验证
发现,在联网的情况下,程序会在启动时进行联网验证,取消激活,并弹窗报警。
经跟踪发现此关键的联网验证api函数,它根据软件的类型来分配网络api。
很简单,我们只要让它返回一个非法的api即可。
我这里简单的将其修改为:
public static string smethod_10(BFPublicEnums.BFProductID bfproductID_0) { return "http://www.cnblogs.com/plain8"; }
即可去除联网验证。