C++封装远程注入类CreateRemoteThreadEx实例
本文向大家介绍C++封装远程注入类CreateRemoteThreadEx实例,包括了C++封装远程注入类CreateRemoteThreadEx实例的使用技巧和注意事项,需要的朋友参考一下
本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考。具体方法如下:
首先,类初始化时传入要注入的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, &hToken)) { return FALSE; } LUID luid; // ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &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, &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, &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, &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, &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, &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; }
希望本文所述对大家的C++程序设计有所帮助。