看流星社区

 找回密码
 注册账号
查看: 2243|回复: 0

封装的IATHOOK类的使用

[复制链接]

该用户从未签到

发表于 2017-6-2 13:24:08 | 显示全部楼层 |阅读模式
代码不稳定,对WINDOW 7不稳定,对XP也不稳定,木有意义,各位看官绕过吧。。


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


但经测试,各种各种各种的不稳定。。。
主程序
#include "resource.h"
#include "rocessProtector.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 = :oadLibraryA(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:oadLibraryA(LPCTSTR lpFileName)
{
        HMODULE hModule = LoadLibraryA(lpFileName);
        HookNewlyLoadedModule(hModule, 0); //这个函数中忆检测hModule 了
        return(hModule);
}

一天就整了这些代码,完美失败告终。。。SB了一天。。。。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 00:06

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表