驱动读写(只有读)

这里是参考链接

https://www.bilibili.com/video/av26193169?t=992&p=19

这篇博客是根据 这个 教程写的

然后 大佬 说了一个函数 感觉挺有必要注意的

	if (!MmIsAddressValid(DbgDir))
		break;

这样判断内存是否可用 其实是不对的 

这个内存 只会判断 这个地址是否有效  而 我们读入的内存是r3层的

如果 这个 内存 转换进了 物理层 而出现了缺页  

那么 这个函数 判断不出来  结果会让我们 蓝屏 

正确的应该这样写

__try
			{	 
				ProbeForRead((processbaseaddr+offset),sizeof(readcode),1);
				RtlCopyMemory((PVOID)readcode, (PVOID)(processbaseaddr + offset), sizeof(readcode));

			}
			__except (1)
			{
				DbgPrint("Memory is error\n");
			}

这样就能看这个内存可读不可读了

然后整体代码就是

#include<ntifs.h>
#include<windef.h>

NTKERNELAPI
PVOID
PsGetProcessSectionBaseAddress(
__in PEPROCESS Process
);

BYTE        readcode[4] = {0};

ULONG       offset = 0x10;

VOID        MyProcessNotift(HANDLE ParentId,HANDLE ProcessId,BOOLEAN Create)
{
	if (Create&&ProcessId!=4&&ProcessId!=0)
	{
		PEPROCESS tempEp = NULL;
		NTSTATUS  status = STATUS_SUCCESS;
		PUCHAR    processbaseaddr = NULL;
		KAPC_STATE  temp_stack = { 0 };
		status = PsLookupProcessByProcessId(ProcessId,&tempEp);
		if (tempEp)
		{
			ObDereferenceObject(tempEp);
			processbaseaddr = (PUCHAR)PsGetProcessSectionBaseAddress(tempEp);

			if (!processbaseaddr)
			{
				DbgPrint("get  process addr file!\n");
				return;
			}
			RtlZeroMemory(readcode, sizeof(readcode));

			KeStackAttachProcess(tempEp, &temp_stack);
			__try
			{	 
				ProbeForRead((processbaseaddr+offset),sizeof(readcode),1);
				RtlCopyMemory((PVOID)readcode, (PVOID)(processbaseaddr + offset), sizeof(readcode));

			}
			__except (1)
			{
				DbgPrint("Memory is error\n");
			}
			KeUnstackDetachProcess(&temp_stack);
			for (int i = 0; i < sizeof(readcode); i++)
			{ 
				DbgPrint("read %x", readcode[i]);
			}
			return;
		}

	}



}

VOID        Unload(PDRIVER_OBJECT driver)
{  

	PsSetCreateProcessNotifyRoutine(MyProcessNotift, TRUE);
	DbgPrint("Unload\n");
}

NTSTATUS      DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
	NTSTATUS   status = STATUS_SUCCESS;
	status = PsSetCreateProcessNotifyRoutine(MyProcessNotift, FALSE);
	driver->DriverUnload = Unload;
	if (!NT_SUCCESS(status))
	{
		DbgPrint("creat processNotify Failed\n");
	}
	return STATUS_SUCCESS;
}

我们获取的是 基地址 也就是   400010

我们来看一下

在这里 就能看的出来 

然后我们看一下  内存读出的结果

正确读出。。。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值