使用 ZwCreateThreadEx 函数强力注入 Dll

news/2024/11/15 17:54:31/文章来源:https://www.cnblogs.com/lostin9772/p/18394653

常用的线程注入方法有:远程线程注入、全局消息钩子注入、APC 应用层异步注入ZwCreateThreadEx 强力注入等。

今天我们讲一下ZwCreateThreadEx 强力注入的这种方法。之前的远程线程通过 CreateRemoteThread 函数来进行 Dll 注入,这种方式可以注入普通的进程,但是却无法注入到系统进程中,因为系统进程是处在 SESSION0 高权限级别的会话层。

由于 CreateRemoteThread 底层实际上会调用 ZwCreateThreadEx 这个未公开的内核函数,该内核函数在 ntdll.dll 中,所以我们必须通过 GetProcAddress 函数将其地址导出。

step 1

和远程线程注入的前面步骤类似,要想跨进程调用 LoadLibaray 函数,首先我们必须把需要加载的 Dll 路径写入到目标进程地址空间,然后获取 LoadLibrary 函数在目标进程空间的地址:

HANDLE hProcess = NULL;
PSTR fileName = NULL;
FARPROC pfnThreadRtn = NULL;
HANDLE hRemoteThread = NULL;// 打开注入进程,获取进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
if (NULL == hProcess)
{printf("打开进程失败\r\n");return FALSE;
}// 计算将注入 Dll 文件的完整路径长度
SIZE_T fileNameLen = strlen(DllName) + 1;// 在目标空间申请一块长度为 fileNameLen 大小的内存空间
fileName = (PSTR)VirtualAllocEx(hProcess, NULL, fileNameLen, MEM_COMMIT, PAGE_READWRITE);
if (NULL == fileName)
{CloseHandle(hProcess);printf("在目标空间申请内存空间失败\r\n");return FALSE;
}// 将 Dll 文件的完整路径写入目标进程申请的空间内
if (FALSE == WriteProcessMemory(hProcess, fileName, (PVOID)DllName, fileNameLen, NULL))
{VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);CloseHandle(hProcess);printf("将完整路径写入目标进程空间失败\r\n");return FALSE;
}// 在我们进程空间内获得 LoadLibrary 函数的地址
pfnThreadRtn = GetProcAddress(GetModuleHandle(L"Kernel32"), "LoadLibraryA");
if (NULL == pfnThreadRtn)
{VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);CloseHandle(hProcess);printf("获取 LoadLibrary 函数地址失败\r\n");return FALSE;
}

step 2

然后,由于 ZwCreateThreadEx 函数在 ntdll.dll 中是未导出的,因此我们需要把该模块加载进去,然后再获取函数地址:

// 加载 ntdll.dll
HMODULE hNtModule = LoadLibraryA("ntdll.dll");
if (NULL == hNtModule)
{VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);CloseHandle(hProcess);printf("加载 hNtModule 模块失败\r\n");return FALSE;
}

step 3

获取函数地址之前,我们需要定义一个函数指针用来接收函数地址。由于该函数在 32 位和 64 位系统下的定义是不一样的,所以我们定义函数指针也要对应才可以,然后通过 GetProcAddress 获取函数地址:

	// 定义一个函数指针,并从 ntdll.dll 中获取 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(hNtModule, "ZwCreateThreadEx");

step 4

准备工作完毕后,就可以进行注入了:

// 使用 ZwCreateThreadEx 创建远程线程,实现强力注入 Dll 文件
int status = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hProcess,(LPTHREAD_START_ROUTINE)pfnThreadRtn, fileName, 0, 0, 0, 0, NULL);
if (NULL == hRemoteThread)
{CloseHandle(hNtModule);VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);CloseHandle(hProcess);printf("使用 ZwCreateThreadEx 函数注入 Dll 失败\r\n");return FALSE;
}

step 5

最后,我们来调用注入函数:

int main()
{if (ZwCreateThreadInjectDll(1068, "C:\\Users\\Administrator\\Desktop\\console_Dll.dll")){printf("注入成功\r\n");}system("pause");return 0;
}

效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791676.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标 对软件工程有全面的了解,并且对AIGC和ChatGPT等人工智能技术有深入的认识,可以更灵活地利用AI作为辅助工具。学…

Spring 学习笔记

概述 Spring 是一个企业级 J2EE 应用开发一站式解决方案,其提供的功能贯穿了项目开发的表现层、业务层和持久化层,同时,Spring 可以和其他应用框架无缝整合 Spring 的特性包括以下几个方面:轻量:Spring 是一个轻量级的框架,其核心 JAR 包的大小均为 1MB 左右。从系统的资…

keycloak~Refresh_token阶段不走RequiredAction

Refresh_token是在access_token过期之后,用来换新的access_token的,有了Refresh_token之后,用户可以在很长一段时间不需要重新登录,这对于用户体验是有好处的;RequiredAction是一种登录阶段的必选行为,当一个用户被某个RequiredAction标记之后,用户必须完成RequiredActi…

谁还不知道用ChatmoneyAI写短剧脚本,真能火

本文由 ChatMoney团队出品现在大家打开抖音、小红书,琳琅满目,目光所能及的都是各种吸精剧情的小短剧,虽然这些短剧的制作成本低,但是作为编剧的要写脚本,可不认为这么容易啊......... 接下来我给大家推荐一下使用ChatmoneyAI创作短剧脚本的步骤吧,让你笔下的短剧也能轻轻…

【研判系列】研判事件汇总

原创 零漏安全1、木马后门程序Chopper Webshell检测2、webshell caidao_client,木马后门程序Chopper Webshell检测3、木马后门程序Chopper Webshell检测4、webshell caidao_client5、蚁剑webshell通信行为6、apache log4j2远程代码执行漏洞7、sql注入oracle func chr8、sql注入…

如何查看极狐GitLab 的组件状态?

本文分享使用 gitlab-ctl 命令来对极狐GitLab 的组件进行状态查询和关闭与重启等操作。 极狐GitLab 是一个多组件系统,主要组件包括:Gitaly GitLab exporter Nginx Redis Sidekiq PostgreSQL Puma Workhorse Registrygitlab-ctl可以对上述组件的状态进行查询,以及关闭、重启…

10、DB-创建数据库表-SQL语句

-- 目标:创建一个school数据库create database `school`; -- 创建一个学生表(列、字段) 使用SQL创建 -- 学号int 登陆密码varchar(20) 姓名 性别varchar(2) 出生日期(datetime) 家庭地址 email-- 注意点:使用英文() 表的名称 和 字段 尽量使…

基于 Zynq-7 的高性能 PCIe 载板

基于 Zynq-7 的高性能 PCIe 载板是一款高性能 PCIe 2.0X8 的载板 , 板载 1 个 HPC 形式的 FMC 连接器。主控芯片采用 Xilinx 公司 Zynq-7 系列SoC 家族中的 XC7Z100-2FFG900I(兼容 XC7Z045-2FFG900和 XC7Z035-2FFG900)。其 PS 搭配 2 颗 16bit-1866 的512MB DDR3 SDRAM 和一片…

STM32的bootloader探究

bootloader是MCU上电之后运行的第一段程序,记录我对bootloader的学习过程OTAOTA(Over-The-Air Technology,空中下载技术)是一种通过无线网络对设备进行远程升级的技术。这种技术最初在PC电脑和移动手机行业中得到应用,近年来在汽车行业中也得到了广泛的应用。IAP:In-Appl…

给P人一点小小震撼!铁威马UI全新设计!更友好更美观~

开学了,小马居然发现有学校竟然玩起了新花样,通过MBTI来分宿舍,这脑洞大开的创意简直让人直呼内行! 你是P人还是J人? 在MBTI人格分类中,J人喜欢条理清晰的计划,而P人则倾向于随性所欲。 想象一下,J人与P人意外成了室友,那画面也是挺有趣的,可能会有不少‘文化碰撞’的…

php获取FTP服务器中文件内容返回给前端

有一个需求是访问存储在群辉Synology NAS上的图片,https://ip:port/path/to/image.jpg,用浏览器打开会出现“您的连接不是私密/安全连接”错误。网上检索资料发现可能是因为缺少SSL证书的关系。 引用 https://www.cloudflare-cn.com/learning/ssl/connection-not-private-exp…

开源问卷调查和考试系统 SurveyKing 安装和使用教程

最近公司又要搞什么满意度调查了,我这个小菜鸟又要头疼了。上次用那个破系统,界面丑不说,功能还少得可怜,搞得我加班到半夜。这回非得找个好用的不可。 正发愁呢,突然想起来前两天同事小王推荐了一个叫 “卷王” 的开源系统,这名字挺有意思的,我还以为是什么 “卷王” 专…