有的时候,我们需要对程序读写文件的时候进行监控,尤其是文件的数据是保密的,而且不能直接存储在磁盘上。举个最简单的例子来说,当我们有个文件在磁盘上,而这个文件是加密的,这时候在程序打开文件的时候,通过输入密钥进行解密了,但是这些解密了的数据,是不能写回磁盘的,只能放在RAM中,这时候如果程序想通过正常的文件操作来访问数据的话,那么这就需要我们来对这个文件操作的API下钩子函数了。
对于钩子函数的介绍,可以通过下面的几篇文章来了解,前提是必须了解PE格式中的输入表区块内容。
1. http://zhidao.baidu.com/question/56417343.html
2. http://baike.baidu.com/view/1037259?wtp=tt-
3. http://zhidao.baidu.com/question/5555707.html
等等,百度上一大相关文章。
在网上看了不少这方面的资料,发现很多东西写的都好散,没有封装起来,因此我就花了点功夫,把它封装了起来,还没完全测试,先把代码共享一下,如果各位有什么bug的话,请留言,我会尽快改进的。
--------------------------------------------
------------- HooAPI.h -----------------
--------------------------------------------
#pragma once
#include<vector>
#include "Toolhelp.h"
struct HookAPIEntry{
// 这个是模块的名字,比如usr32.dll
CString strMoudleName ;
// 这个是需要下钩子的API函数
CString strFunctionName ;
// API函数的原始地址
PROC pOriginalProc ;
// API函数的新地址
PROC pNewProc ;
HookAPIEntry(){
pOriginalProc = pNewProc = NULL ;
};
};
typedef HookAPIEntry * PHookAPIEntry ;
typedef HookAPIEntry * LPHookAPIEntry ;
typedef std::vector<PHookAPIEntry> HookAPIEntryList ;
typedef HookAPIEntryList * PHookAPIEntryList ;
typedef HookAPIEntryList * LPHookAPIEntryList ;
typedef std::vector<PHookAPIEntry>::iterator HookAPIEntryPos ;
class CHookAPI
{
public:
CHookAPI(void);
~CHookAPI(void);
public:
// 对钩子函数列表的操作
HRESULT AddHookAPIEntry(const HookAPIEntry & entry ) ;
HRESULT AddHookAPIEntry(CString strMoudleName,CString strFunctionName,PROC pNewProc) ;
HRESULT FindHookAPIEntry(CString strMoudleName,CString strFunctionName,LPHookAPIEntry * pResult);
HRESULT DeleteHookAPIEntry(CString strMoudleName,CString strFunctionName) ;
HRESULT ClearAllAPIEntry( void ) ;
HRESULT ReHookAllMoudleAPI( void ) ;
HRESULT UnHookAllMoudleAPI( void ) ;
HRESULT GetHookAPIEntryByNewAddress(PROC pNewAddress,LPHookAPIEntry * pResult) ;
protected:
HRESULT HookMoudleAPI(const HookAPIEntry & hookentry);
HRESULT UnHookMoudleAPI(const HookAPIEntry & hookentry);
HRESULT HookMoudleAPI(HMODULE hmoudle,const HookAPIEntry & hookentry);
HRESULT UnHookMoudleAPI(HMODULE hmoudle,const HookAPIEntry & hookentry);
HRESULT ReplaceMoudleAPI(HMODULE hmoudleCaller, const CString &strMoudleName,
PROC pCurAddress,PROC pNewAddress);
HRESULT GetProcessAddress(const CString &strMoudleName,const CString &strFunctionName,
PROC * pAddress ) ;
HRESULT UpdateOriginalProc( HookAPIEntry & hookentry);
protected:
// 需要下钩子的函数集合
HookAPIEntryList m_HookAPIEntryList ;
// 系统的信息
SYSTEM_INFO m_si;
};
--------------------------------------------
------------- HooAPI.cpp -----------------
--------------------------------------------
#include "StdAfx.h"
#include "HookAPI.h"
#include "Dbghelp.h"
#pragma comment(lib , "imagehlp.lib")
#pragma comment(lib , "Dbghelp.lib")
CHookAPI::CHookAPI(void)
{
GetSystemInfo(&m_si) ;
}
CHookAPI::~CHookAPI(void)
{
}
HRESULT CHookAPI::AddHookAPIEntry(const HookAPIEntry & entry ) {
// 已经存在了,就不用添加了
if( S_OK == FindHookAPIEntry(entry.strMoudleName,entry.strFunctionName,NULL ) )