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

在 .Net程序加密的原理及解密探讨三(实例解密)  一文中我们介绍了反射,
主要提到三个函数
 DumpAssembly,DumpType, DumpMethod。

这里我们将就 DumpMethod 这个函数讨论。

前一篇我们已经提到的dump的整体流程。
先把PE整体dump出来,然后在文件后面增加一个段。

接下来就是这次要讲的反射和方法体重建。
依靠上面的三个函数反射枚举所有方法。

取得 MethodBody 对象,重建 方法体,将方法体保存到 PE文件新建的段中,修改元数据中该方法对应的RVA,指向刚保存的位置。
只修改元数据中方法的RVA值,元数据的大小不会改变,所以元数据最后可以直接写回到原始位置。

下面介绍方法体重建。

DotNet程序一个方法的函数体一般由三部份组成。
ILHeader + ILByteArray + [DataSection]
其中第三部份是可选的,有些方法只有前两个部分。

前面提到的 MethodBody.GetILAsByteArray 是函数体的第二部分。
所以现在的任务是重建第一部分和第三部份。
今回只介绍第一部分的重建。

ILHeader 分两种模式 Tiny的和 Fat的,Tiny的Header只有1字节,Fat的Header有12字节。
为了简便起见,我们可以全部重建为Fat的Header。

先看看 Fat Header的定义
typedef struct IMAGE_COR_ILMETHOD_FAT
{
    unsigned Flags    : 12;     // Flags
    unsigned Size     :  4;     // size in DWords of this structure (currently 3)
    unsigned MaxStack : 16;     // 
    DWORD   CodeSize;           // size of the code
    mdSignature   LocalVarSigTok;    
} IMAGE_COR_ILMETHOD_FAT;

红色的三项一共 4 字节。mdSignature   大小也是4字节。整个结构12字节。
1、Size 的值是 3,固定不变的。
2、MaxStack的值 取 MethodBody.MaxStackSize 即可。
3、CodeSize 的值就是 MethodBody.GetILAsByteArray 字节数组的长度。
4、LocalVarSigTok 的值 取 MethodBody.LocalSignatureMetadataToken 即可。

这个Fat Header的重建还是很容易的,现在只剩下 Flags 的值了。
这里我们只需要给 Flags 赋 三个标志值。
第一个 标识该函数体是 Fat 格式:0x03

第二个 标识该函数是否 InitLocals:0x10
我们可以通过 MethodBody.InitLocals 来判断是否需要增加一个标识值。

第三个 标识该函数是否有异常处理结构:0x08
这个可以通过 MethodBody.ExceptionHandlingClauses 这个列表的大小判断是否需要增加这个标识值。

如果函数没有异常处理结构,那么整个方法体的重建工作就完成了。
如果有,就需要继续重建 第三部份了。

而第三部份的重建就是依靠 MethodBody.ExceptionHandlingClauses  中的信息完成的。

时间: 2024-10-23 01:40:18

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

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

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

本文将在 .Net 反射脱壳机核心源代码 的基础上介绍,如何实现 Jit层脱壳 机. 首先我们选择使用 C++/CLI 来完成这个工作.反射部分需要用到 .Net的相关类库,jit 层 hook 需要使用native c++ 方面的功能.本文假设您已经完成了 hook jit的工作,并截获到了相关结构体. 首先介绍一下代码主要流程: 入口函数 void DumpAssembly(Assembly ass,string path) 枚举所有type,调用 void DumpType(Type tp

三星Note4全机型通用刷机教程

  三星Galaxy Note4是三星今年的旗舰机型,在保持优秀的性能的同时也带来了众多的特色功能,不过,作为Android手机,自然免不了要刷机,让手机更精简,特别是对于三星的手机,许多功能和应用对消费者来说其实并没有什么用处. 而三星的手机拥有众多的版本,所以刷机时需要多注意,不过通用版显然更适合大多数用户. 一.刷机注意 此刷机教程适用Samsung_Galaxy_Note4所有机型. 在刷机前需要做以下工作,防范于未然: 1.下载三星通用刷机工具Odin 3.09 2.下载安装三星通用U

成功后的通用翻译机将有何意义

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 日前,谷歌方面透露了一项关于通用翻译的项目计划,引起了众多媒体对未来的科技新生活的展望!按照谷歌透露的此份计划,如若通用翻译机功能趋于完善,人们将能够直接对着通用翻译设备说英文,让语音接收者收听到他能够听懂的语言. 语言障碍一直都在阻碍着社会生产的发展,成功后的通用翻译机必然会对传统的社会生产方式产生冲击,在带来新时代发展机会的同时,通用翻译

python简单获取本机计算机名和IP地址的方法

  本文实例讲述了python简单获取本机计算机名和IP地址的方法.分享给大家供大家参考.具体实现方法如下: 方法一: ? 1 2 3 4 5 6 7 8 9 10 >>> import socket >>> hostname = socket.gethostname() >>> print hostname china-43226208c >>>ip = socket.gethostbyname(hostname) >>

python获取本机mac地址和ip地址的方法

  这篇文章主要介绍了python获取本机mac地址和ip地址的方法,涉及Python获取系统相关信息的技巧,需要的朋友可以参考下 本文实例讲述了python获取本机mac地址和ip地址的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 import sys, socket def getipaddrs(hostname): result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM) retu

win7系统电脑经常死机的几种原因及修复方法

  解决方法如下: 1.如果你会进入bios界面的话,首先进入bios界面查看一下自己的cpu温度是否过高,一般超过70°就算是很高的温度了.这样的温度足够让你的电脑死机. 2.若是温度过高,建议你拆开机箱,看看风扇是否运行正常,若不正常就需要去换个新的. 再看看散热片有没有和cpu接触良好,若没有重新安装稳妥. 再看看cpu上面的热硅脂有没有涂抹,是否涂抹均匀,不行的话,自己重新涂过. 看看cpu是否超频,若是超频,就降频. 若上面都不懂,直接去电脑维修站吧. 3.可能会是多个杀毒软件的安装导