在前面关于CLR寄宿的几篇博客(CLR寄宿(上) MSCOREE.DLL,CLR寄宿(中) 托管exe文件的加载和执行,CLR寄宿(下) 托管宿主)中,介绍了常用的宿主接口。宿主接口,允许我们使用非托管代码创建CLR宿主,从而启动CLR,运行托管代码,控制垃圾回收……等一系列功能。本篇博文要讲解的是使用CLR宿主的一个场景——进程注入。
进程注入是一种将代码注入到已有进程地址空间内,并执行的技术。进程注入的技术有很多,本文基于LoadDLL&CreateRemoteThread技术来讲解。
一般而言,我们会将要执行的代码编译到DLL文件里,然后加载到目标进程内执行。对于一个非托管DLL直接加载并执行就可以了,但是如果想把一个托管DLL加载到进程中并执行就要费一番周折,因为托管代码是不能直接执行的,要经过CLR的二次编译。如何解决这个问题呢?
因为环境对进程注入的影响很大,我这里先列出我实验的环境,再具体讲解。
系统:windows 7 ,64位
.net :4.0
开发工具:vs2010 sp1
测试程序:均为32位程序
1.1 实现非托管代码调用托管代码
这里用老外的一张图来简单描述下我们的托管代码是如何在目标进程内执行的。
首先使用具有注入功能的程序将一个非托管的C++DLL注入到目标进程中,然后该非托管DLL启动CLR,并加载要执行的托管DLL,最后调用CLR执行托管代码。
过程看起来很简单,这里要解决的第一个问题是创建一个C++DLL,作为CLR宿主。
打开VS2010,选择c++ Win32Project项目。
确定之后点下一步,应用类型选DLL,附加选项中选择空项目。
我创建的项目名称为:ManageCodeInvoker,如下图:
时间: 2024-11-30 22:28:22