首页
社区
课程
招聘
[原创]VEH实现的HOOK
发表于: 2009-4-9 12:29 15635

[原创]VEH实现的HOOK

2009-4-9 12:29
15635

HOOK的方式有很多种,各有优缺点。IAT表的HOOK需要监视LIABRARY,GETPROCESS这些相关函数,真想实现起来还是很麻烦的。用内存补丁的方法,JMP到自己代码中,这个的缺点是需要在自己的代码里实现原来JMP处的指令。。。
  现在我来说个新的思路,用异常来实现HOOK。我们都知道,当一个程序发生异常的时候,异常传递路径是:1.debuger  2. 向量化异常,即VEH  3.SEH。。。
   如果在没有调试器的情况下,首先接受到异常的就是VEH了。那么我们可以在要HOOK的代码上插入一个 int3 ,然后通过VEH处理这个异常,从而实现HOOK的目的。原理很简单。用代码说话吧

// Hook.h: interface for the CHook class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HOOK_H__C0F41F39_4EB7_4129_BFB7_156CB203826F__INCLUDED_)
#define AFX_HOOK_H__C0F41F39_4EB7_4129_BFB7_156CB203826F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include <list> 
using namespace std;

typedef void (*HOOKHANDLEFUN)(EXCEPTION_POINTERS *pExceptionInfo,void *pExtendData);
struct t_HookInfo
{
	DWORD dwAddr;
	HOOKHANDLEFUN pFn;
	BYTE byOldCode;
};


class CHook  
{
private:
	static CHook *m_Instance;  //单件模式
protected:
	CHook();                   //保证只生成一个实例
public:
	static CHook* GetInstance();
	t_HookInfo *m_pCurrentBP;
	BOOL m_bSingleFlag;
	EXCEPTION_POINTERS *m_pException;
	
	void SetTF();
	static LONG WINAPI VectoredHandler(PEXCEPTION_POINTERS ExceptionInfo);
	list<t_HookInfo*> m_listHook;
	BOOL AddHook(DWORD dwHookAddr, HOOKHANDLEFUN pFn);
	BOOL RemoveHook(DWORD dwHookAddr);
	BOOL SetBP(t_HookInfo*);
	BOOL UnSetBP(t_HookInfo*);
	
	virtual ~CHook();

};

#endif // !defined(AFX_HOOK_H__C0F41F39_4EB7_4129_BFB7_156CB203826F__INCLUDED_)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 8
支持
分享
最新回复 (5)
雪    币: 210
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
首贴留名,光哥很强大啊。。。
膜拜一下
2009-4-10 05:16
0
雪    币: 37
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
继续膜拜
中!
2009-4-12 00:25
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
膜拜光哥
2009-4-23 14:04
0
雪    币: 311
活跃值: (291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看雪发钱啦
2009-4-26 11:09
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
2009-4-28 01:08
0
游客
登录 | 注册 方可回帖
返回
//