首页
社区
课程
招聘
[求助]多线程中的硬件断点报错!
发表于: 2018-9-28 19:38 4847

[求助]多线程中的硬件断点报错!

2018-9-28 19:38
4847
写了一个VEH HOOK,在多线程情况下总是会报异常(C0000005),有时在设置硬件断点时,有时在取消硬件断点时。
请问各位大大,在设置多线程硬件断点时应该怎么避免这个问题?感恩!
BOOL VEHHook(DWORD idProcess)
{
	HANDLE hThread = OpenThread(THREAD_SET_CONTEXT | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, idProcess);			//打开线程

	CONTEXT thread_context;
	memset(&thread_context, 0, sizeof(CONTEXT));			//清零结构内存
	thread_context.ContextFlags = CONTEXT_ALL;		        //设置flag  CONTEXT_ALL
	SuspendThread(hThread);							//暂停线程
	GetThreadContext(hThread, &thread_context);			//获取线程环境(上下文)		

	thread_context.Dr0 = ProcessBase;
	thread_context.Dr1 = NULL;
	thread_context.Dr2 = NULL;
	thread_context.Dr3 = NULL;
	thread_context.Dr6 = NULL;
	thread_context.Dr7 = Dr7int;

	thread_context.ContextFlags = CONTEXT_ALL;				//设置flag
	BOOL Tf = SetThreadContext(hThread, &thread_context);	        //重置上下文

	if (Tf == FALSE)
	{
		ResumeThread(hThread);
		CloseHandle(hThread);							        //关闭对象
		daAddText(pWndTO, 1001, L"设置上下文失败!");
		return FALSE;
	}

	ResumeThread(hThread);								//恢复线程
	CloseHandle(hThread);								        //关闭对象

	return TRUE;
}

void ThreadID(UINT32 processId)
{
	DWORD idProcess = 0;									// 线程ID
	THREADENTRY32 te;									// 线程信息
	te.dwSize = sizeof(THREADENTRY32);

	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);  // 系统所有线程快照

	if (Thread32First(hSnapshot, &te))						// 第一个线程
	{
		do
		{
			if (processId == te.th32OwnerProcessID)		// 如果进程ID等于当前进程ID
			{
				idProcess = te.th32ThreadID;				// 取当前进程主线程ID
				VEHHook(idProcess);
			}
		} while (Thread32Next(hSnapshot, &te));				// 下一个线程
	}

	CloseHandle(hSnapshot);							// 删除快照
}


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

最后于 2018-9-28 19:39 被卡达编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
设置DRx寄存器,建议先挂起线程再设置,设置完了再恢复。
再有,没有看到你的VEH Handler啊。
2018-9-28 22:40
0
雪    币: 167
活跃值: (1574)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
CONTEXT_ALL  .... 你只需要修改DrX,请看下文档换成更合适的参数类型。
2018-9-29 14:58
0
雪    币: 3
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Morgion 设置DRx寄存器,建议先挂起线程再设置,设置完了再恢复。 再有,没有看到你的VEH Handler啊。
设置DRx寄存器挂起线程了,VEH没有贴出来。
2018-10-1 09:44
0
雪    币: 3
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Nisy CONTEXT_ALL .... 你只需要修改DrX,请看下文档换成更合适的参数类型。
换成其它参数类型的也一样
2018-10-1 09:44
0
雪    币: 3
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
原因找到了,是打开线程权限上出问题。好奇怪为什么有时可以正常设置有时出错。现在改成这样正常没问题了。谢谢各位指点。
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, idProcess);                        //打开线程
最后于 2018-10-1 09:47 被卡达编辑 ,原因:
2018-10-1 09:46
0
雪    币: 1545
活跃值: (4598)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
暂停线程再写寄存器
2023-5-4 15:38
0
游客
登录 | 注册 方可回帖
返回
//