CreateRemoteThreadWriteProcessMemory技术 简要的

来源:互联网 发布:开淘宝店要交押金吗 编辑:程序博客网 时间:2024/05/16 12:21
CreateRemoteThreadWriteProcessMemory第三种方法的基本思想是拷贝一些代码到另一进程的地址空间中然后执行。这种方法代替了编写独立的DLL,而是直接将代码使用WriteProcessMemory API函数拷贝到远程进程中。然后通过CreateRemoteThread来执行它。

本文前面已经介绍过CreateRemoteThread的函数原型,注意以下几点:

1、              hProcess参数是CreateRemoteThread的附加参数,它是进程决定创建哪个线程的句柄。

2、              lpStartAddress参数是线程在远程进程地址空间中的开始地址。它必须存在于远程进程中,因此不能简单的拷贝一个地址句柄传递给本地的ThreadFunc,而必须先将代码拷贝到远程进程中。

3、              对于lpParameter参数也一样,也必须将他拷贝到远程进程中。

下面概括一下使用CreateRemoteThread和WriteProcessMemory的具体步骤。

1、返回远程进程的句柄HANDLE(OpenProcess)

2、在远程进程的地址空间中为待注入的代码分配内存(VirtualAllocEX)

3、将已初始化后的INJDATA结构的一个拷贝写入分配的内存(WriteProcessMemory)

4、在远程进程的地址空间中为注入的代码分配内存

5、将ThreadPunc的一个拷贝写入分配的内存

6、使用CreateRemoteThread来执行远程的ThreadFunc拷贝

7、等待远程线程的终止(WaitForSingleObject)

8、从远程进程中返回执行结果(ReadProcessMemory或GetExitCodeThread)

9、释放已申请的内存,包括步骤2和步骤4中的申请(VirtualFreeEx)

10、             关闭返回的句柄,包括步骤1和步骤6中的HANDLE(CloseHandle)

上述步骤中需要定义INJDATA结构:

typedef struct {

       HWND    hwnd;

       SENDMESSAGE         fnSendMessage; // pointer to user32!SendMessage

 

       BYTE     pbText[128 * sizeof(TCHAR)];

} INJDATA, *PINJDATA;

构造ThreadFunc时将INJDATA作为传递的参数:

static DWORD WINAPI ThreadFunc (INJDATA *pData)

{

       return 0;

}

这样,就可以在ThreadFunc中加入一些想做的事情,并且注入到其它进程中来执行。