看流星社区

 找回密码
 注册账号
查看: 2067|回复: 0

封装远程注入类CreateRemoteThreadEx

[复制链接]

该用户从未签到

发表于 2017-6-2 13:24:06 | 显示全部楼层 |阅读模式
类初始化时传入要注入的DLL文件名


只使用两个函数
// 注入DLL到指定的地址空间
BOOL InjectModuleInto(DWORD dwProcessId);
// 从指定的地址空间卸载DLL
BOOL EjectModuleFrom(DWORD dwProcessId);



.h
#pragma once
#include <windows.h>  //在头文件中包含

class CRemThreadInject
{
public:
        CRemThreadInject(LPSTR lpDllName);
        ~CRemThreadInject(void);

protected:
        char m_szDllName[MAX_PATH];
        static BOOL EnableDebugPrivilege(BOOL bEnable);
public:
        // 注入DLL到指定的地址空间
        BOOL InjectModuleInto(DWORD dwProcessId);
        // 从指定的地址空间卸载DLL
        BOOL EjectModuleFrom(DWORD dwProcessId);
};





.cpp
#include "RemThreadInject.h"
#include <tlhelp32.h>



CRemThreadInject::CRemThreadInject(LPSTR lpDllName)
{
        memcpy(m_szDllName, lpDllName, MAX_PATH);
        EnableDebugPrivilege(TRUE);
}


CRemThreadInject::~CRemThreadInject(void)
{
        EnableDebugPrivilege(FALSE);
}

BOOL CRemThreadInject::EnableDebugPrivilege(BOOL bEnable)
{
        HANDLE hToken = INVALID_HANDLE_VALUE;
        //OpenProcessToken
        if (0 == ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &amp;hToken))
        {
                return FALSE;
        }
        LUID luid;
       
        //
        :ookupPrivilegeValue(NULL, SE_DEBUG_NAME, &amp;luid);
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = luid;
        if (bEnable)
                tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        else
                tp.Privileges[0].Attributes = 0;
        if ( !AdjustTokenPrivileges(
                hToken,
                FALSE,
                &amp;tp,
                sizeof(TOKEN_PRIVILEGES),
                (PTOKEN_PRIVILEGES) NULL,
                (PDWORD) NULL) )
        {
                return FALSE;
        }
        if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
        {
                return FALSE;
        }
        ::CloseHandle(hToken);
        return TRUE;
}

// 注入DLL到指定的地址空间
BOOL CRemThreadInject::InjectModuleInto(DWORD dwProcessId)
{
        //
        if (::GetCurrentProcessId() == dwProcessId)
        {
                return FALSE;
        }
        BOOL bFound;
        /************************************************************************/
        /* 遍历模块                                                              */
        /************************************************************************/
        HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
        MODULEENTRY32 me32;

        //  Take a snapshot of all modules in the specified process.
        hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
        if( hModuleSnap == INVALID_HANDLE_VALUE )
        {
                return( FALSE );
        }
        me32.dwSize = sizeof( MODULEENTRY32 );
        if( !Module32First( hModuleSnap, &amp;me32 ) )
        {
                CloseHandle( hModuleSnap );     // Must clean up the snapshot object!
                return( FALSE );
        }
        do
        {
                if (stricmp(me32.szModule, m_szDllName) == 0)
                {
                        bFound = TRUE;
                        break;
                }
        } while( Module32Next( hModuleSnap, &amp;me32 ) );

        //  Do not forget to clean up the snapshot object.
        CloseHandle( hModuleSnap );

        if (bFound) //如果已经加载了模块,就不再加载
        {
                return FALSE;
        }

        //如果没加载,打开进程,远程注入
       
        HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD |PROCESS_VM_OPERATION |PROCESS_VM_WRITE, FALSE, dwProcessId);
        if (hProcess == NULL)
        {
                return FALSE;
        }
        HMODULE  hKernerl32 = GetModuleHandle("kernel32.dll");
        LPTHREAD_START_ROUTINE pfnLoadLibraryA = (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernerl32, "LoadLibraryA");

        int cbSize = strlen(m_szDllName)+1;
        LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, 0, cbSize, MEM_COMMIT, PAGE_READWRITE);
        ::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL);
        HANDLE hRemoteThread = ::CreateRemoteThreadEx(hProcess, NULL, 0, pfnLoadLibraryA, lpRemoteDllName, 0, NULL, NULL);
        if (NULL == hRemoteThread)
        {
                ::CloseHandle(hProcess);
                return FALSE;
        }
        //等待目标线程运行结束,即LoadLibraryA函数返回
        ::WaitForSingleObject(hRemoteThread, INFINITE);
        ::CloseHandle(hRemoteThread);
        ::CloseHandle(hProcess);
        return TRUE;
}


// 从指定的地址空间卸载DLL
BOOL CRemThreadInject::EjectModuleFrom(DWORD dwProcessId)
{
        //
        if (::GetCurrentProcessId() == dwProcessId)
        {
                return FALSE;
        }
        BOOL bFound;
        /************************************************************************/
        /* 遍历模块                                                              */
        /************************************************************************/
        HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
        MODULEENTRY32 me32;

        //  Take a snapshot of all modules in the specified process.
        hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
        if( hModuleSnap == INVALID_HANDLE_VALUE )
        {
                return( FALSE );
        }
        me32.dwSize = sizeof( MODULEENTRY32 );
        if( !Module32First( hModuleSnap, &amp;me32 ) )
        {
                CloseHandle( hModuleSnap );     // Must clean up the snapshot object!
                return( FALSE );
        }
        do
        {
                if (stricmp(me32.szModule, m_szDllName) == 0)
                {
                        bFound = TRUE;
                        break;
                }
        } while( Module32Next( hModuleSnap, &amp;me32 ) );

        //  Do not forget to clean up the snapshot object.
        CloseHandle( hModuleSnap );

        if (!bFound) //如果没有加载模块,就不能卸载
        {
                return FALSE;
        }

        //如果加载了,打开进程,远程注入

        HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD |PROCESS_VM_OPERATION |PROCESS_VM_WRITE, FALSE, dwProcessId);
        if (hProcess == NULL)
        {
                return FALSE;
        }
        HMODULE  hKernerl32 = GetModuleHandle("kernel32.dll");
        LPTHREAD_START_ROUTINE pfnFreeLibrary = (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernerl32, "FreeLibrary");

        int cbSize = strlen(m_szDllName)+1;
        LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, 0, cbSize, MEM_COMMIT, PAGE_READWRITE);
        ::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL);
        HANDLE hRemoteThread = ::CreateRemoteThreadEx(hProcess, NULL, 0, pfnFreeLibrary, lpRemoteDllName, 0, NULL, NULL);
        if (NULL == hRemoteThread)
        {
                ::CloseHandle(hProcess);
                return FALSE;
        }
        //等待目标线程运行结束,即LoadLibraryA函数返回
        ::WaitForSingleObject(hRemoteThread, INFINITE);
        ::CloseHandle(hRemoteThread);
        ::CloseHandle(hProcess);
        return TRUE;
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 13:14

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表