Dll注入技术之远程线程注入
DLL注入技术之远线程注入
DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等。
远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行。
当然除了CreateRemoteThread()和LoadLibrary()这个两个主要的API还是远远不够的,我们还需要以下表格所示的API:
| OpenProcess | 打开远程进程 |
| VirtualAllocEx | 在远程进程中申请空间 |
| WriteProcessMemory | 在远程进程中写入数据 |
| WaitForSingleObject | 等待信号量 |
| VirtualFreeEx | 释放远程进程中申请空间 |
| CloseHandle | 关闭句柄 |
主要代码如下:
- int CRemoteThreadInjectDLL::InjectDll(DWORD dwProcessId, PTCHAR szDllName)
- {
- if (szDllName[0] == NULL)
- return -1;
- //提高权限相关操作
- EnablePrivilege(TRUE);
- //1. 打开进程
- HANDLE hProcess = ::OpenProcess( PROCESS_ALL_ACCESS, //打开进程权限
- FALSE, //是否可继承
- dwProcessId); //进程ID
- if (hProcess == INVALID_HANDLE_VALUE)
- return -1;
- //2. 在远程进程中申请空间
- LPVOID pszDllName = ::VirtualAllocEx(hProcess, //远程进程句柄
- NULL, //建议开始地址
- 4096, //分配空间大小
- MEM_COMMIT, //空间初始化全0
- PAGE_EXECUTE_READWRITE); //空间权限
- if (NULL == pszDllName)
- {
- return -1;
- }
- //3. 向远程进程中写入数据
- BOOL bRet = ::WriteProcessMemory( hProcess, pszDllName,
- szDllName, MAX_PATH, NULL);
- if (NULL == bRet)
- {
- return -1;
- }
- //4. 在远程进程中创建远程线程
- m_hInjecthread = ::CreateRemoteThread(hProcess, //远程进程句柄
- NULL, //安全属性
- 0, //栈大小
- (LPTHREAD_START_ROUTINE)LoadLibrary, //进程处理函数
- pszDllName, //传入参数
- NULL, //默认创建后的状态
- NULL); //线程ID
- if (NULL == m_hInjecthread)
- {
- DWORD dwErr = GetLastError();
- return -1;
- }
- //5. 等待线程结束返回
- DWORD dw = WaitForSingleObject(m_hInjecthread, -1);
- //6. 获取线程退出码,即LoadLibrary的返回值,即dll的首地址
- DWORD dwExitCode;
- GetExitCodeThread(m_hInjecthread, &dwExitCode);
- m_hMod = (HMODULE)dwExitCode;
- //7. 释放空间
- BOOL bReturn = VirtualFreeEx(hProcess, pszDllName,
- 4096, MEM_DECOMMIT);
- if (NULL == bReturn)
- {
- return -1;
- }
- CloseHandle(hProcess);
- hProcess = NULL;
- //恢复权限相关操作
- EnablePrivilege(FALSE);
- return 0;
- }
此外,我们还需要提升进程权限以便于提高注入成功率,所需API如下表所示:
| OpenProcessToken | 得到令牌句柄 |
| LookupPrivilegeValue | 得到权限值 |
| AdjustTokenPrivileges | 提升令牌句柄权限 |
- int CRemoteThreadInjectDLL::EnablePrivilege(bool isStart)
- {
- //1. 得到令牌句柄
- HANDLE hToken = NULL; //令牌句柄
- if (!OpenProcessToken( GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ,
- &hToken))
- {
- return FALSE;
- }
- //2. 得到特权值
- LUID luid = {0}; //特权值
- if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
- {
- return FALSE;
- }
- //3. 提升令牌句柄权限
- TOKEN_PRIVILEGES tp = {0}; //令牌新权限
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Luid = luid;
- tp.Privileges[0].Attributes = isStart ? SE_PRIVILEGE_ENABLED : 0;
- if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL))
- {
- return FALSE;
- }
- //4. 关闭令牌句柄
- CloseHandle(hToken);
- return 0;
- }
当要在指定的进程中加载DLL时,我们就需要过滤指定名称的进程,这时遍历进程ID并进行对比,得到所指定的进程,所需API如表所示:
| CreateToolhelp32Snapshot | 创建进程快照 |
| Process32First | 第一个进程快照 |
| Process32Next | 循环下一个进程快照 |
- DWORD CRemoteThreadInjectDLL::GetProcessId(PTCHAR pszProcessName)
- {
- HANDLE hProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (INVALID_HANDLE_VALUE == hProcess)
- {
- return 0;
- }
- DWORD dwProcessId = 0;
- PROCESSENTRY32 process32 = {0};
- process32.dwSize = sizeof(PROCESSENTRY32);
- BOOL bRetProcess = FALSE;
- bRetProcess = ::Process32First(hProcess, &process32);
- do
- {
- if (_tcscmp(pszProcessName, process32.szExeFile) == 0)
- {
- dwProcessId = process32.th32ProcessID;
- break;
- }
- bRetProcess = ::Process32Next(hProcess, &process32);
- }while (bRetProcess);
- ::CloseHandle(hProcess);
- return dwProcessId;
- }
远线程注入API使用较多,不易实现。但是可以批量注入和卸载,这样对于需要反复调试的注入就非常的方便。
Dll注入技术之远程线程注入的更多相关文章
- 远程线程注入DLL
远程线程注入 0x00 前言 远程线程注入是一种经典的DLL注入技术.其实就是指一个新进程中另一个进程中创建线程的技术. 0x01 介绍 1.远程线程注入原理 画了一个图大致理解了下远程线程注入dll ...
- 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程
简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...
- 安全之路 —— 无DLL文件实现远程线程注入
简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着 ...
- 详细解读:远程线程注入DLL到PC版微信
一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...
- 远程线程注入dll,突破session 0
前言 之前已经提到过,远线程注入和内存写入隐藏模块,今天介绍突破session 0的dll注入 其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可 ...
- 远程线程注入DLL突破session 0 隔离
远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...
- 远程线程注入方法CreateRemoteThread
最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是 https://github.com/Ars ...
- DLL注入技术之依赖可信进程注入
DLL注入技术之依赖可信进程注入 依赖可信进程注入原理是利用Windows 系统中Services.exe这个权限较高的进程,首先将a.dll远线程注入到Services.exe中,再利用a.dll将 ...
- windows-CODE注入(远程线程注入)
远程线程注入(先简单说,下面会详细说)今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式) ...
随机推荐
- Vue学习笔记【5】——如何定义一个基本的Vue代码结构
插值表达式{{}} 和 v-text 默认 v-text 是没有闪烁问题的: v-text会覆盖元素中原本的内容,但是 插值表达式只会替换自己的这个占位符,不会把 整个元素的内容清空 v-cloak ...
- 【NOI2011】兔农(循环节)
我居然没看题解瞎搞出来了? 题解: 不难想到找到每次减1的位置,然后减去它对最终答案的贡献. 假设有一个地方是\(x,1(mod~k)\) 那么减了1后就变成了\(x,0\). 然后可以推到\(x,0 ...
- CF1016F 【Road Projects】
思路 可以考虑另一种想法:因为我们发现,答案是肯定不会大于在原来的树上的最短路径的.所以原来的最短路是(有可能的)最大值! 我们把树变成这样,提取出1~n的路径,方便观看撕烤: (它有个我起的名字,叫 ...
- RestHighLevelClient客户端相关CURD操作
客户端连接 public void start() { try { restHighLevelClient = new RestHighLevelClient( RestClient.builder( ...
- cd 命令行进入目标文件夹
当我在默认路径中使用cd命令时,如果我要进入D:\mytext 文件夹,那么直接使用cd D:\mytext 是不行的 正确的使用是先使用d:进入D盘,然后再进入mytext文件夹
- Java8 时间调节器
TemporalAdjuster 是做日期数学计算.例如,要获得“本月第二个星期六”或“下周二”. 让我们来看看他们的操作. 选择使用任何编辑器创建以下java程序在 C:/> JAVA Jav ...
- 【HDOJ】P2058 The sum problem
题意很简单就是给你一个N和M,让你求在1-N的那些个子序列的值等于M 首先暴力法不解释,简单超时 再仔细想一想可以想到因为1-N是一个等差数列,可以运用我们曾经学过的只是来解决 假设开始的位置为s,结 ...
- C语言typedef
#include <stdio.h> //基本类型 typedef int MyInt; //可以对typedef产生的类型名二次起别名 typedef MyInt MyInt2; // ...
- D3.js(v3)+react 制作 一个带坐标与比例尺的散点图 (V3版本)
上一章做了柱形图,https://www.cnblogs.com/littleSpill/p/10835041.html 这一章做散点图. 散点图(Scatter Chart),通常是一横一竖 ...
- Async await 异步编程说明
希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task 和 await ...