设为首页 加入收藏

TOP

驱动开发:内核通过PEB得到进程参数(三)
2023-07-23 13:31:51 】 浏览:77
Tags:通过 PEB 程参数
("hello lyshark \n"); NTSTATUS status = STATUS_UNSUCCESSFUL; PEPROCESS eproc = NULL; KAPC_STATE kpc = { 0 }; PPEB64 pPeb64 = NULL; __try { // HANDLE)4656 进程PID status = PsLookupProcessByProcessId((HANDLE)4656, &eproc); // 得到64位PEB pPeb64 = (PPEB64)PsGetProcessPeb(eproc); DbgPrint("PEB64 = %p \n", pPeb64); if (pPeb64 != 0) { // 验证可读性 ProbeForRead(pPeb64, sizeof(PEB32), 1); // 附加进程 KeStackAttachProcess(eproc, &kpc); DbgPrint("进程基地址: 0x%p \n", pPeb64->ImageBaseAddress); DbgPrint("ProcessHeap = 0x%p \n", pPeb64->ProcessHeap); DbgPrint("BeingDebugged = %d \n", pPeb64->BeingDebugged); // 脱离进程 KeUnstackDetachProcess(&kpc); } } __except (EXCEPTION_EXECUTE_HANDLER) { Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; } Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; }

PEB64代码运行后,我们加载驱动即可看到如下结果:

而相对于64位进程来说,获取32位进程的PEB信息可以直接调用PsGetProcessWow64Process()函数得到,该函数已被导出可以任意使用,获取PEB代码如下。

#include "peb.h"
#include <ntifs.h>

// 定义导出
NTKERNELAPI PVOID NTAPI PsGetProcessPeb(_In_ PEPROCESS Process);

VOID UnDriver(PDRIVER_OBJECT driver)
{
	DbgPrint(("Uninstall Driver Is OK \n"));
}

// LyShark
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
	DbgPrint("hello lyshark \n");

	NTSTATUS status = STATUS_UNSUCCESSFUL;
	PEPROCESS eproc = NULL;
	KAPC_STATE kpc = { 0 };

	PPEB32 pPeb32 = NULL;

	__try
	{
		// HANDLE)4656 进程PID
		status = PsLookupProcessByProcessId((HANDLE)6164, &eproc);

		// 得到32位PEB
		pPeb32 = (PPEB32)PsGetProcessWow64Process(eproc);

		DbgPrint("PEB32 = %p \n", pPeb32);

		if (pPeb32 != 0)
		{
			// 验证可读性
			ProbeForRead(pPeb32, sizeof(PEB32), 1);

			// 附加进程
			KeStackAttachProcess(eproc, &kpc);

			DbgPrint("进程基地址: 0x%p \n", pPeb32->ImageBaseAddress);
			DbgPrint("ProcessHeap = 0x%p \n", pPeb32->ProcessHeap);
			DbgPrint("BeingDebugged = %d \n", pPeb32->BeingDebugged);

			// 脱离进程
			KeUnstackDetachProcess(&kpc);
		}
		
	}
	__except (EXCEPTION_EXECUTE_HANDLER)
	{
		Driver->DriverUnload = UnDriver;
		return STATUS_SUCCESS;
	}

	Driver->DriverUnload = UnDriver;
	return STATUS_SUCCESS;
}

PEB32代码运行后,我们加载驱动即可看到如下结果:

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇驱动开发:内核取ntoskrnl模块基.. 下一篇驱动开发:内核中实现Dump进程转储

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目