• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Windows驱动开发(一) MDL驱动读写

武飞扬头像
Circlefork
帮助7

使用MDL驱动读写应该是最常见的读写内存方式

不多说 直接上代码

typedef struct  TongL_Process
{
    ULONG pid;						//进程ID
    ULONG64 Address;				//内存地址
    ULONG64 buf;					//缓冲区指针
    ULONG Size;						//内存大小
}TongL_PROCESS, * PTongL_PROCESS;

读:

		PTongL_PROCESS pInputData = (PTongL_PROCESS)InputData;
		Status = PsLookupProcessByProcessId((HANDLE)pInputData->pid, &process);
		if (NT_SUCCESS(Status) && MmIsAddressValid((PVOID)pInputData->buf) && process != NULL)
		{
			PMDL mdl = IoAllocateMdl((PVOID)pInputData->buf, pInputData->Size, 0, 0, NULL);
			if (!mdl) break;
			MmBuildMdlForNonPagedPool(mdl);
			unsigned char* Map = (unsigned char*)MmMapLockedPages(mdl, KernelMode);
			if (!Map)
			{
				IoFreeMdl(mdl);
				break;
			}
			TargetAddress = (PVOID)pInputData->Address;
			TargetSize = pInputData->Size;
			if (PsGetCurrentProcess() != process)
			{
				KeStackAttachProcess(process, &apc);
				attach = TRUE;
			}
			__try {
				if (MmIsAddressValid(TargetAddress))
				{
					RtlCopyMemory(Map, TargetAddress, TargetSize);
					KeLowerIrql(KeRaiseIrqlToDpcLevel());
				}
			}
			__except (1) {
				DbgPrint("无法访问地址.\n");
			}
			if (attach) KeUnstackDetachProcess(&apc);
			MmUnmapLockedPages((PVOID)Map, mdl);
			IoFreeMdl(mdl);
		}
		break;
学新通

写:

		PTongL_PROCESS pInputData = (PTongL_PROCESS)InputData;
		Status = PsLookupProcessByProcessId((HANDLE)pInputData->pid, &process);
		if (NT_SUCCESS(Status) && MmIsAddressValid((PVOID)pInputData->buf) && process != NULL)
		{
			PMDL mdl = IoAllocateMdl((PVOID)pInputData->buf, pInputData->Size, 0, 0, NULL);
			if (!mdl) break;
			MmBuildMdlForNonPagedPool(mdl);
			unsigned char* Map = (unsigned char*)MmMapLockedPages(mdl, KernelMode);
			if (!Map)
			{
				IoFreeMdl(mdl);
				break;
			}
			TargetAddress = (PVOID)pInputData->Address;
			TargetSize = pInputData->Size;
			if (PsGetCurrentProcess() != process)
			{
				KeStackAttachProcess(process, &apc);
				attach = TRUE;
			}
			__try {
				if (MmIsAddressValid(TargetAddress))
				{
					cr0 = __readcr0();
					cr0 &= 0xfffffffffffeffff;
					__writecr0(cr0);
					_disable();
					RtlCopyMemory(TargetAddress, Map, TargetSize);
					KeLowerIrql(KeRaiseIrqlToDpcLevel());
					cr0 = __readcr0();
					cr0 |= 0x10000;
					_enable();
					__writecr0(cr0);
				}
			}
			__except (1) {
				DbgPrint("无法访问地址.\n");
			}
			if (attach) KeUnstackDetachProcess(&apc);
			MmUnmapLockedPages((PVOID)Map, mdl);
			IoFreeMdl(mdl);
		}
		break;

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhchaa
系列文章
更多 icon
同类精品
更多 icon
继续加载