插入APC读写内存

本文详细介绍了在Windows内核模式下使用APC(Asynchronous Procedure Call)进行跨进程内存读写的方法。通过具体代码示例,展示了如何利用PsLookupProcessByProcessId定位目标进程,以及如何使用KeStackAttachProcess和KeUnstackDetachProcess实现温柔的内存读取和写入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "ntddk.h"
#include "a_header.h"


NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
NTKERNELAPI VOID NTAPI KeStackAttachProcess(PEPROCESS Process, PKAPC_STATE ApcState);
NTKERNELAPI VOID NTAPI KeUnstackDetachProcess(PKAPC_STATE ApcState);

ULONG PID = 2340;
ULONG length = 6;
ULONGLONG address = 0x0725F102;

//插入APC温柔读内存
BOOLEAN APCReadProcessMemory()
{
	PEPROCESS pepro;
	LONG retdata = 0;
	KAPC_STATE ExitApc = { 0 };

	NTSTATUS st = PsLookupProcessByProcessId((HANDLE)PID, &pepro);
	if (!NT_SUCCESS(st))
	{
		return FALSE;
	}

	ObDereferenceObject(pepro);
	__try
	{
		KeStackAttachProcess(pepro, &ExitApc);
		ProbeForRead((CONST PVOID)address, length, sizeof(CHAR));
		RtlCopyMemory(&retdata, (PUCHAR)address, length);
		KeUnstackDetachProcess(&ExitApc);
		KdPrint(("读取的数据为:%x", retdata));
	}
	__except (EXCEPTION_EXECUTE_HANDLER)
	{
		KdPrint(("获取失败"));
		KeUnstackDetachProcess(&ExitApc);
		return FALSE;
	}
	return TRUE;
}

//插APC温柔写内存
BOOLEAN APCWriteProcessMemory()
{
	PEPROCESS pepro;
	KAPC_STATE kapc = { 0 };
	NTSTATUS st = PsLookupProcessByProcessId((HANDLE)PID, &pepro);
	if (!NT_SUCCESS(st))
	{
		return FALSE;
	}

	ObDereferenceObject(pepro);
	ULONG64 Cr0;
	__try
	{
		KeStackAttachProcess(pepro, &kapc);
		ProbeForWrite((CONST PVOID)address, length, sizeof(CHAR));
		_disable();
		Cr0 = __readcr0();
		Cr0 &= 0xfffffffffffeffff;
		__writecr0(Cr0);
		_enable();
		memcpy((PCHAR)address, "ffffff", length);
		_disable();
		Cr0 |= 10000;
		__writecr0(Cr0);
		_enable();
		KeUnstackDetachProcess(&kapc);
		KdPrint(("获取成功"));
	}
	__except (EXCEPTION_EXECUTE_HANDLER)
	{
		_disable();
		Cr0 |= 10000;
		__writecr0(Cr0);
		_enable();
		KeUnstackDetachProcess(&kapc);

		KdPrint(("获取失败"));
		return FALSE;
	}
	return TRUE;
}

 

.注入的基本原理是内存注入加执行shell code的方式。 2.通过找到重定位shell code的方式,实现注入。 01:52 内核 APC劫持 1.内核APC劫持是通过插一个内核APC来实现用户模式的执行。 2.内核APC在内核模式执行,可以修改RIP和RBP。 03:29 实验环境和兼容性说明 1.实验仅兼容Windows 10及以后版本,不支持Windows 7。 2.Windows 7不兼容的原因包括隐藏内存和导出函数的问题。 07:37 导入导出函数和日志记录 1.引入必要的头文件和导出函数。 2.使用log宏记录错误信息。 09:33 设置APC函数 1.设置APC函数,参数包括进程ID和注入路由。 2.函数内部实现包括获取线程、插入APC等步骤。 18:34 创建和插入APC 1.创建APC,使用no configure put和size of APC。 2.判断APC是否成功创建,并关闭句柄。1.成功执行内核APC,确认PID为5916,TID为4988。 2.通过主线程注入APC,验证内核APC的执行过程。 04:04 寻找KTRAP_FRAME的方法 1.利用堆栈布局寻找KTRAP_FRAME,确保全系统兼容性。 2.通过initial stack、TSS、KPCRB等方式寻找KTRAP_FRAME。 3.选择initial stack方法,因其位置偏移在所有系统上一致。 06:55 获取Initial Stack的方法 1.使用PsGetCurrentProcess()获取current process。 2.通过initial stack减去KTRAP_FRAME大小找到KTRAP_FRAME。 3.验证找到的KTRAP_FRAME是否正确,通过修改地址并断点验证。 11:06 蓝屏问题的解决 1.在尝试修改KTRAP_FRAME时遇到蓝屏问题。 2.通过调试确认蓝屏原因,发现RKL过高导致问题。 3.调整RKL值并重新测试,确认问题解决。.在驱动中申请内存,直接使用 ZwAllocateVirtualMemory 函数。 2.申请内存前需要隐藏 PID 和分配大小。 3.定义函数 Ta,传入 PID 和分配大小。 4.调用 PsLookupProcessById 和 ZwAllocateVirtualMemory。 06:34 读写文件操作 1.读写文件操作使用 ZwGetFileBuffer 函数。 2.传入文件名、二级指针和文件大小。 3.初始化 Unicode 字符串表示文件名。 4.使用 ZwCreateFile 创建文件句柄。 5.查询文件信息,获取文件大小。 6.根据文件大小申请内存,并读取文件内容到内存中。 7.使用 ZwReadFile 读取文件内容。 8.读取完成后,使用 ZwClose 和 ZwFlushBuffersFile 关闭文件并释放内存。该视频主要讲述了完善APC注入的shell code的过程。首先,复制了之前编写的shell code,并强调了其稳定性和参数填写的必要性。接着,提到了在使用share code时需要注意关闭一些安全检查和防护流保护,以确保代码能够正常生成。然后,复制了manual mapping data和函数指针,并补充了缺少的nt image和重定位标志。最后,通过复制和修改代码,解决了hit memory和文件映射的问题,完成了shell code的完善工作。 分段总结 00:12 ShellCode编写与K_routine修改实验完成 1.完善apc注入的shell code,通过复制已有的shell code作为基础。 2.介绍修改K_routine的步骤,包括关闭安全检查和防护流保护等。 3.通过链接器设置增量链接,确保shell code的正确生成和注入。 4.复制必要的函数指针和图像文件,以支持shell code的执行。 5.通过重定位和标志复制,完成shell code的最终准备。 08:17 ShellCode注入与测试 1.介绍注入shell code的过程,包括手动映射数据和设置APC。 2.提供注入参数的设置方法,包括调用名、路径、PID等。 3.通过复制和修改内核实验中的hit memory代码,实现内存注入申请。 4.详细讲解shell code的执行流程,包括寄存器保存、堆栈对齐和重定位数据的传递。 5.测试注入的shell code,确保其能在目标系统中正确执行。 28:22 ShellCode稳定性与商用考虑 1.讨论shell code的稳定性,以及在商用环境中的应用考虑。 2.建议在使用shell code后及时卸载,以避免被检测到使用过期签名。 3.介绍在商用环境中,通过事件和单对象等待函数来确保注入的稳定性和安全性。1.实验目的:实现无驱动附加的读写功能,验证无需读写技术的可行性。 2.实验原理:通过修改内存指令,实现无驱动的读写操作。 3.实验环境:Windows操作系统,WinDbg调试工具。这个是无驱注入。你看看能不能无驱
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值