ServiceStack.Redis系列破解

这篇具有很好参考价值的文章主要介绍了ServiceStack.Redis系列破解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ServiceStack.Redis免费版有个每小时6000次访问限制,网上目前的破解方式都是dnspy修改源码或者Github上下载源码修改,这样的方式不是不好,主要是不方便NUGET版本管理和更新。

 文章来源地址https://www.toymoban.com/news/detail-774503.html

反编译看了下注册逻辑,发现很简单就是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也是可行的,但是能直接通过原始注册的方式来实现还是用注册的方式来实现。

 

这样操作后后续升级版本也不用再破解

 

                    

到了这里,关于ServiceStack.Redis系列破解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis系列(三):深入解读Redis主从同步机制

    https://blog.zysicyj.top/ 为什么要提这个呢,因为Redis主从库目的呢其实就是为了实现高可靠。上篇文章中我们说过Redis的AOF、RDB日志其实就是为了 减少数据丢失 ,这是高可靠的一部分。 这篇文章呢,我们聊聊Redis实现高可靠的另一方面: 尽量减少服务中断 。这里Redis是怎么做的

    2024年02月12日
    浏览(29)
  • 【Redis系列】Spring Boot 集成 Redis 实现缓存功能

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年04月10日
    浏览(59)
  • Redis面试系列-01

    redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。 re

    2024年01月16日
    浏览(38)
  • 面试系列 - Redis使用详解

    目录 一、Redis的数据结构 二、Redis事务 1. 开启事务:MULTI 2. 添加事务命令 3. 执行事务:EXEC 4. 回滚事务:DISCARD 5. 事务中的错误处理 6. 监视键:WATCH 7. 返回值 8. 嵌套事务 9. 实例 三、redis 分布式锁如何实现 1、基于Redis的分布式锁实现步骤: Redis(Remote Dictionary Server)是一个

    2024年02月10日
    浏览(27)
  • Redis面试系列-03

    在redis节点发送心跳包时需要把所有的槽放到这个心跳包中,以便让节点知道当前集群信息,即16384=16k,在发送心跳包时使用char进行bitmap压缩后是2k(2*8 (8bit)*1024(1k)=16K),也就是说使用2k的空间创建了16k的槽数。 虽然使用CRC16算法最多可以分配65535(2^16-1)个槽位,即65535=6

    2024年01月19日
    浏览(31)
  • 系列二、Redis简介

            redis是一个内存型的数据库(内存中数据的特点:断掉即消失)。每秒钟能处理 8w~11w个读操作,6w~8w个写操作;         ①   Redis是一个高性能的 Key/Value内存型数据库;         ② 支持丰富的数据类型(String、List、Set、ZSet、Hash);         ③ 支持持久化 (将

    2024年02月13日
    浏览(36)
  • Redis面试系列-02

    Redis回收使用的是LRU算法。 LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。 Redis2.6版本开始redis-cli支持一种新的数据插入方式,被称之为pipe mode的新模式,用于执行大量数据插入工作。 Redis有着更为复杂的数据结构并且提供对他们的

    2024年01月21日
    浏览(26)
  • redis优化系列(五)

    本期分享redis内存过期策略:过期key的处理 Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存: 当内存使用达到上限时,就无法存储更多数据了。为了解

    2024年01月21日
    浏览(24)
  • 【Redis系列】Redis布隆过滤之8亿大数据集实战

    即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级重要 蓝色 :用来标记二级重要 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如

    2024年02月04日
    浏览(22)
  • Redis系列(四):哨兵机制详解

    https://blog.zysicyj.top/ 前面我们说过,redis采用了读写分离的方式实现高可靠。后面我们说了,为了防止主节点压力过大,优化成了主-从-从模式 这里主从模式下涉及到的几个问题: 主库真的挂了吗? 我们应当选择哪个从库作为主库? 怎样让其他从库知道新的主库信息呢? 中

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包