.Net 加密原理,加密壳运行库的加载方式(九)

.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可以做出来。

这个静态函数是在模块第一次被访问事触发的。
所以有了它可以不用再给所有类型添加静态构造函数了。
兼容性怎么样就不知道了。会不会有例外情况?

时间: 2024-08-02 01:14:48

.Net 加密原理,加密壳运行库的加载方式(九)的相关文章

Win7提示“由于主题服务没有运行,主题无法加载”怎么办?

 主题服务没有运行,主题无法加载"怎么办?-"> 解决方法: 1.打开电脑左下角"开始"菜单,找到[控制面板]点击打开; 2.进入控制面板界面,右上方[查看方式]更改为"小图标",然后找到[管理工具]打开; 3.进入"管理工具",点击打开[服务]选项; 4.进入服务列表找到[Themes](主题)服务,双击打开; 5.进入主题服务属性对话框,在"服务状态选项"将其[启动]; 6.启动成功,将上方[启动

单独的两个js可以独立运行,但是加载到同一个页面后,就不能一起运行了

问题描述 单独的两个js可以独立运行,但是加载到同一个页面后,就不能一起运行了 自己封装了两个highcharts的报表封装成了js文件,方便做demo用,但是创建新的页面之后,导入这两个js文件,只能有一个显示,另一个不显示,而且显示的那个JS还不在指定的位置上,而是在那个不显示的js 的位置上,求大侠帮助啊~ 解决方案 两个js里面命名又冲突吧,东西拿出来看看啊 解决方案二: 应该是两个js里面命名冲突,没有报脚本错是吗? 解决方案三: 用开发工具看下报什么错误,是不是导入了jquery,对

mfc-Unicode 动态库LoadLibrary加载慢

问题描述 Unicode 动态库LoadLibrary加载慢 各位大虾, 我写了个Unicode MFC DLL,用LoadLibrary加载很慢.怎么解决这个问题? 解决方案 试试看静态加载dll能否快一些.另外是不是和特定的函数有关. 解决方案二: 有测试过加载时长吗? 解决方案三: LoadLibrary大致过程 1.系统读取DLL文件 2.将其映射到你的进程空间 3.调用DLL导出函数DllMain 前两步应该不会那么慢,猜想可能你的DLL的DllMain函数耗费时间. DllMain函

linux-小白求助!动态库基址加载问题

问题描述 小白求助!动态库基址加载问题 想请问一下,如果不使用aslr技术,linux中加载动态库时,是否每次的基址都是不变的?那么栈的基址会变吗?谢谢! 解决方案 如果没有进行动态地址切换,那么基地址不会变,栈的基址不是固定的,它是挨着堆空间,所以基址不是固定的. 解决方案二: 应该是会变的,因为如果一个库要载入的地址已经被其他载入的库占用了,就只能改变载入的基地址,,

Android Jni调用so库,加载库失败分析

现有一个项目,通过JNI接口调用底层库,例如:lib***.so 如下所示,总是加载不成功.调试发现,每次加载so库,会跳到catch异常处理部分,然后打印异常log信息. static{ try{ System.load("/data/data/com.***/lib/lib***.so"); } catch(UnsatisfiedLinkError ulink){ Log.i("HVnative====","Can not load library&q

php extension_loaded 判断GD扩展库是否加载

if(!extension_loaded('gd')) {   //如果没有加载,执行加载操作   if(!dl('gd.so'))   {     //如果加载失败,则结束所有操作     echo "gd库加载失败";     exit;   } }

eclipse的dynamic web project依赖其他java工程,如何在运行时可以加载其他java工程的class?

问题描述 大家好啊,我现在有个web工程,由于某些原因,依赖其他一些java工程,这样编译代码没问题.但是运行时,需要将依赖的这些java工程打成jar包放入到webcontextn/WEB-INF/lib目录下才可以,有什么办法避免每次更新其他Java工程的源码时,避免每次都要部署jar包,多谢啊,急,在线等 解决方案 解决方案二:各位大神,求解啊解决方案三:可以直接引用解决方案四:一种方法:使用maven依赖,这样被依赖的项目更新了,依赖项目只需要mavenupdate一下就可以了还有就是:

编写category时的便利宏(用于解决category方法从静态库中加载需要特别设置的问题)

代码摘录自YYKit:https://github.com/ibireme/YYKit /**  Add this macro before each category implementation, so we don't have to use -all_load or -force_load to load object files from static libraries that only contain categories and no classes. More info: h

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

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