首页
社区
课程
招聘
[已解决]驱动读写内存,多条数据或过快时,造成应用层程序各种内存崩溃,疑惑求解答。
发表于: 2019-5-11 16:13 5599

[已解决]驱动读写内存,多条数据或过快时,造成应用层程序各种内存崩溃,疑惑求解答。

2019-5-11 16:13
5599

驱动的读写用了KeStackAttachProcess来完成读写,目前主要是测试读的问题,使用过METHOD_NEITHER,METHOD_BUFFERED方式都不能解决问题,
单线程,或多线程执行读写都会出现问题,崩溃如下,

0x00007FFCB3050504 (ntdll.dll)处(位于 test.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000002F553FFE18 时发生访问冲突。
如有适用于此异常的处理程序,该程序便可安全地继续运行。
NtDelayExecution:
00007FFCB30504F0  mov         r10,rcx  
00007FFCB30504F3  mov         eax,34h  
00007FFCB30504F8  test        byte ptr [7FFE0308h],1  
00007FFCB3050500  jne         NtDelayExecution+15h (07FFCB3050505h)  
00007FFCB3050502  syscall  
00007FFCB3050504  ret 
0x00007FFCAFF61144 (win32u.dll)处(位于 test.exe 中)引发的异常: 0xC0000005: 读取位置 0x000000A0FE32F0C8 时发生访问冲突。

如有适用于此异常的处理程序,该程序便可安全地继续运行。


00007FFC83BFE9B3  call        qword ptr [__imp_GetMessageW (07FFC83D070D8h)]  
00007FFC83BFE9B9  test        eax,eax  
00007FFC83BFE9BB  jne         AfxInternalPumpMessage+9Eh (07FFC83BFEA1Eh)  
这里测试的是内核读取应用程序长整数地址,而且驱动没有崩溃蓝屏,只有应用层错误了。【被读的应用程序没有问题】
检查了应用层代码,局部变量分配内存空间什么的都没有异常。
不知道是不是DeviceIoControl是函数内部错误,读取多条数据而且非常快才会这样的异常,即使给多线程枷锁 DeviceIoControl,也还是发生。
这问题困扰好久了,也查不到什么资料,到底是怎么个回事呢,希望大神能解答下。

ULONG64 CTESTDlg::ReadMemoryLONG64(PREAD_MEMORY_LONG64 pReadMemoryLong64) {

	ULONG64 pOutBuffer = 0;
	ULONG returnLength = 0;
	BOOL bDeviceIoControl = DeviceIoControl(hDevice, READ_MEMORY_CTL_CODE, pReadMemoryLong64, 16, &pOutBuffer ,8,&returnLength, NULL);
	
	return pOutBuffer;
}

ReadProcessBaseAddr() {

	ULONG64 pOutBuffer = 0;
	ULONG returnLength = 0;
	
	MYPROCESS_INFORMATION myProcessInfo;
	
	myProcessInfo.PID = 12072;

	__try {
		BOOL bDeviceIoControl = DeviceIoControl(hDevice, GET_PROCESS_BASE_ADDRESS_CTL_CODE, &myProcessInfo, 16, &pOutBuffer, 8, &returnLength, NULL);
	}
	__except (1) {
		TRACE("aaaa");
	}

	return pOutBuffer;
}



void CTESTDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码

	int a = 0;
	HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);//单线程久了,还是会蹦,

//尝试多线程
 //CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
 //CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
 //CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
 //CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
 //CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
	CloseHandle(hThread);
}

DWORD WINAPI CTESTDlg::ThreadProc(LPVOID lpParameter) {


	while (true)
	{

//这里是测试代码,实际代码中,有上百条 读取地址。
		ULONG64 BaseAddr = ReadProcessBaseAddr();

		//TRACE("BaseAddr:%p \n", BaseAddr);

		READ_MEMORY_LONG64 readMemoryLong64;
		readMemoryLong64.PID = 12072;
		readMemoryLong64.length = 8;
		readMemoryLong64.address = BaseAddr + 25578244;
		ULONG64 ArrayAddr = ReadMemoryLONG64(&readMemoryLong64);

		//TRACE("ArrayAddr:%p \n", ArrayAddr);

	}

	return 0;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-5-12 23:27 被lwbkanxue编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
2
微软:懵逼背锅,咋出bug都先怪我?
结构体的定义呢?exe是x86还是x64?如果单线程都出问题的话,检查一下字节对齐,结构体长度用sizeof。
另外帮大表哥发一句:牢饭真香。
2019-5-11 17:33
0
雪    币: 460
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
都是1字节对齐的,我用C在写下看看,之前用的是C++,可能存在些代码问题。
2019-5-11 19:13
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
大概有三种情况:一,内存被交换出去了,然后当前运行级别不能处理page fault,MDL锁住大概能解决。二,读取一片被释放的内存(堆),越是大型的程序运行时免不了经常申请释放内存。三,ntos在trim working set或者类似的事情的时候,极端的情况下也会报错。剩下的楼下补充。最后一点是牢饭真香。
2019-5-11 20:32
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
5
malokch 大概有三种情况:一,内存被交换出去了,然后当前运行级别不能处理page fault,MDL锁住大概能解决。二,读取一片被释放的内存(堆),越是大型的程序运行时免不了经常申请释放内存。三,ntos在tr ...
讲道理 前两种情况应该在内核层直接蓝屏了吧 就算try了也不会在 DeviceIoControl 抛异常诶~~
2019-5-11 20:55
0
雪    币: 460
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看雪服务器也有烟机的时候...我用 METHOD_OUT_DIRECT 这模式MDL锁住了pOutBuffer ,这个模式的确好了一点点,尝试读取更多条数据时还是会蹦,不知道哪里还有问题。
应用层崩溃,多几次也是会蓝屏。
最后于 2019-5-11 23:07 被lwbkanxue编辑 ,原因:
2019-5-11 22:39
0
雪    币: 460
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
问题已解决,是部分API函数锁住了内存导致无法正常访问,导致的。
2019-5-13 01:21
0
雪    币: 683
活跃值: (622)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
lwbkanxue 问题已解决,是部分API函数锁住了内存导致无法正常访问,导致的。
我之前也遇到过这个问题,能再具体的说一下原因吗,哪些API导致的这个问题?
2019-6-1 01:24
0
雪    币: 433
活跃值: (1900)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
AC的重点在哪儿,大手子的重点就在哪儿,大手子真的喜欢应男而上
2019-6-1 02:25
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
萌克力 AC的重点在哪儿,大手子的重点就在哪儿,大手子真的喜欢应男而上
硬♂男而上
2019-6-1 05:04
0
雪    币: 51
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
牢饭真香 牢饭真香
2019-6-1 10:27
0
雪    币: 460
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Jason姚 我之前也遇到过这个问题,能再具体的说一下原因吗,哪些API导致的这个问题?
数组,复制,释放,等不能多线程操作。
2019-6-3 12:13
0
雪    币: 1036
活跃值: (1306)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
13
你读数据的时候 放每条线程的栈里面 ,就不会有这种情况了。 不要每次驱动去申请个全局地址 去存放,这样多线程就会出问题。
2019-6-3 13:59
0
游客
登录 | 注册 方可回帖
返回
//