这样一旦更新什么的就要重新操作一遍,费时费力。
如果是反射和注入的话,又不一定能很好的定位静态对象。
那么有没有类似Aop的Hook 能帮忙我们对运行中的库动态打补丁和加Hook呢?
还真有。。。HarmonyLib 和 HarmonyX
一般这两个常用的是 基于 BepInEx 给 Unity 游戏做Mod。但我们也能把他用在.Net应用上。
下面就拿一个 有水印的 office 文档处理的库 做个示范演示一下。
111.png (112.37 KB, 下载次数: 0)
下载附件
2023-1-18 11:48 上传
[color=]坛子里有大佬发过对应的逻辑,都是基于过期的license处理。这里不过多的说明
但是 license 都是有 RSA 验签的。
那我们能不能不改动整个 license,但是 在 dll 读取 过期时间的时候 我们去hook它呢?
license 的格式是 XML的 所以肯定会用到 XML相关的读取函数。那么我们对它进行Hook。
222.png (96.37 KB, 下载次数: 0)
下载附件
2023-1-18 11:52 上传
Hook XmlElement 属性的 InnerText 的 Getter 函数,如果 当前是在读取 SubscriptionExpiry 我们直接将 返回值 "20200827" 修改成 "20991231"。
这样不影响 校验部分对整个 xml 做 校验。但是单独变更了 过期时间。
同理 有的DLL 是用的 XmlReader 的 ReadString ,我们也处理一下。
333.png (32.94 KB, 下载次数: 0)
下载附件
2023-1-18 11:55 上传
那么问题来了,有些DLL 在 读取完时间之后 还会又重新验证下 这个内容是否是真的在 xml 里面。
444.png (91.9 KB, 下载次数: 0)
下载附件
2023-1-18 11:57 上传
我们也Hook 一下,如果检查的时候我们自己修改的新过期时间,就给改成一个 大于 -1 的就行。
然后问题来了,那个 StackInAspose 函数是什么?
因为我们Hook 的都是 底层函数,虽然加了一些前置判断 为了避免影响到其他 逻辑,判断一下调用堆栈。
555.png (47.81 KB, 下载次数: 0)
下载附件
2023-1-18 12:00 上传
只 Hook 对 SetLicense 之下的调用链做处理。
然后 既然是针对 系统函数的Hook ,那么我们 对这种仅一次授权验证的 需要在Patch完后及时释放掉。
所以 Patch类用 using 包裹比较好。
666.png (32.45 KB, 下载次数: 0)
下载附件
2023-1-18 12:06 上传
最后 使用上就是
777.png (26.42 KB, 下载次数: 0)
下载附件
2023-1-18 12:06 上传
new 对象的时候 激活 Harmony 的 Patch。
析构时 解除 Patch。
测试结果
888.png (16.08 KB, 下载次数: 0)
下载附件
2023-1-18 12:10 上传
水印都成去除。
总结,
使用 HarmonyLib 的好处就是,不用每次针对性 修改DLL,也不需要处理 DLL之前的强命名关联等。全部在运行时中打补丁。
当然 补丁前 该怎么Hook 的分析还是要的。
[color=]PS:
[color=]用好了这个大杀器 对一些 RSA 验签也可以无脑 return true. 可以单独只逆向算法,不用去想公钥私钥的问题了。