码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C#-使用Harmony库实现DLL文件反射调用


    一. Harmony工作原理

         利用C#运行时Runtime的反射机制,动态加载dll中的方法,字段,属性,实现对DLL方法的重写和代码注入。

    二. Harmony下载及安装

         1.下载Harmony_lib库lib.harmony.2.3.3.nupkg

    霸王•吕布 / CSharpHarmonyLib · GitCodeicon-default.png?t=N7T8https://gitcode.net/qq_35829452/csharpharmonylib     2.csproj添加reference引用

    1. <Reference Include="0Harmony">
    2. <HintPath>..\..\Tool\C#\lib.harmony.2.3.3\lib\net48\0Harmony.dll</HintPath>
    3. </Reference>

         3.通过创建Harmony实例,调用PatchAll()方法实现补丁类的加载

    1. #加载已经实现的补丁类,重写原有DLL中方法
    2. var harmonyPatch = new Harmony("patch");
    3. harmonyPatch.PatchAll();

    三. Harmony前置插桩,后置插桩

         通过在类实例上添加Harmony注解,实现补丁类,添加Prefix,Postfix实现对调用方法前,调用方法后的重写,返回值true/false决定原DLL方法是否被执行。

    1. [HarmonyPatch(typeof(OriginalClass), "OriginalMethod")]
    2. public class MyHarmonyPatch
    3. {
    4. __instance获取类实例,___a获取实例变量
    5. public static bool Prefix(int ___a, string ___c, OriginalClass __instance)
    6. {
    7. // 在这里编写补丁的逻辑
    8. Console.WriteLine("Patched method called!");
    9. Console.WriteLine(___c);
    10. return true; // 返回false将阻止原方法执行
    11. }
    12. public static bool Postfix(string ___c)
    13. {
    14. // 在这里编写补丁的逻辑
    15. Console.WriteLine("Patched method called!");
    16. Console.WriteLine(___c);
    17. return true; // 返回false将阻止原方法执行
    18. }
    19. }
    20. public class OriginalClass
    21. {
    22. int a = 10;
    23. int b = 20;
    24. string c = "abc";
    25. public void OriginalMethod()
    26. {
    27. Console.WriteLine("Original method called!");
    28. }
    29. public void OtherMethod()
    30. {
    31. Console.WriteLine("Other Method called!");
    32. }
    33. }

    四. Traverse访问私有属性&私有方法

    1. #访问私有属性
    2. OriginalClass originalClass = new OriginalClass();
    3. string value = Traverse.Create(originalClass).Field("a").GetValue<int>() + "a";
    4. Console.WriteLine(value);
    5. #访问私有方法Method("12")
    6. OriginalClass originalClass = new OriginalClass();
    7. bool methodExisits = Traverse.Create(originalClass).Method("12").MethodExists();
    8. Console.WriteLine(methodExisits);

         

    五. AccessTool

         使用AccessTool对类进行反射,动态调用目标类的方法。

    1. #AccessTool反射调用目标dll方法
    2. MethodInfo method = AccessTools.Method(typeof(OriginalClass), "OtherMethod");
    3. method.Invoke(__instance, new object[0]);
    4. #AccessTool反射调用目标dll属性字段
    5. FieldInfo info = AccessTools.Field(typeof(OriginalClass), "b");
    6. Console.WriteLine(info.GetValue(__instance));

  • 相关阅读:
    Oracle和Random Oracle
    【Rust笔记】浅聊 Rust 程序内存布局
    叮咚!请互联网人签收这份工作技能攻略
    远程桌面由于以下原因之一无法连接到远程计算机解决方法(亲测)
    iOS经典面试题之深入解析objc对象的内存空间、数据结构以及isa指针的理解
    最常用36个英语万能动词的词组短语和习惯用语大全!
    springboot自定义使用threadLocal
    哪种灯对眼睛视力保护最好?盘点五款全光谱光照的护眼台灯
    两个有助于理解Common Lisp宏的例子
    【Java题】模拟下载进度条
  • 原文地址:https://blog.csdn.net/qq_35829452/article/details/137994918
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号