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

在 per method 的dotNet加密中,首要解决的方法体对应关系,即在运行时加密壳如何确定当前要解密的方法体所对应的加密信息。

目前大部分加密壳都直接利用了dotNet的元数据来保存这种对应关系,我们知道在元数据中每个方法都会对应一个RVA值,加密壳可以直接把这个关系记录在RVA的地址处。在框架运行中RVA处的数据会被作为“方法体”在处理流程中直接传递,加密壳通过拦截框架处理流程中的函数,来对“方法体”进行分流处理。即先判断RVA处的数据是否“方法体加密对应信息”,如果是进入加密壳运行库的内部处理,不是则按原框架流程处理。
对于这个“方法体加密对应信息”,最简单的方式是指记录一个指针信息,指向另一处数据块,四字节空间就够了。但是为了和普通没有加密的方法体进行区分,除了这个之外还需要增加一些唯一标识以便能被运行库在运行时安全无误的区分出来。
大家可以用UE打开,加密后的程序集,看看一个方法体RVA处的数据,应该能很容易分别出来哪些是记录的“方法体加密对应信息”。
正是这个原因,所以DNGuard v1.0和同类处理方式的加密壳,对方法体小于某个指定字节数的,就不能进行加密。
因为“方法体加密对应信息”的大小超过的方法体的空间大小,写入的话会覆盖到后面方法体的信息。这实际上也是因为偷懒造成的。可以通过对方法体进行重排来解决这个问题,当然要麻烦很多了。

这种模式实际上就是在元数据保存了一个虚拟表实现了 MethodToken => “方法体加密对应信息” 的对应记录。这个表可以看着是公开的。

在DNGuard 2007 中我没有选择使用对方法体重排的方式来解决这个问题,而是选择了另一个方法,自己记录一个 虚拟表实现:MethodToken => “方法体加密对应信息” 的对应记录。
因为这样有一个好处,就是 这个虚拟表也可以进行加密后保存。另外就是“方法体加密对应信息”中不需要添加标识符 和普通没有加密的方法体进行区分。

在 DNGuard 2007 试用版 中没有使用真正的加密算法来对程序集加密,只是采用了“代码直接挪位”的方式,运行库的“解密”操作只是从另一个位置直接读取的操作。

前面有个朋友分析到DNGuard 试用版里面有一个虚拟表记录了:MethodRid => ILCode。这个就是 虚拟表:MethodToken => “方法体加密对应信息” 在 试用版中退化的模式。

另外因为方法体只是挪位,所以它实际上还是在程序集文件内,加载到内存中后也在程序集模块的内存空间中。而不是那位朋友说的 运行库在解密后将 IL代码 填回到内存里面去了。

试用版只是提供给用户验证 DNGuard 是否适合自己的软件项目以及系统发布环境,请不要用试用版 加密程序集后直接分发。

时间: 2024-10-07 07:11:54

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

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

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

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

在上一回 .Net 加密原理,方法体加密信息对应关系的实现  中介绍了实现加密壳首要解决的基础问题, 今回以第一种实现模式介绍如何实现一个纯EE层(mscorwks.dll)的加密壳内核. 首先确定 "方法体加密对应信息" 直接通过元数据来保存. 这里我们使用最简单的记录方式--记录一个四字节的指针信息. 另外再加上一个标识数据,这个我们采用一个 magic DWORD表示. 这样记录信息一共是8字节.所以方法体小于8字节的Method将不能被加密处理. 接下来就是加密壳运行库核心的实

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

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

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

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

PGP加密原理

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

U盘加密原理你了解多少

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

U盘加密原理相关介绍

  随着U盘的广泛应用,人们也越来越离不开U盘,也就有重要的文件储存在U盘里,这时对U盘进行加密就变得十分重要.U盘加密究竟有哪些方式呢? u盘中采用的数据保护技术一般分软件和硬件两种,前者利用软件进行加密,后者将专用加密芯片做到u盘中,从硬件层面进行加密.那么二者之间有何区别? 简单的来说,硬件加密技术一般所指的是采用AES 128位或256位硬件数据加密技术对产品硬件进行加密,具备防止暴力破解.密码猜测.数据恢复等功能.而软件加密则是通过产品内置的加密软件实现对存储设备的加密功能.同时实现硬

Android实现短信加密功能(发送加密短信、解密本地短信)_Android

短信加密此类功能由于新手学习的需求量较小,所以在网上很少有一些简单的demo供新手参考.小编做到此处也是花了比较多的时间自我构思,具体的过程也是不过多描述了,讲一下demo的内容.       demo功能: 1.可以发送短信并且加密(通过改变string中的char) 2.能够查看手机中的短信 3.能够给收到的加密短信解密. 涉及到的知识点: 1.intent bundle传递 2.ContentResolver获取手机短信 3.listveiw与simpleAdapter 4.发送短信以及为

ASP.NET加密技术的应用(加密类代码参考)

asp.net|参考|加密  /**//**********************Created by Chen************************** *如果你觉得本人的文章好,要引用请尊重著作人的劳动果实,说明 *出处以及原创作者,Thank you!!!   email:aishen944-sohu.com *******************************************************************/ using System;usi