关于文件读写的监控, 通过APIHOOK来实现

为了在程序读写加密文件时进行监控,避免敏感数据存入磁盘,可以利用API Hook技术。通过在文件操作API上下钩子函数,确保解密数据仅在内存中处理。本文作者分享了封装API Hook的代码,并提供了相关参考资料,欢迎反馈问题。
摘要由CSDN通过智能技术生成



   有的时候,我们需要对程序读写文件的时候进行监控,尤其是文件的数据是保密的,而且不能直接存储在磁盘上。举个最简单的例子来说,当我们有个文件在磁盘上,而这个文件是加密的,这时候在程序打开文件的时候,通过输入密钥进行解密了,但是这些解密了的数据,是不能写回磁盘的,只能放在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 ) )
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值