.Net Jit层脱壳机的实现原理

本文将在 .Net 反射脱壳机核心源代码 的基础上介绍,如何实现 Jit层脱壳 机。

首先我们选择使用 C++/CLI 来完成这个工作。反射部分需要用到 。Net的相关类库,jit 层 hook 需要使用native c++ 方面的功能。
本文假设您已经完成了 hook jit的工作,并截获到了相关结构体。

首先介绍一下代码主要流程:
入口函数
void DumpAssembly(Assembly ass,string path)
枚举所有type,调用
void DumpType(Type tp, BinaryWriter sw)
枚举所有方法,调用
void DumpMethod(MethodBase mb, BinaryWriter sw)

和反射脱壳机不一样的地方就是  最后这个函数 DumpMethod 其它的都基本上一样。

先看反射脱壳的实现:
void DumpMethod(MethodBase mb, BinaryWriter sw)
{
MethodBody mbd = mb.GetMethodBody();
if (mbd == null)
return;
SetOffset(sw, mb.MetadataToken);

WriteHeader(sw, mbd);

WriteILCode(sw, mbd);

WriteSEH(sw, mbd);

}
从上可以看出,dump一个method需要知道4个东西,token,方法头,ILCode,SEH。

jit层脱壳,这个怎么实现呢?
DumpMethod函数只需要 invoke方法,让其进入jit处理过程即可。
这里需要注意一点:
方法是private的,外界无法访问,怎么办?

这里我需要用到 net 2.0的又一个新特性:DynamicMethod 。
看msdn的介绍:
"可以使用 DynamicMethod 类在运行时生成和执行方法,而不必生成动态程序集和动态类型来包含该方法。动态方法是生成和执行少量代码的最有效方式。

动态方法在逻辑上与模块或类型关联。如果与模块关联,动态方法对于该模块在全局范围内有效。如果有足够的权限,动态方法可以跳过实时 (JIT) 可见性检查,访问在该模块中所声明类型的私有数据。可以将动态方法与任何模块关联,无论该模块是否由您创建。

如果动态方法与类型关联,动态方法可以访问该类型的私有成员。除非动态方法需要访问在同一模块中声明的其他类型的私有数据,否则无需跳过 JIT 可见性检查。可以将动态方法与任何类型关联。
"
动态方法可以跳过 jit 可见性检查。这是我们最关心的。通过它我们解决的private方法的问题。

和反射脱壳相比,jit层脱壳真正的DumpMethod 应该是在 hook处理函数中。
即在 hook 到一个jit请求后,回调真正的 DumpMethod 实现来完成 一个方法体的脱壳。

问题:怎么知道当前jit处理的是哪个方法体呢?

"

MethodBase.GetMethodFromHandle (RuntimeMethodHandle) 通过使用方法的内部元数据表示形式(句柄)获取方法信息。

"
这个函数可以解决这个问题。
传入的参数,就是我们在 jit hook中截获的 MethodDesc* 的指针变量。这个结构体在sscli里面是没有其明确资料的。但是它可以通过这个函数转换为 。Net中的 Method对象。

这样前面提到的dump一个方法体需要的 4个东西,这里就知道了两个了, token 和 ILCode(jit hook直接取得的)。

如果是tiny method。方法体也可以重构出来了。之前介绍反射重构的帖子中又详细介绍。

如果是fat method呢?
有两个难点:
1。方法头 中的localsig 的token。 2。SeH 的重构。
完全从jit hook到的结构体中重构需要费一番周折,有可能会和壳的实现相关。
对于有些加密壳,可以通过投机的方式取得这两个东西。(因目前国内某壳也受此影响,在其新版改进之前,暂不公开这个方式)

单纯jit层的加密壳可以从这两点,增加脱壳的难度。

DNGuard 标准版对这两部分做了特许处理。
标准版预计在一个星期内完成。演示版RC1已经基本完成,近两天就会发布。

DNGuard 专业版,除了对这两个的处理,对ILCode也进行了处理,标准版发布后,
需要再花时间对 专业版 IL模拟部分 进行一次全面的检测。

时间: 2024-07-28 23:30:17

.Net Jit层脱壳机的实现原理的相关文章

.Net 加密原理,纯Jit层加密壳核心的实现(七)

前面我们介绍了目前主流的双层加密壳核心实现原理, 以及应对兼容性,同时考虑安全性的前提下对加密壳核心进行简化. 并就加密壳核心的兼容性以及安全性进行了讨论 ,提到了加密壳核心兼容性和安全性共赢的实现模式,纯Jit层核心. 今回我们将介绍这种加密壳核心的实现. 前面我们已经将加密壳核心简化为只Hook框架内核的两个函数,mscorwks.dll中一个,mscorjit.dll中一个. 同时在兼容性方面我们了解到mscorwks.dll是一个瓶颈问题,所以我们将要抛弃核心对mscorwks.dll的

.Net 反射脱壳机代码核心代码详解

本文主要对 <.Net 反射脱壳机核心源代码 >一文代码的原理和使用进行详细介绍. 首先介绍一下代码主要流程: 入口函数 void DumpAssembly(Assembly ass,string path) 枚举所有type,调用 void DumpType(Type tp, BinaryWriter sw) 枚举所有方法,调用 void DumpMethod(MethodBase mb, BinaryWriter sw) { MethodBody mbd = mb.GetMethodBod

.Net 2.0 通用反射脱壳机完整版

之前发了一个实验品http://bbs.pediy.com/showthread.php?t=45184 功能还不完善,这个是完整的版本. 能脱压缩壳,整体加密壳,有反射漏洞的加密壳. 方法:采用的是注入方式,注入到目标进程.注入后会看到一个列表界面.在这个列表里面会显示出当前进程中的所有程序集. 首先在列表里面选择一个要脱壳的程序集. 然后选择保存路径.(注1) 在就脱壳. 程序使用的是 VS2005 C++/CLI 需要相关运行库 mfc80u.dll msvcr80.dll msvcm80

Net内存程序集通用脱壳机实现原理(一注入)

正如前面提到的DotNet 程序的脱壳和普通PE文件的脱壳是有密切关系的.传统PE文件dump大部分都是进程外dump,这里我们介绍的DotNet程序集的脱壳使用进程内dump. 所以第一步就是注入问题,如何让我们的程序在目标进程内运行?传统的win32 注入dll,相信大家都熟悉了吧,得益于C++/CLI的特性,我们能依靠传统的方式注入我们的程序到目标进程中. 用VS2005新建一个mfc dll,然后在工程属性里面开启 clr支持,这样在这个dll就能使用 CLR 了.而这个dll又能像传统

Net内存程序集通用脱壳机实现原理(二、反射以及重建方法头)

在 .Net程序加密的原理及解密探讨三(实例解密)  一文中我们介绍了反射,主要提到三个函数 DumpAssembly,DumpType, DumpMethod. 这里我们将就 DumpMethod 这个函数讨论. 前一篇我们已经提到的dump的整体流程.先把PE整体dump出来,然后在文件后面增加一个段. 接下来就是这次要讲的反射和方法体重建.依靠上面的三个函数反射枚举所有方法. 取得 MethodBody 对象,重建 方法体,将方法体保存到 PE文件新建的段中,修改元数据中该方法对应的RVA

从N层到.NET详细剖析原理(1)

简介 如今,N 层应用程序已经成为构建企业软件的标准.对于大多数人来说,N 层应用程序就是被分成多个独立的逻辑部分的应用程序.最常见的选择是分为三个部分:表示.业务逻辑和数据,当然还可能存在其他的划分方法.N 层应用程序最初是为了解决与传统的客户端/服务器应用程序相关的问题而出现的,但是,随着 Web 时代的到来,这一体系结构开始成为新开发项目的主流. Microsoft Windows? DNA 技术已成为 N 层应用程序的非常成功的基础.Microsoft .NET 框架也为构建 N 层应用

网友原创:从N层到.NET详细剖析原理

原创 摘要:讨论 Microsoft .net 的应用程序设计和所需的更改:检验从使用 Microsoft Windows DNA 构建 N 层应用程序中学到的结构知识,以及如何将这些知识应用到使用 Microsoft .NET 框架构建的应用程序,并且为使用 XML Web Services 的应用程序提供体系结构方面的建议. 简介 如今,N 层应用程序已经成为构建企业软件的标准.对于大多数人来说,N 层应用程序就是被分成多个独立的逻辑部分的应用程序.最常见的选择是分为三个部分:表示.业务逻辑

从N层到.NET详细剖析原理(2)

将数据传递到客户端 对于所有 N 层应用程序而言,将数据从中间层有效地移动到客户端都是一个关键的环节.当使用 DCOM 与 Windows 客户端通信时,Windows DNA 应用程序可以使用 ADO 断开连接的记录集.当确保浏览器为 Internet Explorer 时,此选项也可用于浏览器客户端.而将数据发送到任意浏览器则比较困难.一种方法是显式地将数据转换为 XML,然后将数据和所有必要的脚本代码发送到浏览器. .net 环境 .NET 支持传统的 N 层应用程序.Web Servic

图解接入层交换机防ARP攻击原理

交换机要防御ARP攻击,就必须能够识别并读取ARP报文内容, 然后根据报文内容判断是否存在欺骗攻击行为,对于ARP欺骗报文进行丢弃处理.在接入层就是利用接入交换机的ARP入侵检测(ARP Intrusion Inspection)功能,进行ARP欺骗攻击防御. 498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' height=256 alt="" src="/files/uploadimg/20