首页 > 其他分享 >使用 ZwCreateThreadEx 函数强力注入 Dll

使用 ZwCreateThreadEx 函数强力注入 Dll

时间:2024-09-03 15:25:23浏览次数:5  
标签:函数 Dll fileName 注入 强力 ZwCreateThreadEx NULL hProcess

常用的线程注入方法有:远程线程注入、全局消息钩子注入、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 _WIN64
	typedef 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);
#else
	typedef 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
	typedef_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;
}

效果如下:

标签:函数,Dll,fileName,注入,强力,ZwCreateThreadEx,NULL,hProcess
From: https://www.cnblogs.com/lostin9772/p/18394653

相关文章

  • 启动应用程序出现SebBackgroundManagerPolicy.dll找不到问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个SebBackgroundManagerPolicy.dll文件(挑选合......
  • 全局消息钩子注入 Dll
    常用的线程注入方法有:远程线程注入、全局消息钩子注入、APC应用层异步注入、ZwCreateThreadEx强力注入和纯汇编实现的线程注入等。今天我们讲一下全局消息钩子注入的这种方法,其原理是通过SetWindowsHookEx函数,注册一个全局消息钩子,当我们截获到消息时(只要权限足够,任何基于消......
  • 远程线程注入 Dll
    常用的线程注入方法有:远程线程注入、普通消息钩子注入、全局消息钩子注入、APC应用层异步注入、ZwCreateThreadEx强力注入和纯汇编实现的线程注入等。今天我们讲一下远程线程注入的这种方法,其原理是获取LoadLibrary系统函数的地址(我们知道系统函数的地址在每个进程中都是保持......
  • Dll 可执行文件的编写与调用
    一、Dll可执行文件的编写首先我们需要在VS创建一个动态链接库(DLL)项目,然后会生成如下代码://dllmain.cpp:定义DLL应用程序的入口点。#include"pch.h"BOOLAPIENTRYDllMain(HMODULEhModule,//指向Dll模块的句柄DWORDul_reason_for......
  • 《鸣潮》游戏崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”该怎么解决?鸣潮游戏闪
    在《鸣潮》游戏中,若出现崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”,可尝试重新安装游戏运行所需的组件。检查系统环境是否完整,确保相关动态链接库文件正确安装,以解决此问题,顺利进行游戏。本篇将为大家带来《鸣潮》游戏崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”该......
  • “由于找不到 acui23.dll 无法执行代码”专家级修复教程:详尽步骤助您重启应用程序
    当您尝试运行AutoCAD或其他依赖acui23.dll文件的应用程序时,可能会遇到“由于找不到acui23.dll无法执行代码”的错误提示。这通常意味着系统中缺少必要的动态链接库文件或存在兼容性问题。本文将详细解释这个问题的原因,并提供多种解决方法,帮助您顺利运行应用程序。acui2......
  • WinRM远程管理受阻?wsclient.dll缺失的诊断与修复全流程
    wsclient.dll是一个与Windows系统相关的动态链接库(DLL)文件,通常与Windows远程管理(WinRM)服务有关。WinRM服务允许远程访问和管理Windows系统,wsclient.dll可能包含了处理远程请求、资源管理和与其他系统组件交互等功能所需的函数和资源,对于确保远程管理功能的正常运行非常重要。......
  • hp1006pp.dll:HP打印机驱动的核心,受损后的修复指南
    hp1006pp.dll是一个与HP打印机相关的动态链接库(DLL)文件,通常与HPLaserJet1006等型号的打印机驱动程序的功能实现有关。这个DLL文件可能包含了处理打印作业、资源管理和与其他系统组件交互等功能所需的函数和资源,对于确保打印机驱动程序的正常运行非常重要。当hp1006pp.dll......
  • IDA反编译dll库时导入C++头文件
    引言有时候,可能因为硬盘损坏等等原因,自己曾经写的动态链接库源码丢失了,幸好对应的头文件得以保留了下来,这个动态链接库主要是某种算法的实现,并没有继承其他的一些类库,比如MFC之类的,而自己对算法的实现已经忘得差不多了,而突然又需要该算法的实现过程,那么有什么办法可以帮助......
  • 八款精品图纸加密软件强力推荐2024年图纸加密软件最佳选择!
    在数字化时代,设计图纸的安全问题越来越受到企业的重视。为了保障企业的知识产权和核心竞争力,选择一款合适的图纸加密软件显得尤为重要。以下是2024年八款精品图纸加密软件的强力推荐,它们各具特色,能够满足不同企业的需求。1.安秉网盾安秉网盾是一款专为企业设计的信息安全管......