首页
社区
课程
招聘
[求助]驱动写入虚拟内存蓝屏
发表于: 2018-11-30 19:29 4413

[求助]驱动写入虚拟内存蓝屏

2018-11-30 19:29
4413
写入虚拟地址会报错  
错误代码 APC_INDEX_MISMATCH
有大神指导一下么  
刚接触驱动
if (!NT_SUCCESS(PsLookupProcessByProcessId(PID, &Process)))
			{
				DPRINT("[MuQ]AttachFail \n");
				break;
			}
			DPRINT("Tring to attach the process \n");
			KeStackAttachProcess(Process, &pKs);
			if(MmIsAddressValid(rStruct->TargetAddress))
			{
				DPRINT("Allocating MDL \n");
				Mysleep(1500);
				pMdl = IoAllocateMdl(rStruct->TargetAddress, rStruct->WriteSize, FALSE, FALSE, NULL);
				if(pMdl)
				{
					
					DPRINT("MmProbeAndLockPages \n");
					Mysleep(1500);
					MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess);
					DPRINT("Mapping MDL \n");
					PVOID Mapping = MmMapLockedPagesSpecifyCache(pMdl, KernelMode, MmNonCached, NULL, FALSE, NormalPagePriority);
					if(MmIsAddressValid(Mapping))
					{
						DPRINT(" MDL Map Success: %X \n", Mapping);
						Mysleep(1500);
						MmProtectMdlSystemAddress(pMdl, PAGE_READWRITE);
 
						DPRINT("Trying to Copy Memory \n");
						Mysleep(1500);
 
						__try
						{
							memcpy(Mapping,rStruct->WriteBuffer,rStruct->WriteSize);
						}
						__except(EXCEPTION_EXECUTE_HANDLER)
						{
							break;						
						}
 
 
					}
					else { DPRINT("Address Not Valid 1\n"); }
					MmUnmapLockedPages(Mapping, pMdl);
					IoFreeMdl(pMdl);
				}
				else { DPRINT("MDL Allocate Failed \n"); }
			}
			else { DPRINT("Address Not Valid 0\n"); }
			KeUnstackDetachProcess(&pKs);
			ObDereferenceObject(Process);
			break;
		}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-11-30 19:31 被Giftia编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
求大神帮忙
最后于 2018-11-30 19:32 被Giftia编辑 ,原因:
2018-11-30 19:31
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2018-12-1 01:04
0
雪    币: 116
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
你代码有bug,cr3和mdl修改其他进程虚拟内存的代码我都有,
2018-12-5 06:25
0
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
恋上下班 你代码有bug,cr3和mdl修改其他进程虚拟内存的代码我都有,
老哥给个联系方式?
2018-12-5 20:28
0
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
q1478450488
2018-12-5 21:03
0
雪    币: 156
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
Giftia q1478450488
我改了ID,我加你了。源码我已经上传了
2018-12-5 23:57
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
把KeUnstackDetachProcess放到__except里面,不然出现异常就不会再执行KeUnstackDetachProcess,就会蓝屏

KeStackAttachProcess 和  KeUnstackDetachProcess  是成对使用的,使用了 KeStackAttachProcess 就必须用 KeUnstackDetachProcess ,不然肯定蓝屏
你使用了 __try就要考虑到出现异常后的事情。


if (!NT_SUCCESS(PsLookupProcessByProcessId(PID, &Process)))

{

DPRINT("[MuQ]AttachFail \n");

break;

}

DPRINT("Tring to attach the process \n");

KeStackAttachProcess(Process, &pKs);

if(MmIsAddressValid(rStruct->TargetAddress))

{

DPRINT("Allocating MDL \n");

Mysleep(1500);

pMdl = IoAllocateMdl(rStruct->TargetAddress, rStruct->WriteSize, FALSE, FALSE, NULL);

if(pMdl)

{

DPRINT("MmProbeAndLockPages \n");

Mysleep(1500);

MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess);

DPRINT("Mapping MDL \n");

PVOID Mapping = MmMapLockedPagesSpecifyCache(pMdl, KernelMode, MmNonCached, NULL, FALSE, NormalPagePriority);

if(MmIsAddressValid(Mapping))

{

DPRINT(" MDL Map Success: %X \n", Mapping);

Mysleep(1500);

MmProtectMdlSystemAddress(pMdl, PAGE_READWRITE);

DPRINT("Trying to Copy Memory \n");

Mysleep(1500);

__try

{

memcpy(Mapping,rStruct->WriteBuffer,rStruct->WriteSize);

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

KeUnstackDetachProcess(&pKs);

break;                     

}

}

else { DPRINT("Address Not Valid 1\n"); }

MmUnmapLockedPages(Mapping, pMdl);

IoFreeMdl(pMdl);

}

else { DPRINT("MDL Allocate Failed \n"); }

}

else { DPRINT("Address Not Valid 0\n"); }

KeUnstackDetachProcess(&pKs);

ObDereferenceObject(Process);

break;

}


最后于 2018-12-14 18:23 被老坛酸菜TM编辑 ,原因:
2018-12-14 18:22
0
游客
登录 | 注册 方可回帖
返回
//