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

本文主要对 《.Net 反射脱壳机核心源代码 》一文代码的原理和使用进行详细介绍。

首先介绍一下代码主要流程:
入口函数
void DumpAssembly(Assembly ass,string path)
枚举所有type,调用
void DumpType(Type tp, BinaryWriter sw)
枚举所有方法,调用
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);

}

对于 DumpAssembly, DumpType 在很久以前的文章里面就已经介绍过了,这里就不再重复。本次主要介绍 DumpMethod 以及被 DumpMethod直接或间接调用的函数。

在我之前的一篇文章《Net内存程序集通用脱壳机实现原理(二、反射以及重建方法头) 》 中介绍过,方法体是由三部分组成的, 方法头+IL字节码+SEH Table。

再来看 DumpMethod 的代码,首先获取 MethodBody ,这里要注意不是所有方法都存在 MethodBody,像PInvoke 调用 api的方法就没有MethodBody。在元数据中 rva 等于 0 的方法,就是没有MethodBody的方法。在C#中我们可以直接判断返回值是否 null 来确定这一点。
获取方法体后调用SetOffset , 这个函数用来设置当前方法体在文件中的偏移量。设置好偏移量后,我就可以直接把方法体的三部分写入文件了。

SetOffset函数,通过元数据查找方法体的rva,然后
int offsetra = (int)(offsetrva - 0x1000);
计算出文件中的偏移量,注意这里的 0x1000 是硬编码,你可能需要调整这个值,或者根据pe的section自动计算这个值。

WriteHeader 函数 中,首先调用 IsTiny 判断当前方法体是否 Tiny方法体,然后进行相应的方法头重构并写入文件。

WriteILCode 这个函数很简单,就是直接把IL字节码写入文件,在这个函数的最后处理了4字节对齐问题,SEH TABLE起始位置需要要4 byte对齐的。

最后调用 WriteSEH(sw, mbd) 重构SEH TABLE并写入文件,完成一个方体的dump工作。

WriteSEH 函数中,首先判断当前是否包含异常处理结构,如果没有就直接返回了。
然后 判断 SEH TABLE 是 Tiny的还是 Fat的。
再分别重构相应格式的SEH TABLE。

SEH TABLE 也是由两部分组成的,sehHeader + sehRows。
其中 不管是tiny还是fat的seh,其sehHeader都占用 4 字节空间。
按照cli标准重构seh比较简单,其中有一个麻烦事,就是 catch子句中,被catch的异常类在当前程序集中的token值。
我们能够在C#中直接得到这个 异常类的 type 对象,但是通过 type的metatoken得的值是它在其被定义程序集中的token值,也就是它是一个 typedef值,如果它就是在当前程序集中定义的,那么可以直接使用。如果不是,就需要解析它的 typeref token值了。这个由函数 int GetTypeToken(Type tp) 来实现。

注意 GetTypeToken 使用了 if (tp.Assembly == Assembly.GetEntryAssembly())
来判断 是否同一程序集,因为这里假定了 当前dump的就是 EntryAssembly。你可能需要根据实际情况修改。

查找 typeref值的原理,首先通过type对象获取 异常类的完整名称,然后通过元数据枚举所有引用的 类型,通过 名称比较。名字一样的就是了。

使用:
如何使用这个类来自己实现反射脱壳机?
首先你需要修改 DumpAssembly 为 public的函数。
然后实例化这个类,调用 DumpAssembly 函数即可。
第一个参数你你要dump的 Assembly 对象,第二个参数是这个 Assembly dump后的存储路径。注意第二参数,这里没有实现pe dumper 的功能,你需要先用pe dumper把程序集dump到 磁盘,然后把这个路径 作为参数传入。

尝试过直接用pe dump的人应该都清楚,直接从内存里面整个dump出来的程序集,方法体也是空的,然后这个类实现的功能,就是补充方法体的内容。

另外前面提到的这个类需要改造的地方
1,SetOffset函数。
2,GetTypeToken函数。

还有就是这个类中使用的 WrapperClass 实际上是 。net 元数据API的包装类,元数据api可以参考 msdn。

 

 

 

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

.Net 反射脱壳机代码核心代码详解的相关文章

android app进行代码混淆实例详解

  android app进行代码混淆实例详解         接到一个新的任务,对现有项目进行代码混淆.之前对混淆有过一些了解,但是不够详细和完整,知道有些东西混淆起来还是比较棘手的.不过幸好目前的项目不是太复杂(针对混淆这块来说),提前完成--现总结之. 第一部分 介绍下操作流程(eclipse): 1.打开混淆器:找到项目根目录下的project.properties文件,将"#proguard.config=${sdk.dir}/tools/proguard/proguard-andro

c#-远程唤醒电脑代码,求详解

问题描述 远程唤醒电脑代码,求详解 private IPEndPoint point;private UdpClient client = new UdpClient();/** 唤醒远程机器方法 @param mac 要唤醒的机器的MAC IP port udp消息发送端口* 摘要:唤醒方法为网卡提供的魔术封包功能,即以广播模式发送6个FF加上16遍目标MAC地址的字节数组**/private void wakeUp(string mac int port string ip){byte[]

Python实现屏幕截图的代码及函数详解_python

废话不多说,先给大家看下python实现屏幕截图的代码,具体代码如下所述: from selenium import webdriver import time def capture(url, save_fn="capture.png"): browser = webdriver.Firefox() # Get local session of firefox browser.set_window_size(1200, 900) browser.get(url) # Load pag

JavaScript代码复用模式详解

 代码复用及其原则 代码复用,顾名思义就是对曾经编写过的代码的一部分甚至全部重新加以利用,从而构建新的程序.在谈及代码复用的时候,我们首先可以想到的是继承性.代码复用的原则是: 优先使用对象组合,而不是类继承 在js中,由于没有类的概念,因此实例的概念也就没多大意义,js中的对象是简单的键-值对,可以动态的创建和修改它们. 但在js中,我们可以使用构造函数和new操作符来实例化一个对象,这与其他使用类的编程语言在语法上有其相似之处. 例如: var trigkit4 = new Person()

代码-工厂模式详解?有谁知道?

问题描述 工厂模式详解?有谁知道? 设计模式有哪些,谁那里有详细解答还包含案例的,谢谢 本人刚写代码,很多不会,多多指教 解决方案 这不遍地都是嘛https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3&rsv_pq=c03a44b70000596c&rsv_t=5

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

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

.Net 反射脱壳机核心源代码

using System;using System.Collections.Generic;using System.Text;using System.Reflection;using System.IO;using System.Windows.Forms;namespace testdd{    public class Class1    {        private bool IsTiny(MethodBody mbd)        {            if(mbd.Max

WordPress中的shortcode短代码功能使用详解_php实例

WordPress 从 2.5 的版本开始,增加了一个 shortcode (短代码) API ,类似于 BBS 上的 BBCode , shortcode 也可以很方便的为文章或页面增加功能,并且 shortcode 的比起 BBCode 更加灵活和强大.下面 Kayo 为大家介绍一下 shortcode . 一.shortcode 简介shortcode 可以让开发者通过以函数的形式创建宏内容来生成内容,或许这个概念看上去有点模糊,但实际上它是一个很简单而实用的功能,只要会编写基本的 PHP

360通用php防护代码(使用操作详解)_php技巧

360发布通用php防护代码,其实最初是协助phpcms来防护安全用的,现在看来可以加入到任何有漏洞的网站里面,拿phpcmsv9问题,解决方案如下,其他网站以此类推! 1.将360_safe3.php传到要包含的文件的目录 2.在页面中加入防护,有两种做法,根据情况二选一即可: a).在所需要防护的页面加入代码require_once('360_safe3.php');就可以做到页面防注入.跨站如果想整站防注,就在网站的一个公用文件中,如数据库链接文件config.inc.php中!添加req