欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

.NET CLR注入方法探讨

来源:本站整理 作者:佚名 时间:2019-04-09 TAG: 我要投稿

0x01 基础概念
首先要说一些基础:
CLR 和 托管代码(Manage Code)
中间语言 (IL)
元数据和PE文件
CLR 和 托管代码(Manage Code)
.NET Framework 提供了一个称为CLR(Common Language Runtime)的运行时环境,所以.NET 的程序,都是在CLR中运行的。
使用基于CLR的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
MS的一些语言,例如C#、VB、F#,都是在 CLR 中运行的。可以将CLR理解为他们的运行环境。
中间语言 (IL)
对.NET 高级语言编写的代码进行编译,就会得到一个由IL构成的二进制文件。类似于就jvm中的字节码。
IL构成的二进制文件在运行时,会交由CLR进行接管,并由CLR进行翻译(JIT),生成可以直接运行的机器码,最后进行执行。
IL有时也称为通用中间语言(CIL)或Microsoft中间语言(MSIL)。
 
元数据(Metadata)和PE文件
元数据是描述程序的二进制信息,存储在PE文件或内存中。当将基于dot NET编写的代码编译为PE文件时,元数据和IL代码将写入到PE文件中。
我们可以通过反编译来了解程序集或可执行文件中包含的Metadata和IL的秘密,打开ILDasm并加载实现准备的程序集,我们可以看到托管PE文件的相关内容:

.NET是基于面向对象的,所以元数据描述的主要目标就是面向对象的基本元素:类、类型、属性、方法、字段、参数、特性等,主要包括:
定义表,描述了源代码中定义的类型和成员信息,主要包括:TypeDef、MehodDef、FieldDef、ModuleDef、PropertyDef等。
引用表,描述了源代码中引用的类型和成员信息,引用元素可以是同一程序集的其他模块,也可以是不同程序集的模块,主要包括:AssemblyRef、TypeRef、ModuleRef、MethodsRef等。
指针表,使用指针表引用未知代码,主要包括:MethodPtr、FieldPtr、ParamPtr等。
堆,以stream的形式保存的信息堆,主要包括:#String、#Blob、#US、#GUIDe等。
.NET 程序编写运行的流程为:

这里只是简单描述了一些基础,还有一些重要的概念:应用程序域,程序集,JIT等,读者可以进行深入了解。
推荐:
你必须知道的.NET
《CLR via C#》
《CLR via C#, Second Edition (Pro Developer)》
 
0x02 History Review
开始进入主题。
我们的目的是在CLR中,对运行的方法进行注入、劫持。比如 function A 调用的时候,实际执行的功能确是 function B。
已经有人做过该方面的研究,也提出了几种可行的方案:
劫持 compileMethod
Install trampoline
使用Profiling API
每种方案各有优劣,稍微介绍一下。
0x02-00 劫持 compileMethod
Jerry Wang 提出了一种 hook compileMethod的方法。
代码编译得到的PE文件在运行的时候,会调用JIT进行处理,翻译成机器可以执行的机器码。
JIT的实现DLL(对于.NET 4以上是 clrjit.dll / 对于.NET 2.0-3.5是 mscorjit.dll )导出一个 _stdcall 的方法 getJit ,此方法返回一个 ICorJitCompiler 。
CLR的实现DLL(对于.NET 4以上是 clr.dll / 对于.NET 2.0-3.5是 mscorwks.dll)调用 getJit 方法来取得 ICorJitCompiler ,然后调用它的 compileMethod 方法来将MSIL代码编译为本机代码。
JIT 处理操作根据 .NET 版本不同,分别位于 clrjit.dll 或者 mscorjit.dll 中,其中实现了一个名为getJit返回 ICorJitCompiler。
CLR 相关操作根据 .NET 版本不同,分别位于 clr.dll 或者 mscorjit.dll,调用 getJit 方法来取得 ICorJitCompiler, 然后调用compileMethod 方法将MSIL代码编译为本机代码。
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
#include "standardpch.h"
#include "icorjitcompiler.h"
#include "icorjitinfo.h"
interceptor_IEEMM* current_IEEMM = nullptr; // we want this to live beyond the scope of a single compileMethodCall
CorJitResult __stdcall interceptor_ICJC::compileMethod(ICorJitInfo*                comp,     /* IN */
                                                       struct CORINFO_METHOD_INFO* info,     /* IN */
                                                       unsigned /* code:CorJitFlag */ flags, /* IN */
                                                       BYTE** nativeEntry,                   /* OUT */

[1] [2] [3] [4] [5] [6]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载