zoukankan      html  css  js  c++  java
  • 让 .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中的函数,有可能它自己实现了这三个函数的功能。
    感兴趣的朋友可以一起来分析一下,有什么收获再跟大家分享。














  • 相关阅读:
    洛谷P3674 小清新人渣的本愿
    洛谷P3709 大爷的字符串
    CF747F Igor and Interesting Numbers
    洛谷P1494 小Z的袜子
    洛谷P3396 哈希冲突
    分块⑨题
    洛谷P4219 大融合
    bzoj2959 长跑
    洛谷P2486 染色
    洛谷P4382 劈配
  • 原文地址:https://www.cnblogs.com/rick/p/887825.html
Copyright © 2011-2022 走看看