前面介绍了 “让 .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中的函数,有可能它自己实现了这三个函数的功能。
感兴趣的朋友可以一起来分析一下,有什么收获再跟大家分享。