关于VEH Hook
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
VEH+硬件断点无痕HOOK[项目代码]
本文详细介绍了利用VEH(Vectored Exception Handling)和硬件断点实现无痕HOOK的技术原理及实现步骤。文章首先对HOOK方式进行了分类对比,重点阐述了硬件断点HOOK的原理,包括设置硬件断点、注册VEH异常处理函数以及编写异常处理函数等关键步骤。通过分析Windows API中的PCONTEXT结构体,解释了如何通过修改Dr寄存器实现硬件断点。文章还详细介绍了Windows异常处理机制,以及如何通过AddVectoredExceptionHandler注册自定义异常处理函数。代码实现部分展示了如何遍历线程、设置硬件断点并注册VEH异常处理函数,同时提供了回调函数的编写方法。此外,文章还总结了在实际操作中遇到的坑及解决方案,如OutputDebugStringA导致的堆栈溢出问题以及硬件断点设置失败的解决方法。最后,文章探讨了VEH HOOK的对抗手段,并提供了相关参考文章链接。
易语言x64-hook模块源码+实列
易语言x64_hook模块源码+实列 带实用hook 实列 方便操作
基于Python和C混合开发的微信机器人自动化工具-支持文本图片文件消息收发群管理好友操作CDN下载转账处理等全方位功能-通过VEH异常处理机制实现无痕Hook降低封号风险-专.zip
浏览器自动化测试实战项目基于Python和C混合开发的微信机器人自动化工具_支持文本图片文件消息收发群管理好友操作CDN下载转账处理等全方位功能_通过VEH异常处理机制实现无痕Hook降低封号风险_专.zip基于Python和C混合开发的微信机器人自动化工具_支持文本图片文件消息收发群管理好友操作CDN下载转账处理等全方位功能_通过VEH异常处理机制实现无痕Hook降低封号风险_专.zip
基于VEH的无痕HOOK
这里的无痕HOOK指的是不破坏程序机器码,这样就可以绕过CRC或MD5的校验。VEH利用了Windows的调试机制和异常处理,人为抛出异常,从异常的上下文中获取寄存器信息。


