zoukankan      html  css  js  c++  java
  • .Net 加密原理, 纯EE层加密壳内核的实现(二)

    在上一回 .Net 加密原理,方法体加密信息对应关系的实现  中介绍了实现加密壳首要解决的基础问题,
    今回以第一种实现模式介绍如何实现一个纯EE层(mscorwks.dll)的加密壳内核。

    首先确定 “方法体加密对应信息” 直接通过元数据来保存。
    这里我们使用最简单的记录方式--记录一个四字节的指针信息。
    另外再加上一个标识数据,这个我们采用一个 magic DWORD表示。
    这样记录信息一共是8字节。所以方法体小于8字节的Method将不能被加密处理。

    接下来就是加密壳运行库核心的实现了。这里以早期DNGuard v1.0的运行库实现为例。

    在mscorwks.dll 中有一个函数 GetILHeader,框架所有需要取方法体的地方都是通过调用这个函数实现的。
    这个函数的原型 COR_ILMETHOD* __fastcall GetILHeader(DWORD_PTR RuntimeMethodHandler);
    可以看着这样 DWORD* __fastcall GetILHeader(DWORD_PTR MethodPtr);

    在我们的加密壳运行库中实现这个函数,然后用运行库实现的这个函数替换 mscorwks.dll 中的这个函数,
    这个过程就是一个标准的 api hook 过程,这里就不详细介绍了。

    这样 .Net 框架在需要取方法体时就会进入到我们运行库的这个函数中。


    在运行库的函数如: DWORD* __fastcall DNGuard_GetILHeader(DWORD_PTR MethodPtr) 中。
    首先我们调用原始的 GetILHeader,得到返回值,
    首先判断返回值的前四个字节是否 magic DWORD,
    (因为我们把对应关系记录在元数据中的,所以省去自己查询虚拟表的过程,框架已经帮我们完成了。)
    如果不是,则直接返回。
    如果是,则根据后面的四个字节执行的数据进行方法体的解密,然后把解密结果返回。

    DWORD* __fastcall DNGuard_GetILHeader(DWORD_PTR MethodPtr)
    {
     DWORD* pIL = OrgGetILHeader(MethodPtr);
     if(*pIL == gdwMagic)
     {
      pIL = DecryptMethod(pIL[1]);
     }
     return pIL;
    }


    这样一个 EE 层加密壳核心运行库就算完成了。

    这种方式兼容性非常好,不会破坏dotNet原有的任何功能,自然也就包含反射功能了。
    在 .Net 2.0 中这种加密壳运行库 就会出现反射漏洞了。

    下回再介绍这种核心的改进--针对反射漏洞。

  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/rick/p/878969.html
Copyright © 2011-2022 走看看