首页
社区
课程
招聘
[原创]检测VEH异常处理函数,以及hook
发表于: 2022-12-19 19:03 12119

[原创]检测VEH异常处理函数,以及hook

2022-12-19 19:03
12119

前段时间看到有人问了这个问题,自己也去看了下


很简单,IDA看下AddVectoredExceptionHandler就出来了

如果是想外部进程获取的话,

搜索下LdrpVectorHandlerList变量,再外部实现RtlDecodePointer解密就行了

下面代码是自身进程的检测

#include <stdio.h>
#include <Windows.h>
LONG WINAPI VectoredHandler1(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
	ULONG code = ExceptionInfo->ExceptionRecord->ExceptionCode;
	ULONG_PTR address = (ULONG_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress;

	return 0;//不处理,返回让下一个异常函数处理
}
LONG WINAPI VectoredHandler2(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
	ULONG code = ExceptionInfo->ExceptionRecord->ExceptionCode;
	ULONG_PTR address = (ULONG_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress;
	return 1;//这里随便返回个1,防止VectoredHandler2跟VectoredHandler1优化成了一个函数
}
LONG WINAPI VectoredHandler3(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
	ULONG code = ExceptionInfo->ExceptionRecord->ExceptionCode;
	ULONG_PTR address = (ULONG_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress;
	return 2;//这里随便返回个2,正常程序别这样返回就行了

}
int main()
{
	LIST_ENTRY* ExceptionHandler = (LIST_ENTRY*)AddVectoredExceptionHandler(1, VectoredHandler1);
	LIST_ENTRY* ExceptionHandler2 = (LIST_ENTRY*)AddVectoredExceptionHandler(1, VectoredHandler2);
	ULONG64(WINAPI * RtlEncodePointer)(PVOID a1);
	ULONG64(WINAPI * RtlDecodePointer)(PVOID a1);
	(FARPROC&)RtlEncodePointer = GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlEncodePointer");
	(FARPROC&)RtlDecodePointer = GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlDecodePointer");

	printf("VectoredHandler1=%p,%p\n", ExceptionHandler,VectoredHandler1);//
	printf("VectoredHandler2=%p,%p\n", ExceptionHandler2,VectoredHandler2);
	printf("VectoredHandler3=%p\n",  VectoredHandler3);
	printf("----HOOK前的VEH----\n");
	//遍历VEH
	LIST_ENTRY* curNode = ExceptionHandler;
	do
	{
		ULONG64 FuncAdd = RtlDecodePointer(((ULONG64**)curNode)[0x20 / 8]);
		//系统不一样,这里的偏移不意义,我所知道的,1803函数偏移在0x18
		//我当前22H2以及WIN11都是0x20
		printf("FuncAdd=%p,%p\n", curNode, FuncAdd);

		curNode = (LIST_ENTRY * )curNode->Flink;
	} while (curNode!= ExceptionHandler);

	//hook ExceptionHandler的处理函数VectoredHandler2->VectoredHandler3
	printf("----HOOK中----\n");
	curNode = ExceptionHandler;
	do
	{
		ULONG64 FuncAdd = RtlDecodePointer(((ULONG64**)curNode)[0x20 / 8]);
		//系统不一样,这里的偏移不意义,我所知道的,1803函数偏移在0x18
		//我当前22H2以及WIN11都是0x20
		//
		if (FuncAdd==(ULONG64)VectoredHandler2)
		{
			((ULONG64**)curNode)[0x20 / 8] = (ULONG64*)RtlEncodePointer(VectoredHandler3);
			printf("HookFuncAdd=%p-->%p\n", FuncAdd, VectoredHandler3);
			break;
		}

		curNode = (LIST_ENTRY*)curNode->Flink;
	} while (curNode != ExceptionHandler);
	printf("----HOOK后的VEH----\n");
	curNode = ExceptionHandler;
	do
	{
		ULONG64 FuncAdd = RtlDecodePointer(((ULONG64**)curNode)[0x20 / 8]);
		//系统不一样,这里的偏移不意义,我所知道的,1803函数偏移在0x18
		//我当前22H2以及WIN11都是0x20
		printf("FuncAdd=%p,%p\n", curNode, FuncAdd);

		curNode = (LIST_ENTRY*)curNode->Flink;
	} while (curNode != ExceptionHandler);

	getchar();
}

执行结果

VectoredHandler1=0000018A6199C800,00007FF76DA81070
VectoredHandler2=0000018A6199C770,00007FF76DA81080
VectoredHandler3=00007FF76DA81090
----HOOK前的VEH----
FuncAdd=0000018A6199C800,00007FF76DA81070
FuncAdd=00007FF9078913F0,89140800279C636F
FuncAdd=0000018A6199C770,00007FF76DA81080
----HOOK中----
HookFuncAdd=00007FF76DA81080-->00007FF76DA81090
----HOOK后的VEH----
FuncAdd=0000018A6199C800,00007FF76DA81070
FuncAdd=00007FF9078913F0,89140800279C636F
FuncAdd=0000018A6199C770,00007FF76DA81090



[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 0
活跃值: (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个可以检测到程序是否被注册了AddVectoredExceptionHandler函数? 那改怎么躲避检测呢
2023-10-20 17:17
0
雪    币: 63
活跃值: (738)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
pengrui 这个可以检测到程序是否被注册了AddVectoredExceptionHandler函数? 那改怎么躲避检测呢
88eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3q4J5L8W2)9J5k6h3#2A6j5%4u0G2M7$3!0X3N6q4)9J5k6h3y4G2L8g2)9J5c8X3g2F1i4K6u0V1N6i4y4Q4x3V1k6U0M7s2m8Q4x3V1k6T1N6h3W2D9k6q4)9J5c8Y4R3$3y4q4)9J5k6r3y4S2L8r3I4A6L8X3N6Q4x3X3c8U0L8$3&6$3k6h3&6@1K9h3!0F1i4K6y4r3N6X3W2W2N6#2)9K6c8r3#2K6N6X3y4Q4x3X3b7I4y4U0l9`.
2024-4-17 02:17
0
游客
登录 | 注册 方可回帖
返回