远程线程注入 .dll 文件
程序员文章站
2022-04-02 23:09:19
...
此文章只供学习所用,不要做坏事哟 ~ ^ _ ^
远程线程注入
远程线程注入是指一个进程在另一个进程中创建线程的技术。
远程线程是另一个进程中的线程。
当前进程,下方称作进程A:这个线程没有结束,一直都在等待命令,可以用 getchar 或 cin.get 实现。
我们的目的是:
- 将一个 .dll文件注入到进程A中
- 当 .dll文件注入后,执行一个线程
一、 .dll文件准备
1. 当我们注入 .dll文件后执行相对应的线程:
2. 线程代码是执行一个死循环语句:
3. 编译生成的 .dll文件如下所示:
二、注入 .dll文件
思路详解: 在进程A中执行 loadlibrary加载模块
- 打开进程A
- 在进程A中开辟一段内存,用于存放 .dll文件的路径
- 为 .dll文件分配内存,并且将路径名写入内存中
- 利用 Kernel32.dll 获取 LoadLibraryA地址
- 使用 CreateRemoteThread这个万恶之源的函数将 .dll文件注入到目标进程中
代码中每一个API的参数这里不做解释,可以百度或者MSDN查找相关资料阅读:
#include <Windows.h>
int main()
{
LPCSTR lpDllPathName = "E:\\Win Learn\\远程线程\\Debug\\动态链接库.dll";
// 1. 查找窗口
HWND hwnd = FindWindow("ConsoleWindowClass", "E:\\Win Learn\\远程线程\\Debug\\远程线程.exe");
// 2. 获取进程id
DWORD dwProcId;
GetWindowThreadProcessId(hwnd, &dwProcId);
// 3. 打开进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcId);
// 4. 获取 .dll文件的长度
DWORD dwDllLength = strlen(lpDllPathName) + 1;
// 5. 为 .dll文件分配内存
LPVOID lpDllAlloc = VirtualAllocEx(hProcess, NULL, dwDllLength, MEM_COMMIT, PAGE_READWRITE);
// 6. 为分配好的地址写入数据(路径)
WriteProcessMemory(hProcess, lpDllAlloc, lpDllPathName, dwDllLength, NULL);
// 7. 获取 kernel32.dll的地址 ------因为 loadlibrary在这个模块里面
HMODULE hModule = GetModuleHandle("Kernel32.dll");
// 8. 获取 LoadLibraryA的地址 + A 是函数的全称
FARPROC faLllp = GetProcAddress(hModule, "LoadLibraryA");
// 9.注入 .dll文件
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)faLllp, lpDllAlloc, 0, NULL);
return 0;
}
为了方便,功能实现部分在 main主函数写,并且代码中没有判断失败的部分,可以自己添加……
注入模块后,运行结果为: