远程线程注入DLL(包含64位系统无法注入解决方案)

最近想做一个64位系统监视进程创建过程的工具,用来判断和处理问题。可能会用到远程线程注入的方法,这里复习一下Windows核心编程提到的方法。

要实现远程线程注入DLL到一个进程中,需要以下几个步骤。

1、使用VirtualAllocEx函数,分配远程进程的地址空间中的内存,用来储存要注入DLL的路径。

2、使用WriteProcessMemory函数,将DLL的路径名拷贝到第一个步骤中已经分配的内存中。

3、使用GetProcAddress函数,获取LoadLibraryA或LoadLibraryW函数的实地址(在Kernel32.dll中)。用来让远程进程加载一个DLL

4、使用CreateRemoteThread函数,在远程进程中创建一个线程,它调用正确的LoadLibrary函数,为它传递第一个步骤中分配的内存的地址。这时DLL已经被插入到远程进程的地址空间中,DLL的DLLMain函数将接收到一个DLL_PROCESS_ATTACH通知,我们就可以在接收到这个通知后做我们需要做的事情,比如替换某API函数的地址。

5、使用VirtualFreeEx函数,释放第一个步骤中分配的内存。

6、使用GetProcAddress函数,获得FreeLibrary函数的实地址(在Kernel32.dll中)。

7、使用CreateRemoteThread函数,在远程进程中创建一个线程,它调用FreeLibrary函数,传递远程DLL的HINSTANCE来释放我们入驻过的DLL。

以上便是使用远程线程注入DLL的步骤,但以上方法Windows98是不支持的,因为在Windows98中,CreateRemoteThread函数是没有实现的(有声明这个函数,但调用后返回NULL)。

DLL模块代码:

需要一个单独的exe来将dll注入到目标进程,代码如下:

需要注意的是,如果你要在64位系统下实施远程线程方式注入DLL,那么你的exe文件和dll文件必须都编译为x64的才可以正常注入,这也是困扰了许多人的一个问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注