欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

远程线程注入 .dll 文件

程序员文章站 2022-04-02 23:09:19
...
此文章只供学习所用,不要做坏事哟  ~  ^ _ ^

远程线程注入

远程线程注入是指一个进程在另一个进程中创建线程的技术。
远程线程是另一个进程中的线程。


当前进程,下方称作进程A:
远程线程注入 .dll 文件
这个线程没有结束,一直都在等待命令,可以用 getchar 或 cin.get 实现。

我们的目的是:

  1. 将一个 .dll文件注入到进程A中
  2. 当 .dll文件注入后,执行一个线程

一、 .dll文件准备

1. 当我们注入 .dll文件后执行相对应的线程:

远程线程注入 .dll 文件

2. 线程代码是执行一个死循环语句:
远程线程注入 .dll 文件
3. 编译生成的 .dll文件如下所示:

远程线程注入 .dll 文件

二、注入 .dll文件

思路详解: 在进程A中执行 loadlibrary加载模块

  1. 打开进程A
  2. 在进程A中开辟一段内存,用于存放 .dll文件的路径
  3. 为 .dll文件分配内存,并且将路径名写入内存中
  4. 利用 Kernel32.dll 获取 LoadLibraryA地址
  5. 使用 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主函数写,并且代码中没有判断失败的部分,可以自己添加……

注入模块后,运行结果为:

远程线程注入 .dll 文件


相关标签: Win32学习 win32