• 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  中的信息完成的。



  • 相关阅读:
    Algs4-1.3.37Josephus问题
    Algs4-1.3.35随机队列
    Algs4-1.3.33一个双向队列Deque的可变长环形数组实现
    Algs4-1.3.34随机背包
    Algs4-1.3.33一个双向队列Deque-双向链表实现
    Algs4-1.3.32链表实现Stack和Queue的合体Steque
    Algs4-1.3.31实现双向链表
    Algs4-1.3.30反转链表
    C语言多级指针
    spring mvc@ModelAttribute与@SessionAttributes的执行流程
  • 原文地址:https://www.cnblogs.com/rick/p/561556.html
Copyright © 2020-2023  润新知