渐渐的渐渐的,对于win32的编程有了一定的了解了,自己尝试了一下远程线程注入。
虽然说最后的结果没有在我的机器上面实现(可能是操作系统的问题,毕竟我的实现思路没有什么问题)
首先了解一下什么是远程线程,这一切都由于win32提供了一个函数,他叫createremotethread,它允许你在别的进程里面创建一个线程。
下面直接上函数文档,从中可以看到几个比较重要的点,首先是第一个参数,目的进程句柄,因为我们知道,每个进程的句柄表都是私有的,相应的句柄值在别的进程里面是不适用的,所以给通过pid获取操作系统全局句柄表来在你的实现注入的进程里面获得目的进程的句柄(内核对象)。
那么怎么获取目的进程句柄值呢?
openprocess函数,打开已经创建的进程。
那么这样我们第一个参数也就实现了。
下面我们看第四个参数,要执行的函数的地址。
注意这里的函数是目的进程里面的函数,因为你创建的远程线程也是属于目的进程的,所以你不可能让一个线程执行别的线程的函数去。
这个时候该想了,我想执行我自己定制的代码,而我要注入的进程里面并没有我的定制代码怎么办呢?
这个时候想一想动态链接库里面的dllmain函数。
首先loadlibrary函数是肯定存在于目标进程里面的,因为它本身就属于kernel32里面的函数。
其次可以通过loadlibrary实现让目标进程加载 你自己定制的dll,那么这个时候可能提出一个疑问。
我写了dll之后,人家怎么知道我的dll的路径呢?
这个时候涉及到了同样关键的一个函数,叫VirtualAllocEx。
它可以在目的进程里面创建一块地址,(注意是目的进程不是你当前的进程)。
创建了地址之后,还可以通过WriteProcessMemory函数来进行写入。
那么目的进程就知道了要加载的dll的路径了。
下面直接上代码
#include<cstdio>
#include<Windows.h>
#include<cstring>
int main() {
//创建远程进程句柄
HANDLE hProcess;
//创建远程线程句柄
HANDLE hThread;
//获取远程进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
53564//对应的进程pid
);
if (hProcess == NULL) {
MessageBox(NULL, L"获取不了远程进程", L"错误提示", 0);
}
//获取dll路径长度
char dllPath[] = "A.dll";
int length = strlen(dllPath)+1;
//在对应的目的进程里面创建物理地址,并设置为可读可写。
LPVOID allocAddr = VirtualAllocEx(hProcess, NULL, length, MEM_COMMIT, PAGE_READWRITE);
//CreateRemoteThread(hProcess, NULL, 0, );
if (allocAddr == NULL) {
MessageBox(NULL, L"获取不了内存地址", L"错误提示窗口", 0);
}
//在分配的内存里面写入路径名
BOOL write = WriteProcessMemory(hProcess, allocAddr, dllPath, length, NULL);
if (write == false) {
MessageBox(NULL, L"地址写入失败", L"错误提示窗口", 0);
}
DWORD runProc = 75752990;
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)runProc, allocAddr, 0, NULL);
getchar();
return 0;
}