aiai101 发表于 2017-6-2 13:24:08

封装的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]
查看完整版本: 封装的IATHOOK类的使用