.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 中这种加密壳运行库 就会出现反射漏洞了。

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

时间: 2024-09-28 00:07:34

.Net 加密原理, 纯EE层加密壳内核的实现(二)的相关文章

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

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

.Net 加密原理,方法体加密信息对应关系的实现(一)

在 per method 的dotNet加密中,首要解决的方法体对应关系,即在运行时加密壳如何确定当前要解密的方法体所对应的加密信息. 目前大部分加密壳都直接利用了dotNet的元数据来保存这种对应关系,我们知道在元数据中每个方法都会对应一个RVA值,加密壳可以直接把这个关系记录在RVA的地址处.在框架运行中RVA处的数据会被作为"方法体"在处理流程中直接传递,加密壳通过拦截框架处理流程中的函数,来对"方法体"进行分流处理.即先判断RVA处的数据是否"方法

.Net 加密原理,加密壳核心的兼容性以及安全性讨论(六)

前面我们介绍了目前主流的双层加密壳核心实现原理, 同时提到了应对兼容性,同时考虑安全性的前提下对加密壳核心进行简化. 今回主要讨论一下安全性.兼容性需要注意哪些因素. 关于安全性,主要应对两类破解者. 1.静态分析脱壳 对于这一类,行之有效的方法就是增加加密算法的数量和复杂度. 加密壳核心的实现方式对其影响可忽略. 2.动态框架核心层拦截 对于这一类有两种防范,一是针对框架核心层进行检测,对Hook进行反制. 二是构造合理的加密壳核心模式,将核心数据局限在加密壳运行库范围内, 使破解者在加密壳运

.Net 加密原理,HVM核心的实现原理(八)

目前加密壳将核心转移到Jit层后,内核模式的强度增加空间已经很小了.目前市面上的加密壳至少有一个共同的缺陷,无法防止Jit底层截获IL字节码. 有些壳采用从周边增加强度(如 Anti Hook),由于hook的多样性再加上壳又需要考虑自己的兼容性,所以这个效果不是十分理想. 从防止脱壳入手,通过保护局部变量签名和异常处理表,来阻止方法体的脱壳还原.这样虽然不能阻止截获IL字节码,如果配合流程混淆还是能起到相对有效的保护. 这样仍然有些遗憾,能实现阻止Jit层截获完整的IL字节码就完美了. htt

PGP加密原理

PGP是一个基于RSA公匙加密体系的邮件加密软件.可以用它对你的邮件保密以防止非授权者阅读,它还能对你的邮件加上数字签名从而使收信人可以确信邮件是你发来的.它让你可以安全地和你从未见过的人们通讯,事先并不需要任何保密的渠道用来传递密匙.它采用了:审慎的密匙管理,一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等,还有一个良好的人机工程设计.它的功能强大有很快的速度.而且它的源代码是免费的.实际上PGP的功能还不止上面说的:;PGP可以用来加密文件,还可以用PGP代替UUen

非对称加密(1)非对称加密原理

现在我们已经知道对称加密的一个最大的问题是如何安全地传输密钥,并且在对称加密的体系下找不到好的解决方案.1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是"公开密钥系统".相对于"对称加密算法"这种方法也叫做"非对称加密算法". 与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey

U盘加密原理你了解多少

  U盘中采取的数据保护技术一般分为两种:一种是软件加密,一种是硬件加密,关于两种加密措施,他们之间有什么区别呢?下面我们要来说说U盘加密的原理. 简单的来说,硬件加密技术一般所指的是采用AES 128位或256位硬件数据加密技术对产品硬件进行加密,具备防止暴力破解.密码猜测.数据恢复等功能.而软件加密则是通过产品内置的加密软件实现对存储设备的加密功能.同时实现硬件加密的方式主要有键盘式加密.刷卡式加密,指纹式加密等.而软件加密主要有密码加密.证书加密.光盘加密等. 当然两者加密方式都有各自的优

java 字符串加密-纯数字字符串加密解密

问题描述 纯数字字符串加密解密 已知纯数字组成字符串,长度有限(比如20位).能否加密后密文依然是纯数字组成,但是长度变短,比如20位以内 且可解密.求一下思路 解决方案 不结贴不给分的没人回答,自己百度 解决方案二: 直接没法变短,除非类似压缩方式.

内核级驱动层加密软件哪家强!!!

问题描述 公司需要挑选一款内核级驱动层加密软件目前物色到的软件有:绿盾信息安全管理软件华途文档安全管理系统敏捷安全卫士请各位大神分析下哪个软件比较好,性价比比较高.或者您认为其他软件好也可以推荐.我们公司中型企业,主要从事的是电子设备的对外贸易,企业OA.ERP系统上用的.请各位大神帮忙推荐分析下吧!感激不尽!!!! 解决方案 解决方案二:找山东蓝翔呀解决方案三:那个谁神回复啊!解决方案四:山东蓝翔解决方案五:咋样了哥们,提供一下使用意见吧,我们公司也在选用加密软件.解决方案六:找内核驱动层加密