封装的IATHOOK类的使用
代码不稳定,对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>
#defineWM_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了一天。。。。
页:
[1]