V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
INCerry
V2EX  ›  C#

最近在写一个.NET 方法注入的工具,遇到了些问题,看看在 V 站能不能找到大佬交流交流

  •  
  •   INCerry · 2022-09-05 18:41:55 +08:00 · 2424 次点击
    这是一个创建于 844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,最近在写一个.NET 方法注入的工具,类似 java asm 那样在运行时修改方法的方案。 遇到了一些问题,圈子里面研究这个的太少了,来 V 站找找大佬。

    看看有没有熟悉 MSIL 、PE Metadata 布局、CLR 源码、CLR Profiler API 的大佬,或者对这个感兴趣的朋友,都可以一起交流交流。

    9 条回复    2023-01-09 17:01:25 +08:00
    Chad0000
        1
    Chad0000  
       2022-09-05 18:43:14 +08:00
    不是大佬,建议你描述一下你为什么需要在运行时修改方法。
    INCerry
        2
    INCerry  
    OP
       2022-09-05 18:54:56 +08:00
    @Chad0000 比如一般的 AOP 、APM 、故障注入、日志诊断,类似 java arthas 中的一些功能,都需要动态方法注入
    ijrou
        3
    ijrou  
       2022-09-06 05:16:05 +08:00
    在运行时修改方法的方案
    这不是在内存修改吗?
    INCerry
        4
    INCerry  
    OP
       2022-09-06 08:46:37 +08:00
    @ijrou 对,可以这么认为,主要就是修改元数据和让 JIT 重新帮我们编译。
    coder001
        5
    coder001  
       2022-09-11 09:50:37 +08:00
    虽然不太清楚 OP 的需求,如果没了解过 Harmony 的话,可以看看
    这个库经常被拿来做 Unity 游戏 Mod ,可以运行时替换方法或者操作码( IL 指令)
    https://github.com/pardeike/Harmony

    我甚至用来给系统基础类库打补丁,有个 Winform 控件的默认实现有不符合预期,给补丁掉了
    https://topcl.net/custom-technology/painless-fix-BUG-in-winform-NumericUpDown-Hexadecimal-mode.html
    INCerry
        6
    INCerry  
    OP
       2022-09-12 21:56:01 +08:00
    @coder001 嗯 感谢回复,Harmony 这个库我有研究过,它通过修改 JIT 以后的汇编代码,插入 jmp 指令的方式跳转到新方法。
    不过遗憾的是它不能满足我的需求,因为它对分层编译和泛型方法的支持有限。
    codelover2016
        7
    codelover2016  
       2022-09-22 00:38:22 +08:00
    我都觉得这是个广告帖子了。
    不过我觉得 AspectCore.DynamicProxy 能帮到你。
    INCerry
        8
    INCerry  
    OP
       2022-09-22 09:37:53 +08:00
    @codelover2016
    不明白您所指的广告贴是什么意思?
    您所说的工具很遗憾它不能满足我的需求,它只能通过创建 proxy 或者重写 virtual 方法来实现 aop ,无法真正的做到修改任意方法的 MethodBody ,局限性比较大,无法实现任意插桩。
    codelover2016
        9
    codelover2016  
       2023-01-09 17:01:25 +08:00
    @INCerry 没撒,我原以为是要推广你自己的一些库,现在看起来不是。我依稀记得有大佬在知乎分享过他的方案,晚点我翻翻看能不能找到~
    加油(^-^)V
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 02:56 · PVG 10:56 · LAX 18:56 · JFK 21:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.