« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1405867 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]防火墙原理及实现 (5) |
前面提到过,我们的CHookApi类主要向外部提供2个方法,HookAllAPI方法和UnhookAllAPI方法。当调用HookAllAPI的时候,将拦截系统所有用户程序中我们感兴趣的API函数。当调用UnhookAllAPI的时候,将撤销拦截。当拦截启动之前,我们应该将所有我们感兴趣的,即需要拦截的API信息(如API名称,对应的替换函数名称、参数个数等)交给CHookApi,CHookApi类内部才能完成所有的拦截工作。以下是CHookApi类的声明
(HookApi.h)
#include "../include/CommonHeader.h"
#include <Psapi.h>
#include <tlhelp32.h>
#pragma comment(lib,"Psapi.lib")
// 通用替换函数指针声明
typedef void(*COMMONFUNC)(void);
/* CHookApi类实现了Hook的核心功能 */
class CHookApi
{
public:
// 构造函数
CHookApi(void);
// 析构函数
~CHookApi(void);
private:
// 自身路径
static char m_szDllPathName[MAX_PATH];
// 此容器包含所有要Hook的API信息(在类中使用的有效信息)
static vector<APIINFO*> m_vpApiInfo;
// 此容器包含所有要Hook的API信息(用户填写的信息)
vector<HOOKAPIINFO*>* m_vpHookApiInfo;
// 防火墙策略模块句柄
HMODULE m_hFireWall;
// 加载防火墙策略模块
BOOL LoadFireWallModule(void);
// 卸载防火墙策略模块
BOOL UnloadFireWallModule(void);
public:
// 使用远程线程注入的方法将我们的DLL注入到指定进程
static int WINAPI InjectDll(DWORD dwProcessId, LPTSTR lpDllName);
// 使用远程线程注入的方法将我们的DLL卸载
static int WINAPI EjectLib(DWORD dwProcessId, LPTSTR lpDllName);
protected:
// 通用替换函数,这是技术核心部分
static void CommonFunc(void);
private:
// 初始化函数
BOOL Init(void);
// 挂钩一个指定API的函数
BOOL HookOneApi(APIINFO* pai);
// 挂钩所有指定API的函数
BOOL HookAllApis(void);
// 取消挂钩一个指定API的函数
BOOL UnhookOneApi(APIINFO* pai);
// 取消挂钩所有指定API的函数
BOOL UnhookAllApis(void);
// 设置进程内存区域的存取权限
BOOL SetMemmoryAccess(APIINFO* pai,BOOL CanWritten);
// 修改/恢复指定API的前5个字节
BOOL SetCallMemmory(APIINFO* pai,BOOL bHook);
};
|
阅读全文(3886) | 回复(0) | 编辑 | 精华 |
|