.NET外挂系列:1. harmony 基本原理和骨架分析

一:背景

1. 讲故事

为什么要开这么一个系列,是因为他可以对 .NET SDK 中的方法进行外挂,这种技术对解决程序的一些疑难杂症特别有用,在.NET高级调试 领域下大显神威,在我的训练营里也是花了一些篇幅来说这个,今天我准备用10篇左右来详细聊一聊,供学员和同行们欣赏,详细的文档参考:https://harmony.pardeike.net/articles/intro.html

二:harmony 解读

1. 概念

Harmony 是一个用于在运行时修补、替换和装饰 .NET 方法的库,兼容主流平台,比如 PC、Mac、Linux的32位和64位系统。它的注入模型图如下:

这张图很好理解,就是对你想要 hook 的方法,harmony 会对应生成一个动态方法,然后将 需要hook的原方法的il代码全部copy走,同时根据你的配置情况,在il代码之前il代码之后 配置一个 AOP 逻辑,当然有需要的话,还可以对原方法的 il 代码借助 Transpilers 组件进行修改,总之非常强大。

2. harmony 有哪些注入点

用 harmony 做外挂,肯定要知道注入的一些点位,常见的有:

  1. 前缀补丁(Prefix)和后缀补丁(Postfix)

前缀补丁和后缀补丁非常好理解,就是我们理解的 AOP 功能,前者在原始方法执行前执行,后者是在原始方法执行后执行。

  1. 转译器补丁(Transpiler)

如果基本的 AOP 功能不能满足,这时候就必须更精细化的控制,对,就是直接修改 copy 之后的 il 代码,这个就比较🐂👃了,

  1. 终结器补丁(Finalizer)

如果构建出来的AOP补丁逻辑会抛异常的话,你又不想让这些异常污染正常的业务代码逻辑,这时候就可以用 终结器补丁 了,相当于对外屏蔽了人家不关心的东西,哈哈,否则容易造成恐慌。

  1. 反向补丁(Reverse Patch)

如果说 AOP 是纵向扩展,那反向补丁就是横向扩展,它的原理就是在 DynamicMethod 方法之前生成一个动态代码(Proxy),后续再跟大家详细聊。

三:案例场景介绍

1. 案例背景

说了这么说,还是说一些比较实际的案例可能大家更感兴趣,我的一个 .NET 程序平时都是好好的,不知道为啥线程突然就暴涨到了1000+,现在很惶恐,不知道是什么逻辑导致的,我用 windbg 观察后发现是都是普通的 Thread 类,输出如下:


0:013>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值