某低代码平台 逆向分析(三)【收费插件解码/对DLL打补丁/暗桩】完结

查看 99|回复 9
作者:pjy612   
某低代码平台 逆向分析(三)【收费插件解码/对DLL打补丁/暗桩】完结
前情提要
经过前两期的洗礼
某低代码平台 逆向分析(一)【验证逻辑分析和实践】
某低代码平台 逆向分析(二)【客户端注册/发布/插件】
大伙儿应该基本知道要怎么手动处理了。
但是手动处理好像挺麻烦的。
通过咱的其他帖子,大伙儿应该知道可以对我们自己应用中的DLL进行Hook
那么 有没有用什么办法 在别人的程序里面对别人的DLL进行Hook呢?
类似 DLL注入?  
这个呢也是有的。。。不过不是DLL注入,而是类似静态修改了。
我们可以写一个 Patch.dll,然后 静态修改别人的DLL引用我们的 Patch
之后 在别人的DLL里面 反射调用 Patch.dll 内的函数。
实现把我们的Hook 附加到其他应用中。
虽然没有C++那种dll改个名字放着就能自动注入强,但是至少也算个法子不是吗?
准备工作
我们根据前两篇帖子的分析,我们知道 要改RSA的点有几个。
  • 服务端 ForguncyServer
  • CommonUtilities.dll  
  • Forguncy.Server2.dll  
  • Forguncy.UserService2.dll  
  • 客户端 Forguncy 8
  • CommonUtilities.dll  
  • Forguncy.exe


    其中基本 所有DLL 都引用了 CommonUtilities.dll
    那么我们写个 PatchLib 让 CommonUtilities.dll 引用然后 调用里面的Hook 函数,是不是其他的dll 都会自动生效?
    那咱们开工吧~  
    对DLL打补丁
    先把之前 所有的 改动全部还原,没备份就重装一下。
    先看目标


    1.png (31.14 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:55 上传

    目标是 .NET Standard 2.0,那么我们也创建一个 .NET Standard 2.0 的项目 就叫 HuozigePatchLib
    HuozigePatchLib 的作用就是被目标调用 并且 对目标进行Hook。
    引入 Harmony 的包。
    先简单写个类


    2.png (26.29 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:55 上传



    3.png (20.93 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:55 上传

    这样一个Hook的DLL就写好了。
    那么 为了要将 代码置入到 别的DLL,我们还需要 再写个 访问我们DLL的类,这个类将用于直接放入目标的DLL中。
    我们再创建一个 .NET Standard 2.0 的项目 叫 HuozigePatchLoader
    HuozigePatchLoader 的作用就是被植入到目标中,用于调用我们写的 HuozigePatchLib
    这里就完全是无任何引用,全反射实现。


    4.png (33.2 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:55 上传



    5.png (30.89 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:55 上传

    到这里 基本准备就做好了。
    接下来 我们要做的就是 把 HuozigePatchLoader 内创建的类 置入到 目标中。
    有两种方式 先说第一种
    dnspy 置入法
    直接在 dnspy 上对目标dll 右键 添加类,然后 点击 编译。


    6.png (77.06 KB, 下载次数: 0)
    下载附件
    2023-4-24 20:07 上传



    7.png (90.32 KB, 下载次数: 0)
    下载附件
    2023-4-24 20:07 上传

    然后 找到 共通函数 并在顶部置入 Call
    我这里找的是 CommonUtilities.CommonUtilitiesWindows.Init()


    8.png (68.07 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:55 上传

    然后 改代码或者改IL(看哪种方便能成功选哪种)
    这次 因为有混淆 所以我们用IL 实现。
    顶部 加出一行 来


    9.png (25.37 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:56 上传

    然后 操作码选 call 后面内容选  


    10.png (80.85 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:56 上传

    保存后 成功的话 效果如下图


    11.png (41.59 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传

    我们保存修改然后调试看看。
    记得先把我们编译好的Lib 放到 要读取的目录里面。


    12.png (29.56 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传

    我们直接调试 ForguncyWorkerService


    13.png (27.01 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传



    14.png (27.35 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传



    15.png (44.96 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传



    16.png (46.67 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传



    17.png (17.52 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传



    18.png (70.62 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传

    成功!Hook 生效了!
    dnlib 编程法 实现 AutoPatch
    https://github.com/0xd4d/dnlib
    又一.Net利器,专门拿来静态编辑DLL。
    我们再随便起一个控制台项目 引入 dnlib
    然后将之前生成的 HuozigePatchLoader 放到这个项目里,我这边叫 PatchLoader.dll  


    19.png (55.1 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传



    20.png (15.89 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传

    保存后的DLL大概样子  


    21.png (69.14 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传

    插件解码
    根据插件的配置文件PluginConfig.json分析后能找到解码的位置  


    22.png (42.44 KB, 下载次数: 0)
    下载附件
    2023-4-24 19:57 上传

    //new r().a
    internal string a(string A_0)
    {
            return d.a(A_0, ap.e());
    }
    //ap.e()
    internal static string e()
    {
            return "-----BEGIN PUBLIC KEY-----\r\n                        MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPS5BZhNjUHiu6qrUQ8UDf5wja\r\n                        uRSYporrb+ONWem6ZDNI7mf1JT9IdgDmLjcmjLKfhwRYqMERCBofJjtnDctv/LvX\r\n                        wPFU05Ww7Pjfx1S287jFYIt2grCBHTU6RnvEr17WOH1Y8GG6mASRm5WTcu3FcKyD\r\n                        63l0ZGvtTd4xgUrUmwIDAQAB\r\n                        -----END PUBLIC KEY-----";
    }
    //d.a
    internal static string a(string A_0, string A_1)
    {
            string[] array = A_0.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
            List list = new List();
            using (StringReader stringReader = new StringReader(A_1))
            {
                    Pkcs1Encoding pkcs1Encoding = new Pkcs1Encoding(new RsaEngine());
                    AsymmetricKeyParameter asymmetricKeyParameter = (AsymmetricKeyParameter)new PemReader(stringReader).ReadObject();
                    pkcs1Encoding.Init(false, asymmetricKeyParameter);
                    for (int i = 0; i
    算法有了直接根据DLL解密即可,解完了 将 Base64 转成 byte[] 另存为 .dll 后缀就行了。
    关于暗桩
    Forguncy.UserService2 里面有个类,内容如下
    无名小银,如果您要查看本帖隐藏内容请回复
    启动后 根据 安装时间(好像超过30天之后)周期性上报license信息。
    所以别干坏事,会被查到哟。
    尾声
    终于是吧这期给码完了。
    核心代码都在图里面了,自己对着敲一敲印象更深刻。
    感兴趣的小伙伴可以自己用 dnlib 把 收费插件爆破 和 在线激活抛Error转离线 实现一下(都在CommonUtilities里面)。
    也可以把读本地dll 换成 嵌入式dll 直接一个dll 置入,然后其余的也都在内存中加载。
    希望大伙儿能学到点东西吧,有更多人造轮子话,咱就可以偷懒摸鱼白嫖啦~想想就好开心!
    郑重声明
    本内容供学习和技术交流,请勿用于商业或非法用途。

    下载次数, 下载附件

  • pjy612
    OP
      

    沙发,终于可以休息咯~
    3yu3   

    大佬高产啊。。。期盼的第三篇终于到来,更加给力。。
    cbasten   

    这个确实是厉害了,收藏了 谢谢分享!
    iyysbbs   

    存档学习了,
    Millet_Lok   

    大佬牛啊,学习一下
    lg560852   

    这个厉害了
    yundu5557   

    看不懂啊
    weliong   

    强烈支持一波。
    lies2014   

    学习学习!
    您需要登录后才可以回帖 登录 | 立即注册