首页
社区
课程
招聘
[求助]关于VEH +DLL注入 躲避运行CRC检测遇到的问题
发表于: 2017-6-10 17:49 9689

[求助]关于VEH +DLL注入 躲避运行CRC检测遇到的问题

2017-6-10 17:49
9689

通过全局键盘勾子注入

使用ul_reason_for_call  设置硬件断点,运行有几个问题,请教各位大神


程序在X64位系统下可以正常断下来并进到VEH异常处理函数中,但在32系统断不下来,怎么也进不到VEH异常处理

不知道问题出在什么地方


注入的程序在运行时会 新创建5个线程,利用DLL的DLL_THREAD_ATTACH对其进行设硬件断点,64位正常,32位不正常






DLL文件源码

/

/键盘勾子回调函数
LRESULT CALLBACK Gameproc(
						  int code,
						  WPARAM wParam,
						  LPARAM lParam
						  )
{
	return CallNextHookEx(0,code,wParam,lParam);
}
//安装勾子的函数
__declspec(dllexport) void  SetHook(HWND hwnd)
{
	DWORD ThreadID =  GetWindowThreadProcessId(hwnd,NULL);
	SetWindowsHookEx(WH_KEYBOARD,&Gameproc,GetModuleHandle(TEXT("02HOOKDLL.dll")),ThreadID);
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
			CONTEXT dst_context ={ CONTEXT_DEBUG_REGISTERS };//设置flag
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		MessageBox(NULL, TEXT("注入成功"), TEXT("(^_^)"), MB_ICONINFORMATION);
		addvehhandle();
		setHwBreakpoint();
		break;
	case DLL_THREAD_ATTACH:
		setHwBreakpoint();
		break;
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

/////////////////////////////////////////////2
void setHwBreakpoint()
{//设置硬断
	HANDLE hthrad;
	CONTEXT dst_context ={ CONTEXT_DEBUG_REGISTERS };//设置flag
	
	hthrad = OpenThread(THREAD_ALL_ACCESS,false,GetCurrentThreadId());
	if (hthrad!=NULL)
	{
		GetThreadContext(hthrad,&dst_context);//获取线程环境(上下文)
		dst_context.Dr0=0x004AD99B;//这里是HOOK地址
		dst_context.Dr1=0x004AD99B;
		dst_context.Dr2=0x004AD99B;
		dst_context.Dr3=0x004AD99B;
		dst_context.Dr7=0x405;
		MessageBox(NULL, TEXT("断点成功了"), TEXT("(^_^)"), MB_ICONINFORMATION);
		SetThreadContext(hthrad,&dst_context);//设置上下文
	}
	CloseHandle(hthrad);
	
}
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * exceptioninfo)
{//异常处理函数
	if (exceptioninfo->ExceptionRecord->ExceptionAddress==(PVOID)0x004AD99B)
	{
		MessageBox(NULL, TEXT("成功触发异常"), TEXT("(^_^)"), MB_ICONINFORMATION);
		exceptioninfo->ContextRecord->Eip=0x006d31E4;//设置EIP跳转
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	else
	{
		exceptioninfo->ContextRecord->Dr0=0x004AD99B;//不是就重新设置断点 //防止XX
		exceptioninfo->ContextRecord->Dr7=0x405;
		return EXCEPTION_CONTINUE_SEARCH;
	}
	return EXCEPTION_CONTINUE_SEARCH;
}
void addvehhandle()
{
	PVOID  a = NULL;
    a =	AddVectoredExceptionHandler(1,(PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);//添加VEH异常处理
}


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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

当前线程能给自己下硬件断点吗,我都是另开一线程对需要下断点的线程suspendthread  getthreadcontext  setthreadcontext  resumethread的。

2017-6-10 20:43
0
雪    币: 106
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也想知道这个问题;
但是这段代码在WINDOWS  SERVER  2012R2  /  WIN7  64位系统都可以正常断下来,并走到VEH异常处理中,不明白为什么,期待大牛回复解惑
2017-6-10 21:37
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
htpidk 当前线程能给自己下硬件断点吗,我都是另开一线程对需要下断点的线程suspendthread  getthreadcontext&n ...
我试过  似乎可以,LZ试试HOOK异常处理函数  别ADD
2017-6-11 01:23
0
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5




哇咔咔zs

我试过 似乎可以,LZ试试HOOK异常处理函数 别ADD

msdn上对getthreadcontext解释:You  cannot  get  a  valid  context  for  a  running  thread.  Use  the  SuspendThread  function  to  suspend  the  thread  before  calling  GetThreadContext.

线程给自身下断点不suspend的话,线程一直在运行,怎么获取寄存器状态啊,但是如果suspend自身,运行都运行不了啊,有没有大牛来释疑下,我一直都是另开线程下断点的,囧。

2017-6-11 10:21
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
htpidk 哇咔咔zs 我试过 似乎可以,LZ试试HOOK异常处理函数 别ADD msdn上对getthreadcontext解释:You&n ...
SEH  VEH里给处理上下文。。就好了。
2017-6-11 16:50
0
雪    币: 3750
活跃值: (1807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
exceptioninfo->ContextRecord->Dr7=0x405;改成exceptioninfo->ContextRecord->Dr7=0x455;看看
2017-6-14 19:34
0
雪    币: 888
活跃值: (2370)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
你这是32位的代码啊!64位系统行,32位系统,不行没道理啊,是不是跟系统环境有关。要不你试试给所有线程都给下断点。
thread_context.Dr7  =  (1  <<  0)  |  (1  <<  2)  |  (1  <<  4)  |  (1  <<  6);  //  0x55
2018-5-7 18:32
0
游客
登录 | 注册 方可回帖
返回
//