伪任意地址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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值