-
ServiceStack.Redis系列破解
ServiceStack.Redis免费版有个每小时6000次访问限制,网上目前的破解方式都是dnspy修改源码或者Github上下载源码修改,这样的方式不是不好,主要是不方便NUGET版本管理和更新。
反编译看了下注册逻辑,发现很简单就是LicenseKey类:
public class LicenseKey { public string Ref { get; set; } public string Name { get; set; } public LicenseType Type { get; set; } public long Meta { get; set; } public string Hash { get; set; } public DateTime Expiry { get; set; } }
Expiry :过期时间
LicenseType :类型,无脑选择Business或者Enterprise就可以
Hash :一个RSA签名数据,来源是GetHashKeyToSign方法的数据
public static string GetHashKeyToSign(this LicenseKey key) { return $"{key.Ref}:{key.Name}:{key.Expiry:yyyy-MM-dd}:{key.Type}"; }
由于RSA签名是私钥签名,私钥肯定是找不到的,所以想写个注册机也不行了。
我们可以另辟蹊径,用打补丁的方式来HOOK校验签名的方法,让他直接返回true
这是他原始的校验方法:
public static bool VerifySha1Data(this System.Security.Cryptography.RSACryptoServiceProvider RSAalg, byte[] unsignedData, byte[] encryptedData) { using var sha = TextConfig.CreateSha(); return RSAalg.VerifyData(unsignedData, sha, encryptedData); }
这里我们采用HarmonyLib库来补丁,写过游戏Mod的应该很熟悉这个库:
[HarmonyPatch] public class ServiceStackPath { [HarmonyPrefix, HarmonyPatch(typeof(LicenseUtils), nameof(LicenseUtils.VerifySha1Data))] private static bool VerifySha1DataPrefix(ref bool __result) { __result = true; return false; } public static void Path() { var harmony = new Harmony("com.ServiceStack.Text.Path"); harmony.PatchAll(); var licenseKey = new LicenseKey() { Expiry = DateTime.Now.AddYears(50), Type = LicenseType.Enterprise, Ref = "9999", Name = "Admin", Meta = 9999 }; licenseKey.Hash = Convert.ToBase64String(GenerateRandomBytes(16)); var serializeToString = TypeSerializer.SerializeToString(licenseKey); var key = $"{licenseKey.Ref}-{Convert.ToBase64String(Encoding.UTF8.GetBytes(serializeToString))}"; LicenseUtils.RegisterLicense(key); //LicenseUtils.RegisterLicense("9999-e1JlZjo5OTk5LE5hbWU6QWRtaW4sVHlwZTpFbnRlcnByaXNlLE1ldGE6OTk5OSxIYXNoOndkcEtNQ21ZYmlnQTk1TXFrV25ldHc9PSxFeHBpcnk6MjA3NC0wMS0wM1QxNDo1MzoxOC4yMjk5MDU3KzA4OjAwfQ=="); } private static byte[] GenerateRandomBytes(int length) { var randomBytes = new byte[length]; // 使用 RNGCryptoServiceProvider 生成安全的随机字节序列 using var rng = new RNGCryptoServiceProvider(); rng.GetBytes(randomBytes); return randomBytes; } }
使用的时候在程序入口调用一次ServiceStackPath.Path()就可以了,或者按照官方的方式在config文件或者注册表里面写入上面的KEY他自己注册也行 Path方法中写了具体的KEY生成了逻辑,也可以启用最后一行的注释用生成好的KEY也是一样的。
这样貌似还可以顺便破解他其他收费的库的限制,随带一提直接Path掉LicenseUtils.ActivatedLicenseFeatures()方法的返回值让他返回All也是可行的,但是能直接通过原始注册的方式来实现还是用注册的方式来实现。
这样操作后后续升级版本也不用再破解
出处:https://www.cnblogs.com/mldcy/p/17943283
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式