注入 - 远线程注入DLL到目标进程

//
//    函数          --          void InjectDLL(LPCTSTR)
//
//    功能          --          注入DLL到指定窗口
//
//    @param       --          要注入的DLL全路径
//
//    返回值        --          无
//
void InjectDLL(LPCTSTR lpDLLFullPath)
{
    DWORD            dwPID = 0;                               // 目标进程PID
    HANDLE            hGameProcess = NULL;                    // 目标进程句柄
    LPDWORD        lpdwAddr = NULL;                           // 远程申请的内存空间地址
    DWORD            dwWriteByteSize = 0;                     // 写入的字节数
    HANDLE            hRemoteThread = NULL;                   // 远程线程句柄

    // 1. 获取窗口句柄
    HWND hGameWnd = ::FindWindow(GAME_CLASS_NAME, NULL);
    if (hGameWnd)
    {
        // 2. 通过窗口句柄, 获取窗口PID
        GetWindowThreadProcessId(hGameWnd, &dwPID);
        if (dwPID)
        {
            // 3. 通过窗口PID, 获取游戏进程句柄
            hGameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
            if (hGameProcess)
            {
                // 4. 在游戏进程里, 分配一片内存空间, 用于存放要注入的DLL;
                //    @param1 : 游戏进程句柄;         @param2 : 指定的内存地址(一般为NULL);    @param3 == 256 代表DLL路径的最大长度;    @param4 : 可读可写
                lpdwAddr = (LPDWORD)VirtualAllocEx(hGameProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
                if (lpdwAddr)
                {
                    // 5. 写入DLL全路径
                    WriteProcessMemory(hGameProcess, lpdwAddr, lpDLLFullPath, strlen(lpDLLFullPath) + 1, &dwWriteByteSize);    //MAIN_DLL_FULL_PATH
                    if (dwWriteByteSize >= strlen(lpDLLFullPath))
                    {
                        // 6. 创建远程线程注入DLL
                        hRemoteThread = CreateRemoteThread(hGameProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpdwAddr, 0, NULL);

                        // 7. 清理资源
                        WaitForSingleObject(hRemoteThread, INFINITE);
                        CloseHandle(hRemoteThread);                                          // 关闭远程线程句柄
                        VirtualFreeEx(hGameProcess, lpdwAddr, 256, MEM_DECOMMIT);            // 释放申请的内存空间
                        CloseHandle(hGameProcess);                                           // 关闭目标进程句柄
                        printf(_T("\r\n资源清理完毕!\r\n"));
                    }
                    else
                    {
                        CloseHandle(hGameProcess);
                        printf(_T("\r\n写入DLL路径失败!\r\n"));
                    }
                }
            }
        }
    }
}
时间: 2024-10-10 21:15:56

注入 - 远线程注入DLL到目标进程的相关文章

[转载]Dll注入技术之远程线程注入

转自:黑客反病毒 DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等.     远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLi

【windows核心编程】使用远程线程注入DLL

前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写.  示意图如下:  相关API 1.创建远程线程 //该函数除了第一个参数为目标进程句柄外 //其他参数均和CreateThread一样 HANDLE hThread = CreateRemoteThread( __in HANDLE hProcess, //目标进程句柄 __in_opt LPSECURITY_A

远程线程注入方法CreateRemoteThread

最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是  https://github.com/Arsense/WindowsCode 首先先来说说什么是注入,为什么要注入 0x00 Baise 注入就是把自己的Dll注入到人家的代码中,被注入的DLL拥有目标进程内存的访问权限,所以我们可以通过该 向某个进程注入DLL时的方法主要有以下三种: 创建远程线程(CreateRemoteThread()

PE基础6_远程线程注入-HOOK(消息-InLine-IAT)

注入 概述 DLL注入的初始动力源自于程序员对其他第三方应用程序进行功能扩展的愿望 注入方式有 注册表注入 ComRes注入 APC注入 消息钩子注入 远程线程注入 依赖可信进程注入 劫持进程创建注入 输入法注入 远程线程注入 //要加载的dll路径 WCHAR szDllPath[] = L"C:\\Users\\42140\\source\\repos\\34windows原理PE \\Debug\\16InjectDll.dll"; ? int main() { //1.要注入,

安全之路 —— 利用远程线程注入的方法(使用DLL)实现穿墙与隐藏进程

简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文件注入系统认可的正常进程,你会发现任务管理器以及找不到独立出现的恶意进程项了.反向连接型后门采用这种技术,注入防火墙认可的进程(例如大部分系统进程,像explorer.exe就很常见)还能够获得一定的穿墙效果. 进程注入虽然已经是将近10年前的技术了,但是今天出现的很多新型黑客技术大多数还是基于这类老技术演变而来

windows目标进程注入dll

在别的程序注入dll 步骤: 1,获取目标进程ID,CreateToolhelp32Snapshot()函数; 2,获取目标进程句柄,OpenProcess()函数; 3,目标进程要一块内存,VirtualAllocEx()函数,不是VirtualAlloc()函数: 4,往要来的目标内存写入要注入的dll文件名,WriteProcessMemory; 5,拿到kernel32模块句柄,GetModuleHandle()函数; 6,拿到kernel32模块里LoadLibraryA()函数地址,

C++进程注入(通过远程线程注入进程)

需要本文代码请直接跳到文章最底部下载 注入进程的方法有很多,本文主要介绍通过远程线程来注入进程的方法: 我们知道,每个进程都有4GB的地址空间,windows可用的大小大概为1.5GB左右,远程线程注入的方法主要是,打开一个线程以后,将要注入的动态库的地址写入这个地址空间,然后调用开启远程线程的函数,来执行LoadLibraryA或者LoadLibraryW(其实不存在LoadLibrary这个函数,他只是一个宏,如果是UNICODE环境的话会调用LoadLibraryW,否则就是LoadLib

远程创建线程注入DLL

HANDLE WINAPI CreateRemoteThread(__in HANDLE hProcess,__in LPSECURITY_ATTRIBUTES lpThreadAttributes,__in SIZE_T dwStackSize,__in LPTHREAD_START_ROUTINE lpStartAddress,__in LPVOID lpParameter,__in DWORD dwCreationFlags,__out LPDWORD lpThreadId);hProce

远程线程注入dll

// CommonInject.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <WinUser.h> #include <WinDef.h> #include <iostream> #include <Tlhelp32.h> using namespa