防止消息钩子入侵
来源:互联网 发布:怎样写编程 编辑:程序博客网 时间:2024/04/30 10:12
很久以前就知道可以使用LoadLibraryExW来防止全局钩子入侵,说实话一直很反感消息钩子。曾经想过在驱动层通过过hook NtUserSetWindowsHookEx来防止,但是我们并不是很好区分钩子不是不恶意的,而且windows系统本身也会使用,还有就是驱动层很多安全软件和rootkit都盯上了,稳定性是一个问题。后来我看到xuetr.exe也是在用户层hook自身的LoadLibraryExW的,我也想尽可能的保护好自己的程序,经过我亲身测试发现在win32非mfc程序hook这个函数很有效,mfc程序的debug版本也是没有问题,但是在mfc的release版本却失效了,后来注意到了内联汇编,我想可能是被编译器优化了。曾向利用__declspec(naked)禁止对内联汇编的优化,但是使用了__declspec(naked)之后我们不能使用return。经过很多挫折还是没能最终解决,如果有高手知道的话,指点一下,谢谢。今天主要利用LoadLibraryExW过滤特定的dll,以下例子是"hook.dll"。
代码如下:
AntiHook.h:
#ifndef _H_ANTIHOOK_
#define _H_ANTIHOOK_
#include "detours.h"
#pragma comment(lib,"detours")
typedef HMODULE (WINAPI* LoadLibraryExW_t)(LPCWSTR,HANDLE,DWORD);
HMODULE WINAPI NewLoadLibraryExW(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags);
class CAntiHook
{
public:
CAntiHook()
{
Hook();
}
~CAntiHook()
{
UnHook();
}
private:
void Hook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
LoadLibrary("kernel32.dll");
OldLoadLibraryExW = (LoadLibraryExW_t)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryExW");
if (OldLoadLibraryExW != NULL)
DetourAttach(&(PVOID&)OldLoadLibraryExW,NewLoadLibraryExW);
DetourTransactionCommit();
}
void UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
if (OldLoadLibraryExW != NULL)
DetourDetach(&(PVOID&)OldLoadLibraryExW,NewLoadLibraryExW);
DetourTransactionCommit();
}
public:
static LoadLibraryExW_t OldLoadLibraryExW;
};
HMODULE WINAPI NewLoadLibraryExW(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags)
{
if (wcsstr(lpLibFileName,L"hook.dll") != NULL)
return 0;
return CAntiHook::OldLoadLibraryExW(lpLibFileName,hFile,dwFlags);
}
#endif
CAntiHook.cpp:
#include "StdAfx.h"
#include "AntiHook.h"
LoadLibraryExW_t CAntiHook::OldLoadLibraryExW = NULL;
使用时只要在全局定义CAntihook实例就可以了。
- 防止消息钩子入侵
- 防范windows消息钩子的入侵
- 防止全局钩子的入侵(天极的文章)
- 消息钩子
- 消息钩子
- 消息钩子
- 防止黑客入侵网站
- 如何防止黑客入侵
- 消息钩子函数入门
- 消息钩子函数
- 消息钩子函数
- 消息钩子函数
- 消息钩子函数入门
- spy++ 消息钩子漫谈
- 消息钩子函数
- ListView的消息钩子
- 消息钩子使用总结
- 设置windows消息钩子
- spring http invoker 高级篇
- discuz常见的一些修改操作
- OpeCV的连通区域标记-bwlabel方法实现
- hdu 3689 Infinite monkey theorem dp
- BIRT报表一线揭秘1
- 防止消息钩子入侵
- F(n)完全覆盖中的计数问题
- Java中的变量
- Inventor 2014 API 新功能 (9) Autodesk材质库(上)
- 盈利能力、成长性与内在价值(续)
- Prompt for customizing request/prompt for local workbench request
- qt简单的hello world测试程序终端无输出问题
- Qt 设置快捷键
- Linux 服务器管理备忘