前言
:
代码HOOK技术不管在安全领域还是在木马病毒方面都运用很广泛,因为他可以改变程序执行流程,悄无声息执行我们自己的代码。
之前我也用过一些hook类,如mhook等,但很多都局限于API HOOK,有的时候无法满足实际应用。也因此,我自己的hook类就诞生了。
代码HOOK技术不管在安全领域还是在木马病毒方面都运用很广泛,因为他可以改变程序执行流程,悄无声息执行我们自己的代码。
之前我也用过一些hook类,如mhook等,但很多都局限于API HOOK,有的时候无法满足实际应用。也因此,我自己的hook类就诞生了。
先贴核心代码(完整代码下载地址见本文结尾):
//Hook.h
#pragma once
struct t_Context
{
DWORD EDI;
DWORD ESI;
DWORD EBP;
DWORD ESP;
DWORD EBX;
DWORD EDX;
DWORD ECX;
DWORD EAX;
};
class CHook
{
public:
CHook(void);
~CHook(void);
// 添加Hook
bool AddHook(__in DWORD dwHookAddr, __in void *pfnHookProc);
// 移除Hook
bool RemoveHook();
// 寄存器结构体
t_Context m_Context;
// 返回地址,没有特殊需求不要修改这里
DWORD m_dwRetAddr;
private:
// 保存Hook地址,用于RemoveHook
DWORD m_dwHookAddr;
// 保存原始字节,用于RemoveHook
BYTE m_OldCode[5];
};
//Hook.cpp
#include "StdAfx.h"
#include "Hook.h"
#include "MyOutputDebugString.h"
//BeaEngine 反汇编引擎
#define BEA_ENGINE_STATIC
#define BEA_USE_STDCALL
#include "bea/headers/BeaEngine.h"
#pragma comment(lib, "bea/win32/lib/BeaEngine.lib")
#pragma comment(linker,"/nodefaultlib:crt.lib")
//BeaEngine end
//XEDParse 汇编引擎
#include "XEDParse/XEDParse.h"
#pragma comment(lib,"XEDParse/XEDParse.lib")
CHook::CHook(void)
{
memset(&m_Context, 0, sizeof(m_Context));
memset(m_OldCode, 0x90, 5);
m_dwRetAddr = 0;
m_dwHookAddr = 0;
}
CHook::~CHook(void)
{
}
// 添加Hook
bool CHook::AddHook(__in DWORD dwHookAddr, __in void *lpHookProc)
{
//00240000 60 PUSHAD
//00240001 9C PUSHFD
//00240002 BF 00012400 MOV EDI,0x240100
//00240007 8BF4 MOV ESI,ESP
//00240009 83C6 04 ADD ESI,0x4
//0024000C B9 20000000 MOV ECX,0x20
//00240011 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; 保存寄存器结构体,备用
//00240013 B8 90909090 MOV EAX,0x90909090
//00240018 FFD0 CALL EAX ; 调用HookPro
//0024001A 9D POPFD
//0024001B 61 POPAD