一个远程线程注入的类
未用过,不知道好用不。费话少说,附上代码:
1 2 // RemThreadInjector.h文件 3 4 5 #include <windows.h> 6 7 class CRemThreadInjector 8 { 9 public: 10 CRemThreadInjector(LPCTSTR pszDllName); 11 ~CRemThreadInjector(); 12 13 // 注入DLL到指定的进程空间 14 BOOL InjectModuleInto(DWORD dwProcessId); 15 16 // 从指定的进程空间卸载DLL 17 BOOL EjectModuleFrom(DWORD dwProcessId); 18 19 protected: 20 char m_szDllName[MAX_PATH]; 21 22 // 调整特权级别 23 static BOOL EnableDebugPrivilege(BOOL bEnable); 24 }; 25 26 27 // RemThreadInjector.cpp文件 28 #include "stdafx.h" 29 #include "RemThreadInjector.h" 30 #include <tlhelp32.h> 31 32 CRemThreadInjector::CRemThreadInjector(LPCTSTR pszDllName) 33 { 34 strncpy(m_szDllName, pszDllName, MAX_PATH); 35 EnableDebugPrivilege(TRUE); 36 } 37 38 CRemThreadInjector::~CRemThreadInjector() 39 { 40 EnableDebugPrivilege(FALSE); 41 } 42 43 BOOL CRemThreadInjector::EnableDebugPrivilege(BOOL bEnable) 44 { 45 // 附给本进程特权,以便访问系统进程 46 BOOL bOk = FALSE; 47 HANDLE hToken; 48 49 // 打开一个进程的访问令牌 50 if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 51 { 52 // 取得特权名称为“SetDebugPrivilege”的LUID 53 LUID uID; 54 ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &uID); 55 56 // 调整特权级别 57 TOKEN_PRIVILEGES tp; 58 tp.PrivilegeCount = 1; 59 tp.Privileges[0].Luid = uID; 60 tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; 61 ::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); 62 bOk = (::GetLastError() == ERROR_SUCCESS); 63 64 // 关闭访问令牌句柄 65 ::CloseHandle(hToken); 66 } 67 return bOk; 68 } 69 70 BOOL CRemThreadInjector::InjectModuleInto(DWORD dwProcessId) 71 { 72 if(::GetCurrentProcessId() == dwProcessId) 73 return FALSE; 74 75 // 首先查看目标进程是否加载了这个模块 76 BOOL bFound = FALSE; 77 MODULEENTRY32 me32 = { 0 }; 78 HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId); 79 me32.dwSize = sizeof(MODULEENTRY32); 80 if(::Module32First(hModuleSnap, &me32)) 81 { 82 do 83 { 84 if(lstrcmpiA(me32.szExePath, m_szDllName) == 0) 85 { 86 bFound = TRUE; 87 break; 88 } 89 } 90 while(::Module32Next(hModuleSnap, &me32)); 91 } 92 ::CloseHandle(hModuleSnap); 93 94 // 如果能够找到,就不重复加载了(因为重复加载没有用,Windows只将使用计数加1,其它什么也不做) 95 if(bFound) 96 return FALSE; 97 98 99 // 试图打开目标进程100 HANDLE hProcess = ::OpenProcess(101 PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION, FALSE, dwProcessId);102 if(hProcess == NULL)103 return FALSE;104 105 106 // 在目标进程中申请空间,存放字符串pszDllName,作为远程线程的参数107 int cbSize = (strlen(m_szDllName) + 1);108 LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, NULL, cbSize, MEM_COMMIT, PAGE_READWRITE);109 ::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL);110 111 // 取得LoadLibraryA函数的地址,我们将以它作为远程线程函数启动112 HMODULE hModule=::GetModuleHandle("kernel32.dll");113 LPTHREAD_START_ROUTINE pfnStartRoutine = 114 (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, "LoadLibraryA");115 116 117 // 启动远程线程118 HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, pfnStartRoutine, lpRemoteDllName, 0, NULL);119 if(hRemoteThread == NULL)120 {121 ::CloseHandle(hProcess);122 return FALSE;123 }124 // 等待目标线程运行结束,即LoadLibraryA函数返回125 ::WaitForSingleObject(hRemoteThread, INFINITE);126 127 ::CloseHandle(hRemoteThread);128 ::CloseHandle(hProcess);129 return TRUE;130 }131 132 BOOL CRemThreadInjector::EjectModuleFrom(DWORD dwProcessId)133 {134 if(::GetCurrentProcessId() == dwProcessId)135 return FALSE;136 137 // 首先查看目标进程是否加载了这个模块138 BOOL bFound = FALSE;139 MODULEENTRY32 me32 = { 0 };140 HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);141 me32.dwSize = sizeof(MODULEENTRY32);142 if(::Module32First(hModuleSnap, &me32))143 {144 do145 {146 if(lstrcmpiA(me32.szExePath, m_szDllName) == 0)147 {148 bFound = TRUE;149 break;150 }151 }152 while(::Module32Next(hModuleSnap, &me32));153 }154 ::CloseHandle(hModuleSnap);155 156 // 如果找不到就返回出错处理157 if(!bFound)158 return FALSE;159 160 // 试图打开目标进程161 HANDLE hProcess = ::OpenProcess(162 PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION, FALSE, dwProcessId);163 if(hProcess == NULL)164 return FALSE;165 166 167 // 取得LoadLibraryA函数的地址,我们将以它作为远程线程函数启动168 HMODULE hModule=::GetModuleHandle("kernel32.dll");169 LPTHREAD_START_ROUTINE pfnStartRoutine = 170 (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, "FreeLibrary");171 172 173 // 启动远程线程174 HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, pfnStartRoutine, me32.hModule, 0, NULL);175 if(hRemoteThread == NULL)176 {177 ::CloseHandle(hProcess);178 return FALSE;179 }180 // 等待目标线程运行结束,即FreeLibrary函数返回181 ::WaitForSingleObject(hRemoteThread, INFINITE);182 183 ::CloseHandle(hRemoteThread);184 ::CloseHandle(hProcess);185 return TRUE;186 }187 188 使用方法:189 CRemThreadInjector m_injector(dll的路径);190 m_injector.InjectModuleInto(要注入的进程ID);
转载于:https://www.cnblogs.com/jackson-leung/archive/2011/12/14/Class-of-DLL-Inject.html
一个远程线程注入的类相关推荐
- DLL注入_远程线程注入
什么是线程注入? 线程注入,是通过开启远程线程的方式,将DLL加载到目标宿主进程中的常用方式. 什么是动态链接库? 首先Windows中链接库分为两种:动态链接库DLL.静态链接库LIB. ① 静态链 ...
- 远程线程注入引出的问题
一.远程线程注入基本原理 远程线程注入--相信对Windows底层编程和系统安全熟悉的人并不陌生,其主要核心在于一个Windows API函数CreateRemoteThread,通过它可以在另外一个 ...
- windows-CODE注入(远程线程注入)
远程线程注入(先简单说,下面会详细说) 今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式 ...
- DLL 远程线程注入
远程线程注入 首先 , 这里讲和为注入 , 通俗讲 , 就是把自己的东西强加给别人 也就是在 其他程序的运行的内存空间里面 插入自己的代码 这里提到的远程线程注入 这个算是很常用,也算是用的比较多的一 ...
- 基于应用层自身反远程线程注入的研究
基于应用层自身反远程线程注入的研究 现状:目前所有已知的反远程注入方式:r0层hook 句柄的获取,返回失败,让应用层注入者拿不到目标进程的句柄,如hook ntopenprocess ntdubli ...
- WinAPI【远程注入】利用远程线程注入DLLDelphi版
{ WinAPI[远程注入]利用远程线程注入DLLDelphi版} (okwary) 小叹的学习园地 ( SDK文档里是这样描述的:进程是一个正在运行的程序,它拥有自己的地址空间,拥有自己的 ...
- 什么是远程线程注入?
远程线程注入 首先,要说明白远程线程注入,必须得弄明白什么是远程线程以及什么是注入! 远程线程 这里的远程指的是别的进程空间,大家应该都在自己代码中或多或少运用过多线程,这里给出常见的win32创建线 ...
- 远程线程注入DLL到PC版微信
一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...
- 详细解读:远程线程注入DLL到PC版微信
一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...
- 易语言远程线程注入DLL到游戏
远程线程注入CreateRemoteThread通过获取注入目标进程的句柄,把我们的DLL注入到目标进程内存地址,远程线程的意思是另一个进程中的线程,并非远控的意思,也就是远程线程注入是指一个进程在另 ...
最新文章
- 微软服务器迁移工具,在 Azure Migrate 中添加迁移工具 - Azure Migrate | Microsoft Docs
- mysql数字字符串教程_很全面的mysql字符串函数的教程
- 移动端适配与响应式布局
- 上云七步走,助力垂直电商降本增效
- quora html5,英语口语练习_Quora精选:外国人眼中5个最美英文单词_沪江英语
- 视差滚动的爱情故事之优化篇
- [设计模式] - Proxy代理模式
- jquery获取前一个月日期
- 混乱的MVC,.NET非要MVC不可么?
- ALGO-84 矩阵乘法
- notion自建服务器,最详细的NOTION功能模块列表
- 文件那些事儿之一(初稿)
- 2010_8_16_Router_路由器的密码恢复
- 科研软件宝藏公众号开通
- jmp指令流程图怎么写_NS流程图是什么?规范实用的流程图工具
- 流程驱动管理vs 数据驱动管理
- go语言对gif的抽帧压缩
- 第六节课 pycharm
- 一个百万富翁碰到一个陌生人,陌生人找他谈了一个换钱的计划.该计划如下:我每天给你10万,而你第一天给我一分钱,第二天我仍给你十万,你给我二分钱,第三天我仍给你十万,你给我四分钱......你每天给我的
- MySQL sql语句