首页 > 其他 > 详细

DLL注入

时间:2020-08-29 18:59:20      阅读:52      评论:0      收藏:0      [点我收藏+]
#include <iostream>
#include <Windows.h>

bool Inject(DWORD pid, char *szPath) {

    HANDLE handle;  // 进程内核对象句柄
    LPVOID pRemoteAddress;  // 分配的基地址
    DWORD dwSize;           // 写入字节数
    // 获取进程内核对象
    handle = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    // 申请内存空间
    pRemoteAddress = VirtualAllocEx(
        handle, 
        NULL,
        1,
        MEM_COMMIT,
        PAGE_READWRITE
    );

    if (pRemoteAddress == NULL) {
        return false;
    }
    // 向进程内存写入信息
    int error = WriteProcessMemory(
        handle,
        pRemoteAddress,
        szPath,
        strlen(szPath) * 1 + 1,
        &dwSize
    );

    if (error == 0) {
        return false;
    }

    // 创建一个远程线程将dll载入目标进程
    // LPTHREAD_START_ROUTINE是一种函数,该函数指向一个函数,通知宿主某个线程已开始执行
    HANDLE pThread = CreateRemoteThread(
        handle,
        NULL,
        0,
        (LPTHREAD_START_ROUTINE)LoadLibraryA,
        pRemoteAddress,
        NULL,  // 立即执行
        NULL
    );
    if (pThread == NULL) {
        printf("线程创建失败\n");
    }
    else {
        printf("线程创建成功,线程Id为:%d\n",(int) pThread);
    }
    // 等待响应
    WaitForSingleObject(pThread, -1);

    VirtualFreeEx(
        handle,
        pRemoteAddress,
        1,
        MEM_DECOMMIT);
    
    return true;
}

char path[] = "D:\\Test\\SharkDll\\Debug\\SharkDll.dll";           // dll路径
HWND hwnd;                  // 窗口句柄对象
const char* name = "微信";    // 进程名
DWORD pid;                  // 进程标识符
int main()
{
    // 查找窗口句柄
    hwnd = ::FindWindowA(NULL, name);
    printf("进程句柄:%d\n", (int)hwnd);
    // 获取进程标识符
    GetWindowThreadProcessId(hwnd, &pid);
    printf("进程的pid:%d\n", pid);

    Inject(pid, path);
    return 0;
}

  

DLL注入

原文:https://www.cnblogs.com/TNTBomb/p/13582654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!