关于VEH Hook

codediy2 codediy2 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

PVOID g_ExceptionHandler = NULL;
LPVOID g_JumpToMessageBoxA = NULL;
LPVOID g_lpOldMessageBoxA = NULL;

typedef int (__stdcall *pfnMessageBoxA) ( HWND hWnd, char *lpText, char *lpCaption, UINT uType );
void EnableVEHHook();
unsigned int __stdcall ThreadProc( void* lpParam );
LONG __stdcall VectoredHandler ( PEXCEPTION_POINTERS ExceptionInfo );
int __stdcall HookMessageBoxA( HWND hWnd, char *lpText, char *lpCaption, UINT uType );

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread = NULL;
EnableVEHHook();

hThread = (HANDLE)_beginthreadex(
NULL, 0, ThreadProc, NULL, 0, NULL );

WaitForSingleObject( hThread, INFINITE );
system( "pause" );

RemoveVectoredExceptionHandler( g_ExceptionHandler );
return 0;
}

void EnableVEHHook()
{
g_ExceptionHandler = AddVectoredExceptionHandler( 1, VectoredHandler );

g_lpOldMessageBoxA = (LPVOID) GetProcAddress( LoadLibraryA( "user32.dll" ), "MessageBoxA" );
printf( "User32!MessageBoxA : 0x%08X\n", g_lpOldMessageBoxA );

unsigned char *pOpCode = NULL;
DWORD CodeLength = 0;
while ( CodeLength < 5 ) {

CodeLength += SizeOfCode( (void*)( (DWORD)g_lpOldMessageBoxA + CodeLength ), &pOpCode );
}

g_JumpToMessageBoxA = VirtualAlloc( NULL, 0x100, MEM_COMMIT, PAGE_EXECUTE_READWRITE );

unsigned char JumpCode[] = { 0x68, 0x00, 0x00, 0x00, 0x00, 0xC3 };

memcpy( g_JumpToMessageBoxA, g_lpOldMessageBoxA, CodeLength );
*(DWORD *)( JumpCode + 1 ) = (DWORD)g_lpOldMessageBoxA + CodeLength;
memcpy( (LPVOID)((DWORD)g_JumpToMessageBoxA + CodeLength), JumpCode, sizeof(JumpCode) );

DWORD OldProtect = 0;
VirtualProtectEx( GetCurrentProcess(), g_lpOldMessageBoxA, 4, PAGE_EXECUTE_READWRITE, &OldProtect );
*(unsigned char *) g_lpOldMessageBoxA = 0xCC; // Set Break Point

}

LONG __stdcall VectoredHandler ( PEXCEPTION_POINTERS ExceptionInfo )
{
if ( ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT ) {

PCONTEXT Context;
Context = ExceptionInfo->ContextRecord;
printf( "Exception Address : 0x%08X\n", Context->Eip );

if ( Context->Eip == (DWORD)g_lpOldMessageBoxA ) {

printf( "Catch it!\n" );
Context->Eip = (DWORD) HookMessageBoxA;
return EXCEPTION_CONTINUE_EXECUTION;
}
}
return EXCEPTION_CONTINUE_SEARCH;
}

unsigned int __stdcall ThreadProc( void* lpParam )
{
Sleep( 500 );
MessageBoxA( 0, "Hello", "Hello", 0 );
return 0;
}

int __stdcall HookMessageBoxA( HWND hWnd, char *lpText, char *lpCaption, UINT uType )
{
return ( (pfnMessageBoxA)g_JumpToMessageBoxA )( hWnd, "TheCjw", lpCaption, uType );
}


以上代码是通过VEH HOOK的方法 HOOK了MessageBoxA..

其中:
if ( Context->Eip == (DWORD)g_lpOldMessageBoxA ) {

printf( "Catch it!\n" );
Context->Eip = (DWORD) HookMessageBoxA;
return EXCEPTION_CONTINUE_EXECUTION;
}

当EIP为g_lpOldMessageBoxA的时候则将EIP设为(DWORD) HookMessageBoxA;

我想请问下 假如我已经用这段代码VEH HOOK了 那么我该用什么方法来HOOK 达到他设置好(DWORD) HookMessageBoxA;之后得到的(DWORD) HookMessageBoxA;的地址呢?
...全文

相关推荐

VEH+硬件断点实现无痕HOOK

VS2019源码 VEH+硬件断点实现无痕HOOK

鬼手56

VEH+硬件断点无痕HOOK[项目代码]

本文详细介绍了利用VEH(Vectored Exception Handling)和硬件断点实现无痕HOOK的技术原理及实现步骤。文章首先对HOOK方式进行了分类对比,重点阐述了硬件断点HOOK的原理,包括设置硬件断点、注册VEH异常处理函数以及编写异常处理函数等关键步骤。通过分析Windows API中的PCONTEXT结构体,解释了如何通过修改Dr寄存器实现硬件断点。文章还详细介绍了Windows异常处理机制,以及如何通过AddVectoredExceptionHandler注册自定义异常处理函数。代码实现部分展示了如何遍历线程、设置硬件断点并注册VEH异常处理函数,同时提供了回调函数的编写方法。此外,文章还总结了在实际操作中遇到的坑及解决方案,如OutputDebugStringA导致的堆栈溢出问题以及硬件断点设置失败的解决方法。最后,文章探讨了VEH HOOK的对抗手段,并提供了相关参考文章链接。

d6e7f8

易语言x64-hook模块源码+实列

易语言x64_hook模块源码+实列 带实用hook 实列 方便操作

奇创网络工作室

基于Python和C混合开发的微信机器人自动化工具-支持文本图片文件消息收发群管理好友操作CDN下载转账处理等全方位功能-通过VEH异常处理机制实现无痕Hook降低封号风险-专.zip

浏览器自动化测试实战项目基于Python和C混合开发的微信机器人自动化工具_支持文本图片文件消息收发群管理好友操作CDN下载转账处理等全方位功能_通过VEH异常处理机制实现无痕Hook降低封号风险_专.zip基于Python和C混合开发的微信机器人自动化工具_支持文本图片文件消息收发群管理好友操作CDN下载转账处理等全方位功能_通过VEH异常处理机制实现无痕Hook降低封号风险_专.zip

zhengfei_1122

基于VEH的无痕HOOK

这里的无痕HOOK指的是不破坏程序机器码,这样就可以绕过CRC或MD5的校验。VEH利用了Windows的调试机制和异常处理,人为抛出异常,从异常的上下文中获取寄存器信息。

小龙在山东
评论 2
收藏 已收藏
分享
返回顶部
codediy2
VC/MFC 16,550 成员 421,606 内容