封装的IATHOOK类的使用

本文详细记录了一次尝试在对话框框架中使用DLL和IATHOOK类进行消息钩子实现的过程,包括加载DLL、获取函数地址、HOOK关键函数等步骤,最终遇到的堆栈崩溃问题及失败原因分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码不稳定,对WINDOW 7不稳定,对XP也不稳定,木有意义,各位看官绕过吧。。抓狂抓狂抓狂抓狂抓狂 


1. 主程序使用了对话框的框架

2. 把IATHOOK类封装成DLL,在初始化时加载DLL,使用DLL的导出函数,此函数HOOK了MESSAGE消息。。。与此同时,此DLL会在加载的时候创建全局的IATHOOK类,把常见的几个函数LoadLibraryA,LoadLibraryW,LoadLibraryExA,LoadLibraryExW,GetProcAddress这几个函数HOOK了。。。


但经测试,各种各种各种的不稳定。。。

主程序

#include "resource.h"
#include "ProcessProtector.h"
#include "HookTermProLib.h"
#pragma comment(lib, "HookTermProLib.lib")
CMyApp theApp;
BOOL WINAPI SetSysHookAA(BOOL bInstall, DWORD dwThreadId=0)
{
	typedef BOOL (WINAPI* PFNSETSYSHOOK)(BOOL, DWORD);
	
	char szDll[]="HookTermProLib.dll";
	BOOL bNeedFree = FALSE;
	HMODULE hModule = ::GetModuleHandleA(szDll);
	if (hModule == NULL) //不存在这个模块
	{
		int nErr = GetLastError();
		hModule = ::LoadLibraryA(szDll);
		nErr = GetLastError();
		bNeedFree = TRUE;
	}
	
	//获取SETSYSHOOK地址
	PFNSETSYSHOOK mSetSysHook = (PFNSETSYSHOOK)::GetProcAddress(hModule, "SetSysHook");
	if (mSetSysHook == NULL) //文件不正确
	{
		if (bNeedFree)
		{
			::FreeLibrary(hModule);
		}
		return FALSE;
		
	}
	//调用SETSYSHOOK
	MessageBox(NULL, "加载SetSysHook成功", "", MB_OK);
	BOOL bRet = mSetSysHook(bInstall, dwThreadId);
	if (bNeedFree)
	{
		::FreeLibrary(hModule);
	}
	return bRet;
	
	
	return TRUE;
}
BOOL CMyApp::InitInstance()
{
	//安装钩子
	SetSysHookAA(TRUE, 0);
	//显示对话框
	CMainDialog dlg;
	m_pMainWnd = &dlg;   //给m_pMainWnd 主窗口
	dlg.DoModal();
	return FALSE; //不进入消息循环
}


BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
	//ON_BN_CLICKED(IDC_STOP, OnStop)
	//ON_MESSAGE(WM_CUTTERSTART, OnCutterStart) //自定义消息
END_MESSAGE_MAP()
//CMainDialog
CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAIN, pParentWnd)
{

}
BOOL CMainDialog::OnInitDialog( )
{
	CDialog::OnInitDialog();
	return TRUE;
}
void CMainDialog::OnCancel( )
{
	CDialog::EndDialog(0);
}


//void CMainDialog::OnStop()
//{
//	MessageBox("OnStop");
//}
//long CMainDialog::OnCutterStart(WPARAM wParam, LPARAM lParam)   //处理自定义消息
//{
//	MessageBox("OnCutterStart");
//	return 0;
//}
 

主程序的头文件 

#include <afxwin.h>
#define  WM_CUTTERSTART WM_USER+100
//CMyApp
class CMyApp:public CWinApp
{
public:
	BOOL InitInstance();
};

//CMyDialog
class CMainDialog:public CDialog
{
public:
	CMainDialog(CWnd* pParentWnd = NULL);

protected:
	virtual BOOL OnInitDialog( );
	//afx_msg void OnStop();
	//afx_msg long OnCutterStart(WPARAM wParam, LPARAM lParam);  //处理自定义消息的声明
	virtual void OnCancel( );



	DECLARE_MESSAGE_MAP()
};

--------------------------------------------------------------------------------------------------------------------------------------

上面就是个对话框的框架

最蛋疼的是,在hook这几个函数时,每个进程的每个模块都要遍历,对已经加载的模块也要遍历,导致堆栈崩溃了。。。

就是递归调用了很多这个函数

//防止自动加载
HMODULE WINAPI CAPIHOOK::LoadLibraryA(LPCTSTR lpFileName)
{
	HMODULE hModule = LoadLibraryA(lpFileName);
	HookNewlyLoadedModule(hModule, 0); //这个函数中忆检测hModule 了
	return(hModule);
}


一天就整了这些代码,完美失败告终。。。SB了一天。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值