前情提要
经过前两期的洗礼
某低代码平台 逆向分析(一)【验证逻辑分析和实践】
某低代码平台 逆向分析(二)【客户端注册/发布/插件】
大伙儿应该基本知道要怎么手动处理了。
但是手动处理好像挺麻烦的。
通过咱的其他帖子,大伙儿应该知道可以对我们自己应用中的DLL进行Hook
那么 有没有用什么办法 在别人的程序里面对别人的DLL进行Hook呢?
类似 DLL注入?
这个呢也是有的。。。不过不是DLL注入,而是类似静态修改了。
我们可以写一个 Patch.dll,然后 静态修改别人的DLL引用我们的 Patch
之后 在别人的DLL里面 反射调用 Patch.dll 内的函数。
实现把我们的Hook 附加到其他应用中。
虽然没有C++那种dll改个名字放着就能自动注入强,但是至少也算个法子不是吗?
准备工作
我们根据前两篇帖子的分析,我们知道 要改RSA的点有几个。
其中基本 所有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 置入,然后其余的也都在内存中加载。
希望大伙儿能学到点东西吧,有更多人造轮子话,咱就可以偷懒摸鱼白嫖啦~想想就好开心!
郑重声明
本内容供学习和技术交流,请勿用于商业或非法用途。