一个远程线程注入的类

未用过,不知道好用不。费话少说,附上代码:

RemThreadInjector.h Code

  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);

posted on 2011-12-14 14:14 高手superior 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/jackson-leung/archive/2011/12/14/Class-of-DLL-Inject.html

一个远程线程注入的类相关推荐

  1. DLL注入_远程线程注入

    什么是线程注入? 线程注入,是通过开启远程线程的方式,将DLL加载到目标宿主进程中的常用方式. 什么是动态链接库? 首先Windows中链接库分为两种:动态链接库DLL.静态链接库LIB. ① 静态链 ...

  2. 远程线程注入引出的问题

    一.远程线程注入基本原理 远程线程注入--相信对Windows底层编程和系统安全熟悉的人并不陌生,其主要核心在于一个Windows API函数CreateRemoteThread,通过它可以在另外一个 ...

  3. windows-CODE注入(远程线程注入)

    远程线程注入(先简单说,下面会详细说) 今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式 ...

  4. DLL 远程线程注入

    远程线程注入 首先 , 这里讲和为注入 , 通俗讲 , 就是把自己的东西强加给别人 也就是在 其他程序的运行的内存空间里面 插入自己的代码 这里提到的远程线程注入 这个算是很常用,也算是用的比较多的一 ...

  5. 基于应用层自身反远程线程注入的研究

    基于应用层自身反远程线程注入的研究 现状:目前所有已知的反远程注入方式:r0层hook 句柄的获取,返回失败,让应用层注入者拿不到目标进程的句柄,如hook ntopenprocess ntdubli ...

  6. WinAPI【远程注入】利用远程线程注入DLLDelphi版

    { WinAPI[远程注入]利用远程线程注入DLLDelphi版} (okwary) 小叹的学习园地 ( SDK文档里是这样描述的:进程是一个正在运行的程序,它拥有自己的地址空间,拥有自己的 ...

  7. 什么是远程线程注入?

    远程线程注入 首先,要说明白远程线程注入,必须得弄明白什么是远程线程以及什么是注入! 远程线程 这里的远程指的是别的进程空间,大家应该都在自己代码中或多或少运用过多线程,这里给出常见的win32创建线 ...

  8. 远程线程注入DLL到PC版微信

    一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...

  9. 详细解读:远程线程注入DLL到PC版微信

    一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...

  10. 易语言远程线程注入DLL到游戏

    远程线程注入CreateRemoteThread通过获取注入目标进程的句柄,把我们的DLL注入到目标进程内存地址,远程线程的意思是另一个进程中的线程,并非远控的意思,也就是远程线程注入是指一个进程在另 ...

最新文章

  1. 微软服务器迁移工具,在 Azure Migrate 中添加迁移工具 - Azure Migrate | Microsoft Docs
  2. mysql数字字符串教程_很全面的mysql字符串函数的教程
  3. 移动端适配与响应式布局
  4. 上云七步走,助力垂直电商降本增效
  5. quora html5,英语口语练习_Quora精选:外国人眼中5个最美英文单词_沪江英语
  6. 视差滚动的爱情故事之优化篇
  7. [设计模式] - Proxy代理模式
  8. jquery获取前一个月日期
  9. 混乱的MVC,.NET非要MVC不可么?
  10. ALGO-84 矩阵乘法
  11. notion自建服务器,最详细的NOTION功能模块列表
  12. 文件那些事儿之一(初稿)
  13. 2010_8_16_Router_路由器的密码恢复
  14. 科研软件宝藏公众号开通
  15. jmp指令流程图怎么写_NS流程图是什么?规范实用的流程图工具
  16. 流程驱动管理vs 数据驱动管理
  17. go语言对gif的抽帧压缩
  18. 第六节课 pycharm
  19. 一个百万富翁碰到一个陌生人,陌生人找他谈了一个换钱的计划.该计划如下:我每天给你10万,而你第一天给我一分钱,第二天我仍给你十万,你给我二分钱,第三天我仍给你十万,你给我四分钱......你每天给我的
  20. MySQL sql语句

热门文章

  1. 如何使用Snagit修剪视频?
  2. Mac上自动隐藏或显示菜单栏
  3. 苹果电脑如何正确断网?macOS操作系统断网方法
  4. idea + debug
  5. NEFU 117-素数个数的位数(素数定理)
  6. Python Django开发中XSS内容过滤问题的解决
  7. 如何让Activiti-Explorer使用sql server数据库
  8. ios学习:UIToolBar的单独使用
  9. 入职 6 个月,被裁员。。。
  10. CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了