原文 教你怎么用Mono Cecil - 动态注入 (注意代码的注释)

使用 Mono Cecil 进行反编译:using Mono.Cecil;
using Mono.Cecil.Cil;//......AssemblyDefinition asm = AssemblyFactory.GetAssembly("MyLibrary.dll");
foreach (TypeDefinition type in asm.MainModule.Types)
{if (type.Name == "Class1") //获取类名{foreach (MethodDefinition method in type.Methods) 遍历方法名称{Console.WriteLine(".maxstack {0}", method.Body.MaxStack);foreach (Instruction ins in method.Body.Instructions){Console.WriteLine("L_{0}: {1} {2}", ins.Offset.ToString("x4"),ins.OpCode.Name,ins.Operand is String ? String.Format("\"{0}\"", ins.Operand) : ins.Operand);}}}
}
输出:.maxstack 8
L_0000: nop
L_0001: ldstr "Hello, World!"
L_0006: call System.Void System.Console::WriteLine(System.String)
L_000b: nop
L_000c: retnop ---->ldstr ---->call ---->nop ---->ret ---->=================》下面我们开始进行注入了AssemblyDefinition asm = AssemblyFactory.GetAssembly("MyLibrary.dll");
foreach (TypeDefinition type in asm.MainModule.Types)
{if (type.Name == "Class1"){foreach (MethodDefinition method in type.Methods){if (method.Name == "Test"){foreach (Instruction ins in method.Body.Instructions){if (ins.OpCode.Name == "ldstr" && (string)ins.Operand == "Hello, World!") //如果发现操作数为"Hello, World! ===>改为"Hello, C#!";{ins.Operand = "Hello, C#!";}}}}}
}AssemblyFactory.SaveAssembly(asm, "Test.dll");用 Lutz Roeder's Reflector 打开 Test.dll 看看结果。
.method public hidebysig instance void Test() cil managed
{.maxstack 8L_0000: nopL_0001: ldstr "Hello, C#!"L_0006: call void [mscorlib]System.Console::WriteLine(string)L_000b: nopL_000c: ret
}达成所愿~~~~~完成代码修改以后,我们玩一个更难点的,注入额外的代码。(好像有点做病毒的意思,呵呵~)任务目标是在 Console.WriteLine("Hello, World!"); 前注入 Console.WriteLine("Virus? No!");,还好这不是真的破坏性代码AssemblyDefinition asm = AssemblyFactory.GetAssembly("MyLibrary.dll");
foreach (TypeDefinition type in asm.MainModule.Types)
{if (type.Name == "Class1"){foreach (MethodDefinition method in type.Methods){if (method.Name == "Test"){foreach (Instruction ins in method.Body.Instructions){if (ins.OpCode.Name == "ldstr" && (string)ins.Operand == "Hello, World!") //关键的地方,找到目的地{CilWorker worker = method.Body.CilWorker;Instruction insStr = worker.Create(OpCodes.Ldstr, "Virus? NO!");worker.InsertBefore(ins, insStr);MethodReference refernce = asm.MainModule.Import(typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)}));Instruction insCall = worker.Create(OpCodes.Call, refernce);worker.InsertAfter(insStr, insCall);Instruction insNop = worker.Create(OpCodes.Nop);worker.InsertAfter(insCall, insNop);break;}}}}}
}
用反射测试一下修改后的程序集。
AssemblyFactory.SaveAssembly(asm, "Test.dll");Assembly testAssembly = Assembly.LoadFrom("Test.dll");
Type class1Type = testAssembly.GetType("MyLibrary.Class1");
Object o = Activator.CreateInstance(class1Type);
class1Type.InvokeMember("Test", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, o, null);4. 获取程序集信息
AssemblyDefinition asm = AssemblyFactory.GetAssembly("Learn.Library.dll");Console.WriteLine("Kind:{0}", asm.Kind);
Console.WriteLine("Runtime:{0}", asm.Runtime);
输出:
Kind:Dll
Runtime:NET_2_0利用 ModuleDefinition.Image 属性,我们可以获取程序集几乎全部的细节信息。包括 CLIHeader、DebugHeader、DOSHeader、FileInformation、HintNameTable、ImportAddressTable、ImportLookupTable、ImportTable、MetadataRoot、PEFileHeader、PEOptionalHeader、ResourceDirectoryRoot、Sections、TextSection 等。

教你怎么用Mono Cecil - 动态注入 (注意代码的注释)相关推荐

  1. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)

    原文:利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...

  2. Spring Boot轻松理解动态注入,删除bean

    原文地址:http://412887952-qq-com.iteye.com/blog/2348445 ​ 我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入 ...

  3. 编译时MSIL注入--实践Mono Cecil(1)

    紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务-MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注 ...

  4. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  5. 使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model

    使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model 2011-09-06 00:21 by 老赵, 8645 visits 这也是之前在珠三角技术沙龙上的示例之一,解决 ...

  6. 教你如何在C++二进制文件中注入git信息

    这篇文章主要给大家介绍了关于怎么在C++二进制文件中注入git信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下 在后端生产环境中,为了方便定位问题,我们需要根据一个binary文件 ...

  7. 【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )

    文章目录 一.动态注入方法 二.完整代码示例 一.动态注入方法 调用 Student 类不存在的方法 , 如果该类重写了 def methodMissing(String name, def args ...

  8. 【Android 逆向】Android 进程代码注入原理 ( 注入本质 | 静态注入和动态注入 | 静态注入两种方式 | 修改动态库重打包 | 修改 /data/app/xx/libs 动态库 )

    文章目录 一.注入本质 二.静态注入和动态注入 三.静态注入两种方式 ( 修改动态库重打包 | 修改 /data/app/packageName/libs/ 下的动态库 ) 一.注入本质 进程注入本质 ...

  9. 巧用Mono.Cecil反射加载类型和方法信息

    最近在做服务的细粒度治理,统一管理所有服务的方法.参数.返回值信息.方便后续的各个模块之间的对接和协作. 目前系统中所有的服务,管理到接口契约粒度,即服务接口声明和服务接口实现.要做服务的细粒度治理: ...

  10. 【转载】使用javassist动态注入代码

    关于java字节码的处理,目前有很多工具,如bcel,asm.不过这些都需要直接跟虚拟机指令打交道.如果你不想了解虚拟机指令,可以采用javassist.javassist是jboss的一个子项目,其 ...

最新文章

  1. php controller 间调用,php – 在CodeIgniter中的另一个Controller中调用Controller函数
  2. 安装cuda时出现 non 7z achive. 报错解决办法 安装文件损坏
  3. F5金飞:“双十一”安全事项三部曲
  4. “新内容 新交互”全球视频云创新挑战赛复赛启幕
  5. 业务功能中包含邮件发送,怎么测试?
  6. 构建简单的微服务架构
  7. python student类_9.Python类和对象
  8. 问题:gateway Invalid host lb://dabing_goods
  9. 为什么说Mobileye最辉煌的5年就是落后的5年
  10. TypeScript转JavaScript的方法。
  11. ps形状工具组的使用
  12. 双本振双输出后接八切一影响其它端口信号
  13. web页面实现拨打电话,发短信等功能
  14. 计算机画图橡皮擦怎么扩大,大师为你演示win7系统画图工具中改变橡皮擦大小的图文教程...
  15. pc计算机shift,电脑上的shift键怎么读?shift表示什么意思?
  16. 如何在win10自带的Edge浏览器中切换成IE浏览器浏览网站
  17. JVM深入学习(十六)-垃圾回收器的分类和性能指标
  18. CodeQL笔记之基本语法(一)
  19. 单机大天使服务器端修改商店,《大天使之剑h5》变态单机版最新开服_无限钻石打造最强阵容_满V公益私服...
  20. 金蝶K/3产品性能稳定性优化指导手册

热门文章

  1. 无线鼠标没反应怎么办
  2. vm虚拟机关机后打不开_VMWARE虚拟机非正常关机导致无法启动的解决办法
  3. android scala,用scala开发android,用spray-json解析json
  4. 伊通一中2021高三高考成绩查询,吉林四平最好的4所高中,第1名一骑绝尘,看看有没有你的母校?...
  5. 英谷Oracle答案,火焰纹章风花雪月各角色能学什么魔法 各角色可习得魔法与熟练度要求一览...
  6. 力扣 2104. 子数组范围和
  7. Web前端期末大作业--中国港珠澳大桥网页设计(HTML+CSS+JavaScript)实现
  8. html5 自动弹出键盘,HTML5 input焦点键盘弹出问题
  9. 能不能过?(C++)
  10. Https Tomcat CSR生成 以及相关操作