让 .Net 程序 脱离 .net framework框架 运行(源代码实现说明)

前面介绍了 “让 .Net 程序 脱离 .net framework框架 运行的方法”,
该方法主要是利用了Fetion的框架来实现的,
今天我们要介绍的是不使用Fetion的框架,自己来实现Fetion框架的相关功能,
并给出相关实现代码。

关于Fetion框架它主要是有两个文件,FetionVM.exe和FetionVM.rsm。其中对于第二个文件,我们在介绍 native compile 保护的dotNet本地程序还原成dotNet IL程序集 时已经给出了其实现的源代码。

今回就给出 FetionVM.exe 功能实现的,近似代码。

首先使用 remote的试用版 创建一个demo 程序,然后对这个demo程序进行分析,分析发现它的 loader 实际使用是通过调用 rsdeploy.dll 导出的三个函数完成初始化工作,并把控制权转交到dotNet程序集。

这三个函数的原型定义:
typedef BOOL (WINAPI* pInitialize)(HMODULE h, LPCSTR szModule, LPCSTR szMainExe);
typedef BOOL (WINAPI* pReloc)(HMODULE hModule, PIMAGE_NT_HEADERS pNtHeader);
typedef BOOL (WINAPI* pResolveImportDLL)(HMODULE);

有朋友对此多有不满,删除完整实现代码,只对实现代码进行说明,感兴趣的朋友可以参考自己实现一下。

首先是Load要运行的dotNet程序文件,得到HMODULE 句柄,在三个函数中都要用到了。
然后调用 Initialize函数,szModule 是 dotNet程序的文件名,szMainExe 当前执行文件的文件名。
再调用 Reloc 处理重定位表。pNtHeader 也是 dotNet程序在内存中加载后的 NtHeader。
然后 调用ResolveImport,处理导入的dll。
最后将jmp到 dotNet程序的入口,转移控制权。

另外我还发现了另外一种使用实现方法,就是上次提到的那个 dotNet加密壳的 vm unpacker,它也使用了remotesoft 的虚拟框架,但是它没有使用rsdeploy导出的那三个函数。

昨天上 ReTeam 的论坛看到这个 unpacker 更新了。下载回来研究了一下,对于其初始化 DotNetVM 的部分还没有细看,主要看了一下它对框架 hook 的变化,发现其在Jit层中的 Hook 位置移动了。好像是Hook了 emitter对象的一个成员函数,emitter对象是被 complie调用的,位置应该算比较深了,方法体重构方式没有变化。目前的加密壳核心似乎都无法逃过其Hook的拦截。
它拦截的位置比较深,DNGuard HVM标准版对其也没有检测,不过对于DNGuard HVM标准加密的程序集,其脱壳功能仍然无害。试用版的就不能幸免了。

目前对其使用 dotnetvm 的方法比较感兴趣了,简单的看了一下,它只是load了rsdeploy.dll。没有调用rsdeploy导出的三个函数。看起来好像是直接调用了mscorwks中的函数,有可能它自己实现了这三个函数的功能。
感兴趣的朋友可以一起来分析一下,有什么收获再跟大家分享。

时间: 2024-09-23 04:30:26

让 .Net 程序 脱离 .net framework框架 运行(源代码实现说明)的相关文章

让 .Net 程序 脱离 .net framework框架 运行的方法(补充)

前面介绍了  让 .Net 程序 脱离 .net framework框架 运行的方法 , 但是有些朋友应用中还是遇到了一些问题,主要时需要自己提取框架程序以及应用的dll问题. 这里介绍一个偷懒提取方式. 我们可以利用 Remotesoft linker的试用版来提取,试用版的获取 http://www.remotesoft.com/linker/try.html 试用版提取时可以用 mdeploy 方式或者 native 方式. 如果时 mdeploy 方式,比较简单,直接提取出来了基本能用了

让 .Net 程序 脱离 .net framework框架 运行的方法

.Net 框架目前逐步在普及了,仍然有很多人在寻找如何让.NET程序脱离.NET框架的方法. 现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker .另外还有 MaxToCode 作者以前做的 framework linker. 以及一些支持注册表模拟和文件模拟的打包工具molebox,thinstall等.最后还有某网友(应其要求隐去网名) 兜售的一个实现方法. Xenocode的是使用了一个虚拟机环境,模拟框架需要的 注册表信息

让.Net程序脱离.net framework框架运行

Net 框架目前逐步在普及了,仍然有很多人在寻找如何让.NET程序脱离.NET框架的方法.现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker. 另外还有 MaxToCode 作者以前做的 framework linker. 以及一些支持注册表模拟和文件模拟的打包工具molebox,thinstall等.最后还有某网友兜售的一个实现方法. Xenocode的是使用了一个虚拟机环境,模拟框架需要的 注册表信息和文件信息.Xenocod

艾伟:让.NET程序脱离.NET Framework框架运行

Net 框架目前逐步在普及了,仍然有很多人在寻找如何让.Net程序脱离.NET框架的方法. 现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker . 另外还有 MaxToCode 作者以前做的 framework linker. 以及一些支持注册表模拟和文件模拟的打包工具molebox,thinstall等. 最后还有某网友(应其要求隐去网名) 兜售的一个实现方法. Xenocode的是使用了一个虚拟机环境,模拟框架需要的注册表信息

winform程序使用entity framework框架连接数据库,如何在窗体加载的时候预连接数据库一下?

问题描述 如题,人家说entityframework是自助连接,都是在有数据库操作的时候自己连接但是到用到的时候再连接发现速度很慢,查询第一条的时候要卡上7到8秒钟但是查询第二条基本上就是秒查询啊.这个反差受不鸟啊..有没有方法在窗体加载的时候就连接上数据库?知道的大牛回答一下,小弟感激不尽. 解决方案 解决方案二:那你在初始化代码里面随便以异步的方式执行个查询就可以了解决方案三:启动的时候,开启一个新线程,执行一次查询,这样神不知鬼不觉的绕过第一次慢的现象

如何让.NET程序脱离.NET框架

.Net 框架目前逐步在普及了,仍然有很多人在寻找如何让.NET程序脱离.NET框架的方法. 现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker . 另外还有 MaxToCode 作者以前做的 framework linker. 以及一些支持注册表模拟和文件模拟的打包工具molebox,thinstall等. 最后还有某网友(应其要求隐去网名) 兜售的一个实现方法. Xenocode的是使用了一个虚拟机环境,模拟框架需要的 注册表

框架-为什么Chromium Embedded Framework中运行js会很卡?

问题描述 为什么Chromium Embedded Framework中运行js会很卡? 为什么Chromium Embedded Framework中运行js会很卡? 比如说在CEF中输入webQQ的网址打开webQQ,在里面操作.拖拽会很卡,但在浏览器里是很流畅的,不知道CEF内嵌了谷歌浏览器,为什么运行js会很卡?? 解决方案 Chrome的稳定版本,一般是在经过Chromium测试,经过大量用户反馈,比较稳定的功能才会加入到Chrome当中来,因此一般Chrome都会更新比较慢,版本号也

让Sqlite脱离VC++ Runtime独立运行的方法_基础应用

目前手头上的一个.NET项目用到了Sqlite,这是我第一次接触和使用Sqlite,总体感觉还是非常不错的.这里把我使用Sqlite的经验跟大家分享一下. 一.关于Sqlite Sqlite是一款开源的.适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL. 不像SqlServer或Oracle的引擎是一个独立的进程.通过TCP或命名管道等与程序进行通信,SQLite却是作为程序的一个部件.一个构成部分,使用Sqlite的方式就是直接在程序中进行API调用. 原始的Sqlite是没有一

让Sqlite脱离VC++ Runtime独立运行

前段时间在开发OrayTalk(傲瑞通)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,总体感觉还是非常不错的.这里把我使用Sqlite的经验跟大家分享一下. 一.关于Sqlite Sqlite是一款开源的.适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL. 不像SqlServer或Oracle的引擎是一个独立的进程.通过TCP或命名管道等与程序进行通信,SQLite却是作为程序的一个部件.一个构成部分,使用Sqlite的方式就是直接在程序中进行API调用.