首页
论坛
专栏
课程

硬件HOOK 成功设置了VEH ,也在关键跳处设置了硬件断点,但是程序运行起来并没有进入VEH函数,测试了一天也没整明白,希望好心人解答,感激不尽!

2019-4-19 23:03 1000

硬件HOOK 成功设置了VEH ,也在关键跳处设置了硬件断点,但是程序运行起来并没有进入VEH函数,测试了一天也没整明白,希望好心人解答,感激不尽!

2019-4-19 23:03
1000
在Win10下, 用E语言写了一个简单的程序,当序列号是123456的时候点验证就注册成功
 
利用OD找到了关键代码

然后用工具
生成了winmm.dll(这个是可以劫持的)源码,下面是自己在里面填充的代码,想要通过硬件HOOK来实现不修改代码的情况下破解成功。
但是上面那个VEH的处理函数 ExceptHandleFunction 进不去啊,是在是想不明白,然后自己又另外写了一个.exe和Dll,通过注入的方式,看看能不能进入那个VEH的处理函数
.dll源码(Dll123.dll)

.exe源码

经过这个测试发现还是没有进入VEH的处理函数。。。实在是想不明白为什么VEH这个处理函数进不去呢??它不是优先级最高的吗???我哪里出错了?是不能在Dll里面设置异常吗?还是怎么回事?这个问题自己整了一天了,问群里都是吹牛逼的,,,所以才来看雪发一篇帖子来求助,希望大佬们能够腾出几分钟解决一下,我感激不尽!谢谢!


[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上一主题 下一主题
最新回复 (19)
自强zq 2019-4-19 23:05
2
0
补充一下,,上面的关键跳的地址是401104,不是4010FD,那个图我截错了
自强zq 2019-4-19 23:26
3
0
刚才我又测试了一遍,发现用int * point = NULL;  *point = 100;这种异常可以进入VEH的处理函数,但是硬件断点异常为什么进不去呢????是不是VS得设置什么东西啥的
yuchengton 2019-4-20 03:45
4
0
啊看错了
编辑掉
最后于 2019-4-20 03:46 被yuchengton编辑 ,原因:
xiaohucode 2019-4-20 14:24
5
0
Dr7是一些控制位,用于控制断点的方式   
pxhb 2 2019-4-20 14:35
6
0
之前我下载论坛的一个源码试过,物理机可以,虚拟机就不成功,看看是不是你用虚拟机的原因
自强zq 2019-4-20 17:08
7
0
pxhb 之前我下载论坛的一个源码试过,物理机可以,虚拟机就不成功,看看是不是你用虚拟机的原因
不是虚拟机64位Win10,。,昨天研究了一天服了。,。,如果我设置int * a = NULL;  *a = 100;设置这类异常是可以进入VEH处理函数的,但是硬件断点异常却进不去
自强zq 2019-4-20 17:09
8
0
xiaohucode Dr7是一些控制位,用于控制断点的方式
这个我知道啊,,我只设置了一个DR0,所以DR7 = 1就可以了
xiaohucode 2019-4-20 20:23
9
0
https://www.pediy.com/kssd/pediy06/pediy6707.htm 了解下
一事无成y 2019-4-20 23:12
10
0
也是人才 和之前我看的一个暂时当前线程然后hook的一模一样 
AperOdry 2019-4-21 22:15
11
0
线程线程线程重要的是说三遍!另外设置的线程请用OpenThread打开句柄
xiaxiansheng 2019-4-22 14:38
12
0
11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
自强zq 2019-4-22 14:52
13
0
谢谢大家
自强zq 2019-4-22 21:25
14
0
一事无成y 也是人才 和之前我看的一个暂时当前线程然后hook的一模一样 [em_78]
啥意思,,,,我没有暂停当前线程啊,只是设置一个硬件断点。
自强zq 2019-4-22 21:26
15
0
 
最后于 2019-4-22 21:27 被自强zq编辑 ,原因:
自强zq 2019-4-22 21:27
16
0
xiaxiansheng 11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
-1不是进程伪句柄吗?线程伪句柄不是-2吗?还是不太理解。。
最后于 2019-4-22 21:27 被自强zq编辑 ,原因:
自强zq 2019-4-22 22:08
17
0
xiaxiansheng 11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
好吧,可以了,自己傻了,再问大佬一个问题,是不是这种硬件HOOK,都是在DLL入口函数出创建一个线程,线程参数是主线程的ID,然后在创建的线程里面暂停主线程,获取线程上下文,然后设置硬件断点, 之前出错是因为,没有暂停线程直接获取线程环境了,但是又不能在主线程里面直接暂停自己,得另外创建一个线程暂停自己,大佬,是这样吗?
自强zq 2019-4-22 22:11
18
0
xiaxiansheng 11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
好吧。。。。我弄懂了。。。。。。。傻了,我看了看MSDN的GetThreadContext函数的Remarks,得暂停了线程之后才能获取线程环境,来下硬件断点,所以得另外创建一个线程暂停主线程才可以,,,,,,之前不知道,直接在没暂停的情况下获取线程上下文了,,,,,,,。。。。。。。
AperOdry 2019-4-22 23:16
19
0
#include <windows.h>
#include <tlhelp32.h>
DWORD ThreadID;
HANDLE hThread;
PVOID ExceptionHandle=NULL;
PVOID T_OrgProc[4];
PVOID T_NewProc[4];
class Dr7_Hook
{
public:
	Dr7_Hook();
	~Dr7_Hook();
	HANDLE Dr7_Hook::Start_Thread();
	BOOL Initialize();
	DWORD HOOK(PVOID OrgProc, PVOID NewProc);
	BOOL UnHOOK(PVOID NewProc);
	//void Start(HANDLE hThread);
	void Start();
	void Stop();
private:
};
//Hook
void Dr7_Hook::Start()
{
	CONTEXT Context;
	Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;;
	GetThreadContext(GetCurrentThread(), &Context);
	Context.Dr0 = (DWORD)T_OrgProc[0];
	Context.Dr1 = (DWORD)T_OrgProc[1];
	Context.Dr2 = (DWORD)T_OrgProc[2];
	Context.Dr3 = (DWORD)T_OrgProc[3];
	Context.Dr7 = 0x405;
	SetThreadContext(GetCurrentThread(), &Context);
}
//Hook指定线程
void Start(DWORD dwThreadId)
{
	CONTEXT Context;
	HANDLE hThread;
	Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
	hThread = OpenThread(THREAD_ALL_ACCESS, NULL, dwThreadId);
	GetThreadContext(hThread, &Context);
	DbgPrintf_Mine("Hook Addr:%X", T_OrgProc[0]);
	Context.Dr0 = (DWORD)T_OrgProc[0];
	Context.Dr1 = (DWORD)T_OrgProc[1];
	Context.Dr2 = (DWORD)T_OrgProc[2];
	Context.Dr3 = (DWORD)T_OrgProc[3];
	Context.Dr7 = NULL;
	if (Context.Dr0)
	{
		Context.Dr7 = Context.Dr7 | 3;
	}
	if (Context.Dr1)
	{
		Context.Dr7 = Context.Dr7 | 12;
	}
	if (Context.Dr2)
	{
		Context.Dr7 = Context.Dr7 | 48;
	}
	if (Context.Dr3)
	{
		Context.Dr7 = Context.Dr7 | 192;
	}
	Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
	//Context.Dr7 = 0x405;
	SetThreadContext(hThread, &Context);
	CloseHandle(hThread);
}
void Dr7_Hook::Stop()
{
	CONTEXT Context;
	Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;;
	GetThreadContext(GetCurrentThread(), &Context);
	Context.Dr0 = NULL;
	Context.Dr1 = NULL;
	Context.Dr2 = NULL;
	Context.Dr3 = NULL;
	Context.Dr7 = NULL;
	SetThreadContext(GetCurrentThread(), &Context);
}
//多线程Hook
bool Initialize_Thread()
{
	HANDLE hThreadSnap = NULL;
	//HANDLE hThread;
	DWORD dwMypid;
	dwMypid = GetMyProcessId();
	THREADENTRY32 te32 = { 0 };
	hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
	
	if (hThreadSnap == INVALID_HANDLE_VALUE)
		return (FALSE);
	te32.dwSize = sizeof(THREADENTRY32);
	if (Thread32First(hThreadSnap, &te32))
	{
		do
		{
			if (te32.th32OwnerProcessID == dwMypid)
			{
				DbgPrintf_Mine("ThreadID=%d", te32.th32ThreadID);
				if (ThreadID != te32.th32ThreadID)
				{
					SuspendThread(hThread);//线程挂起
					Start(te32.th32ThreadID);
					ResumeThread(hThread);//线程恢复
				}
			}
		} while (Thread32Next(hThreadSnap, &te32));
	}
	else
	{
		return FALSE; 
		CloseHandle(hThreadSnap);
	}
	CloseHandle(hThreadSnap);
	return TRUE;
}
HANDLE Dr7_Hook::Start_Thread()
{
	hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Initialize_Thread, NULL, NULL, &ThreadID);
	return hThread;
}
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * ExceptionInfo)
{
	for (size_t i = 0; i < 4; i++)
	{
		if (ExceptionInfo->ExceptionRecord->ExceptionAddress == T_OrgProc[i])
		{
			DbgPrintf_Mine("NewProc Addr=%X", T_NewProc[i]);
			DbgPrintf_Mine("ExceptionHandler To Eip=%X", T_OrgProc[i]);
			ExceptionInfo->ContextRecord->Eip = (DWORD)T_NewProc[i];
			return EXCEPTION_CONTINUE_EXECUTION;
		}
	}
	return EXCEPTION_CONTINUE_SEARCH;
}
BOOL Dr7_Hook::Initialize()
{
	BOOL Jud;
	ExceptionHandle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);
	for (size_t i = 0; i < 4; i++)
	{
		T_OrgProc[i] = NULL;
		T_NewProc[i] = NULL;
	}
	Jud = (BOOL)ExceptionHandle;
	//CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, 0, NULL);
	return Jud;

}
DWORD Dr7_Hook::HOOK(PVOID OrgProc, PVOID NewProc)
{
	for (size_t i = 0; i < 4; i++)
	{
		if (!T_OrgProc[i])
		{
			T_OrgProc[i] = OrgProc;
			T_NewProc[i] = NewProc;
			return i;
		}
	}
	return 0;
}
BOOL Dr7_Hook::UnHOOK(PVOID NewProc)
{
	if (NewProc==NULL)
	{
		Stop();
		return (BOOL)RemoveVectoredExceptionHandler(ExceptionHandle);
	} 
	else
	{
		for (size_t i = 0; i < 4; i++)
		{
			if (T_NewProc[i] == NewProc)
			{
				T_OrgProc[i] = 0;
				T_NewProc[i] = 0;
				Start();
				return TRUE;
			}
		}
	}
	return FALSE;
}
Dr7_Hook::Dr7_Hook()
{
	if (ExceptionHandle==NULL)
	{
		if (Initialize())
		{
			DbgPrintf_Mine("Success Initialize VectoredExceptionHandler");
		}
		else
		{
			DbgPrintf_Mine("Error Initialize");
		}
	} 
}
Dr7_Hook::~Dr7_Hook()
{
	UnHOOK(NULL);
	CloseHandle(HANDLE(ThreadID));
	DbgPrintf_Mine("Success UnVectoredExceptionHandler!");
}


ps:以前改的代码,太丑mua...

你要设置硬断的地址  要设置你走的这条线程,而不是随便的一条线程

我的方法和OD的一样,每个线程都设置。

线程ID可以用 TEB迭代 枚举,代码可能写的不是很好 。


最后于 2019-4-22 23:55 被AperOdry编辑 ,原因:
一事无成y 2019-4-23 01:59
20
0
19楼已经发给你了 每个线程的寄存器不是一样的 你实在不懂可以复制粘贴 
游客
登录 | 注册 方可回帖
返回