栏目分类
热点资讯
hongkongdoll 免费视频 [翻译]基于MSIL字节码注入操作.NET门径-外文翻译-看雪-安全社区|安全招聘|kanxue.com
发布日期:2024-10-04 19:41 点击次数:115
1 – 引子hongkongdoll 免费视频
2 - CLR 环境
2.1 – 基本成见
2.1.1 - Metadata表
2.1.2 - Metadata token
2.1.3 - MSIL 字节码
2.2 – 实施环境
3 - JIT 编译器
3.1 – 编译方法
3.2 – Hook编译方法
4 - .NET Instrumentation
4.1 – MSIL注入计谋
4.2 - Resolving the method handle
4.3 – 基于call领导达成一个跳板
4.4 – 制作一个动态方法
4.5 – 调用用户自界说代码
4.6 – 建立SHE表
5 – 现实样例
5.1 – Web应用密码盗取
5.2 – 坏心软件检测
6 – 论断
7 – 援用
8 – 源代码
--[ 1 – 引子为了找一种在.NET门径运行历程中操作它的新方法,本文咱们将深刻探索.NET框架里面。 践诺上,也曾有一些库不错操作.NET门径,它们大多hook某个方法编译后的代码,或者修改汇编领导并将修改成果写回环件。微软也提供了API用于操作某个门径的实施历程。然则必须在门径实施前通过缔造一些环境变量使该API可用。
咱们的想法是,在不碰二进制汇编代码的情况下,操作运行中的门径。统统功能通过使用一个高档.NET言语达成。正如将看到的,咱们通过在贪图方法被编译前注入稀奇的MSIL代码来达成。
--[ 2 – CLR环境在在意刻画如安在方法中注入稀奇的MSIL代码之前,有必要先先容一些基本成见,如:.NET框架怎样责任,它的基本组件有哪些。咱们只先容与咱们的想法关系的成见。
---[ 2.1 – 基本成见.NET二进制代码践诺上不错看作念是汇编代码(尽管它践诺上莫得任何汇编代码)。它是个自刻画的结构,这意味着在汇编代码中你能找到运行需要的统统信息(更多关系信息见[01])。正如将看到的,这些信息不错通过内存映象窥探到。内存映象大致让咱们对汇编代码界说了哪些类型和方法有全面的了解。咱们相似不错取得传给特定方法的参数的类型和称号。独一丢失的信息是腹地变量的称号,不外这对咱们不进军。
----[ 2.1.1 - Metadata 表注:元数据是刻画数据的数据,.NET是基于面向对象的,是以元数据刻画的主要贪图等于面向对象的基本元素:类、类型、属性、方法、字段、参数、特色等。
上头提到的统统信息存在叫作念Metadata tables的表中。底下的列表摘自援用[02],列出了咫尺统统Metadata表的索引和称号:
00 - Module 01 - TypeRef 02 - TypeDef04 - Field 06 - MethodDef 08 - Param09 - InterfaceImpl 10 - MemberRef 11 - Constant12 - CustomAttribute 13 - FieldMarshal 14 - DeclSecurity15 - ClassLayout 16 - FieldLayout 17 - StandAloneSig18 - EventMap 20 - Event 21 - PropertyMap23 - Property 24 - MethodSemantics 25 - MethodImpl26 - ModuleRef 27 - TypeSpec 28 - ImplMap29 - FieldRVA 32 - Assembly 33 - AssemblyProcessor34 - AssemblyOS 35 - AssemblyRef 36 - AssemblyRefProcessor37 - AssemblyRefOS 38 - File 39 - ExportedType40 - ManifestResource 41 - NestedClass 42 - GenericParam44 - GenericParamConstraint每个表由一系列行构成。行的大小由表的类型决定,而况不错包含对其它Metadata表的援用。那些表皆通过Metadata token来援用,下一节先容Metadata token的成见。
----[ 2.1.2 – Metadata tokenMetadata token(或短 token)是CLR框架的基本成见。 token准许你援用指定表中指定索引值的项。它是个4字节值,由两部分构成[08]:表索引+RID。表索引是 token的最高字节,指向一个表。RID从 token字节偏移1起,长3字节,是表内的一个纪录的指针(其实是个偏移,从2运行每个+1)。动作一个例子,咱们来看底下的Metadata token:
(06)00000F
0x06是援用的表的编号,本例中援用的是MethodDef表(参照2.1.1的表)。临了三字节是RID,本例中值是0x0F。
----[ 2.1.3 - MSIL字节码当咱们用.NET高档言语写门径,编译器将代码诊疗成MSIL或ECMA-335[03]CIL中间暗示时势,它非常于经常所说的中间言语。装配VS会统统装配一个相等好用的器具ILDasm,愚弄它不错通过列出MSIL代码和其它有效信息来反汇编一个汇编门径。动作例子,咱们编译如下的C#源代码:
JIT中实施一个方法有两种情况。第一,方法也曾被编译,这种情况咱们不错平直jump到编译后的unmanaged代码。第二,方法还莫得被编译,这种情况代码jump到一个存根函数,存根函数call导出的compileMethod方法编译并实施该方法,该函数界说在corjit.h [04]。
---[ 3.1 - The compileMethod
再多分析一下这个进军的方法。该方法的函数原型如下:
compileMethod由Clrjit.dll导出(老版块.NET中由mscorjit.dll导出),咱们不错很容易地装配一个hook阻挠统统编译央求。底下是该历程
的F#伪代码:
绝色诱惑
接下来修改咱们遴荐的方法的MSIL缓存并重定向实施流到咱们的代码。正如将看到的,这是一个陡立的历程,要正式一些方面。
---[ 4.1 – MSIL注入计谋为了调用咱们的代码,要解任的要津如下:
在代码运行位置装配一个跳板。该跳板将调用一个动态界说的方法。界说一个特定签名的动态方法构造一个对象数组,包含传给方法的参数。调用一个转发函数,该函数加载咱们的汇编代码,并最终通过一个指向原方法的句柄和包含参数的对象数组动作参数来调用咱们的代码。咱们要创建的结构解任底下图表界说的旅途:
| ----------- hongkongdoll 免费视频