Windows Ring3层注入——远程线程注入(二)
在Windows操作系统中,各个进程相对独立,一个进程不能轻易地控制其他进程中的线程。从根本上来说,远程线程注入技术要求目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL。Windows提供了远线程机制,使我们在另一个进程中创建线程变得非常容易。
远程线程注入原理
主要原理解释:在自身进程中使用函数在目标进程中创建一个线程,使线程运行LoadLibrary动态加载想要注入的DLL。根据这个原理知道我们需要在远程目标进程中开辟内存写入我们要注入的DLL,有LoadLibrary就需要有相对应的FreeLibrary来释放内存,所以整体注入步骤和需要进行的操作就已经很明了了。
动图解释:
远线程注入函数原型及步骤
1.使用函数 OpenProcess 打开进程,获取进程句柄,使用函数 VirtualAllocEx 在远程进程的地址空间从中分配一块内存。
- OpenProcess 函数原型:返回进程句柄
HANDLE OpenProcess(
DWORD dwDesiredAccess, // 渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId // 进程标示符
);
- VirtualAllocEx 函数原型:返回内存的首地址
LPVOID VirtualAllocEx(
HANDLE hProcess, //申请内存所在的进程句柄
LPVOID lpAddress, //保留页面的内存地址;一般用NULL自动分配
SIZE_T dwSize, //欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
DWORD flAllocationType, //分配内存的类型
DWORD flProtect //分配内存的权限
);
2.使用函数 WriteProcessMemory 把想要注入的DLL文件的路径名复制到目标进程所分配的内存中.
- WriteProcessMemory 函数原型:写入成功返回非零
BOOL WriteProcessMemory(
HANDLE hProcess, //进程句柄
LPVOID lpBaseAddress, //要写的内存首地址
LPVOID lpBuffer, //指向要写的数据的指针
DWORD nSize, //要写入的字节数
LPDWORD lpNumberOfBytesWritten
);
3.使用函数GetProcAddress函数来的到LoadLibrary的函数在Kernel32.dll中的实际地址。
- GetProcAddress 函数原型:如果函数调用成功,返回值是DLL中的输出函数地址。如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。
FARPROC GetProcAddress(
HMODULE hModule, //DLL模块句柄
LPCSTR lpProcName //函数名
);
- LoadLibrary 函数原型
HMODULE WINAPI LoadLibrary(
_In_ LPCTSTR lpFileName //模块的名称
);
4.使用函数CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用正确的LoadLibrary函数并在参数中传入第一步分配的内存地址。
HANDLE WINAPI CreateRemoteThread(
HANDLE hProcess, //线程所属进程的进程句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes, //一个指向 SECURITY_ATTRIBUTES 结构的指针
SIZE_T dwStackSize, //线程栈初始大小,以字节为单位
LPTHREAD_START_ROUTINE lpStartAddress, //在远程进程的地址空间中线程的线程函数的起始地址
LPVOID lpParameter, //传给线程函数的参数
DWORD dwCreationFlags, //线程的创建标志
LPDWORD lpThreadId //指向所创建线程ID的指针,如果创建失败,参数为NULL
);
5.使用函数VirtualFreeEx来释放分配的内存空间。
BOOL WINAPI VirtualFreeEx(
HANDLE hProcess, //进程句柄
LPVOID lpAddress, //指向要释放的虚拟内存空间首地址的指针
SIZE_T dwSize, //虚拟内存空间的字节数
DWORD dwFreeType ); //释放类型
6.使用函数 GetProcAddress 来的到 FreeLibrary 函数在 Kernel32.dll