.Net 加密原理,加密壳运行库的加载方式(九)
2007-12-05 21:57
232 查看
.Net加密壳的运行库加载方式目前主要分两种。
用得比较多的一种是
向程序集中注入Loader代码,然后给程序集中的每个类型添加静态构造函数。在静态构造函数中调用Loader代码。
目前的加密壳大部分都是这种模式。这种模式,利用了静态构造函数的特性。
应该注意到静态构造函数和Loader代码执行时 运行库是还没有加载的,所以这部分代码是却对不能加密的。
程序集执行起来后,运行库才会被载入。
另外一种,是直接利用windows pe加载器来自动加载加密壳的运行库。
这个熟悉win32的,应该知道修改导入表插入dll方法,这个基本上也就是这个原理。
.Net程序集至少都会有一条导入记录
exe的是 mscoree.dll _CorExeMain
dll的是 mscoree.dll _CorDllMain
可以在运行库中导入这样两个函数,然后直接修改程序集的导入记录。
remotesoft 的 新版 protector好像就是这么做的,它以前的版本也是用的第一种方式。
remtesoft protector 也是属于jit层的加密壳,原理几乎和 CliProtector 一样,
也存在Jit层的漏洞。
这个方式的优点就是程序集加载时,运行库就加载进去了。所以程序集的所有方法都可以加密。
当然这种方法的实现并不像说的这么简单,启动时的运行库安装问题。
需要在框架dll加载的第一时间,安装运行库,
比较保险的方案是在dll的load里面就hook loadlibrary相关函数。
这种方式有一点不好
就是无法实现32位,64位运行库的自适应,需要部署时就明确。虽然在xp以上的系统上可以通过manifest来做,但老的系统就不行了。
所以我在最新的 DNGuard HVM 2.8 中依然采用了第一种方式。
再说说第一种方式,.Net 的静态构造函数中有一个特许的,就是全局静态构造函数(模块静态构造函数)。
这个正常开发使用 C#,VB.Net是做不出来的,用IL或者C++/CLI可以做出来。
这个静态函数是在模块第一次被访问事触发的。
所以有了它可以不用再给所有类型添加静态构造函数了。
兼容性怎么样就不知道了。会不会有例外情况?
用得比较多的一种是
向程序集中注入Loader代码,然后给程序集中的每个类型添加静态构造函数。在静态构造函数中调用Loader代码。
目前的加密壳大部分都是这种模式。这种模式,利用了静态构造函数的特性。
应该注意到静态构造函数和Loader代码执行时 运行库是还没有加载的,所以这部分代码是却对不能加密的。
程序集执行起来后,运行库才会被载入。
另外一种,是直接利用windows pe加载器来自动加载加密壳的运行库。
这个熟悉win32的,应该知道修改导入表插入dll方法,这个基本上也就是这个原理。
.Net程序集至少都会有一条导入记录
exe的是 mscoree.dll _CorExeMain
dll的是 mscoree.dll _CorDllMain
可以在运行库中导入这样两个函数,然后直接修改程序集的导入记录。
remotesoft 的 新版 protector好像就是这么做的,它以前的版本也是用的第一种方式。
remtesoft protector 也是属于jit层的加密壳,原理几乎和 CliProtector 一样,
也存在Jit层的漏洞。
这个方式的优点就是程序集加载时,运行库就加载进去了。所以程序集的所有方法都可以加密。
当然这种方法的实现并不像说的这么简单,启动时的运行库安装问题。
需要在框架dll加载的第一时间,安装运行库,
比较保险的方案是在dll的load里面就hook loadlibrary相关函数。
这种方式有一点不好
就是无法实现32位,64位运行库的自适应,需要部署时就明确。虽然在xp以上的系统上可以通过manifest来做,但老的系统就不行了。
所以我在最新的 DNGuard HVM 2.8 中依然采用了第一种方式。
再说说第一种方式,.Net 的静态构造函数中有一个特许的,就是全局静态构造函数(模块静态构造函数)。
这个正常开发使用 C#,VB.Net是做不出来的,用IL或者C++/CLI可以做出来。
这个静态函数是在模块第一次被访问事触发的。
所以有了它可以不用再给所有类型添加静态构造函数了。
兼容性怎么样就不知道了。会不会有例外情况?
相关文章推荐
- 使用requireJS加载不符合AMD规范的js文件:shim的使用方式和实现原理
- 通过飞信的FetionVM的.net虚拟机来加载.net程序,实现在未安装.net的机器上运行.net程序
- 迅雷、快车、QQ旋风链接的加密解密方式原理
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- 反射的应用,读取properties配置文件中的数据(普通InputStream方式,类加载方式),再调用运行
- 难点总结:Jquery动态加载数据库中的数据(解答人:郭哲 方式:讲述jquery原理及一些函数的使用方法,学会看帮助文档)
- .Net 加密原理,纯Jit层加密壳核心的实现(七)
- 关于客户端自动设置可信站点以及ActiveX控件运行方式的原理说明(转)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- 迅雷、快车、QQ旋风链接的加密解密方式原理
- .NET加密方式解析--散列加密
- 通过飞信的FetionVM的.net虚拟机来加载.net程序,实现在未安装.net的机器上运行.net程序
- 前端性能优化之 —— 图片延迟加载 (原理以及实现方式)
- 以 Console 方式运行、调试、编译 .Net 编写的 Windows 服务
- AMD和CMD的"同步"加载方式原理
- 流加密,一次性密码本的原理,简介,事例以及攻击方式
- 前端性能优化之 —— 图片延迟加载 (原理以及实现方式)
- 一起谈.NET技术,ASP.NET的运行原理与运行机制
- Hbase原理以及基本运行方式和优化
- Android插件化完美实现代码资源加载及原理讲解 附可运行demo