对外的接口:
1. 类初始化时对函数HOOK
2. //取消挂钩
void UnHook();
3. //重新挂钩
void ReHook();
在初始化时HOOK的代码:
*(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook;
8个字节的代码地址0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00 只要把第二位和第三位成的数据改成函数的地址,调用原先的函数时就会调到自定义的函数执行...
.h
#ifndef _ULHOOK_H__
#define _ULHOOK_H__
#include <Windows.h>
#pragma once
class CULHook
{
public:
CULHook(LPSTR lpszModName, LPSTR lpszFuncNme, PROC pfnHook);
~CULHook(void);
//取消挂钩
void UnHook();
//重新挂钩
void ReHook();
protected:
PROC m_pfnOrig;
BYTE m_btNewBytes[8];
BYTE m_btOldBytes[8];
HMODULE m_hModule;
};
#endif
.cpp
#include "ULHook.h"
CULHook::CULHook(LPSTR lpszModName, LPSTR lpszFuncNme, PROC pfnHook)
{
BYTE btNewBytes[] = {0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00};
memcpy(m_btNewBytes, btNewBytes, 8);
*(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook;
m_hModule = ::LoadLibraryA(lpszModName);
if (NULL == m_hModule)
{
m_pfnOrig = NULL;
return;
}
m_pfnOrig = (PROC)::GetProcAddress(m_hModule, lpszFuncNme);
if (NULL != m_pfnOrig)
{
MEMORY_BASIC_INFORMATION mbi = {0};
DWORD dwOldProtect;
::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);
memcpy(m_btOldBytes, m_pfnOrig, 8);
::WriteProcessMemory(GetCurrentProcess(), (VOID*)m_pfnOrig, m_btNewBytes, 8, NULL);
::VirtualProtect(m_pfnOrig, 8, dwOldProtect, NULL);
}
}
CULHook::~CULHook(void)
{
UnHook();
if (m_hModule!=NULL)
{
::FreeLibrary(m_hModule);
}
}
void CULHook::UnHook()
{
if (m_pfnOrig != NULL)
{
MEMORY_BASIC_INFORMATION mbi = {0};
DWORD dwOldProtect;
::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);
::WriteProcessMemory(GetCurrentProcess(), (VOID*)m_pfnOrig, m_btOldBytes, 8, NULL);
::VirtualProtect(m_pfnOrig, 8, dwOldProtect, NULL);
}
}
void CULHook::ReHook()
{
if (m_pfnOrig != NULL)
{
MEMORY_BASIC_INFORMATION mbi = {0};
DWORD dwOldProtect;
::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);
::WriteProcessMemory(GetCurrentProcess(), (VOID*)m_pfnOrig, m_btNewBytes, 8, NULL);
::VirtualProtect(m_pfnOrig, 8, dwOldProtect, NULL);
}
}
分享到:
相关推荐
主要介绍了C++实现修改函数代码HOOK的封装方法,有助于深入了解C++的HOOK原理,需要的朋友可以参考下
Hook.dll动态库封装了一套稳定的下钩子的机制,以后对函数下钩子,只需要填下数组表格就能实现了,极大的方便了今后的使用。 Inject.exe是用MFC写的界面程序,只需要在界面上输入进程ID就能正确的HOOK上相应的进程,...
使用class封装的inlineHOOK模板类(class),可劫持大部分WINAPI函数,此种函数的特征为前5字节为 8B FF 55 8B EC;和使用此模板类的几个示例。 如果劫持关键DLL中的函数,请注意DEP的状态:AlwaysOff或者自己实现过...
Windows 64位和32位Inline Hook的例子。包括C语言代码,和封装好的C++类,绝对超值,超简单实用的例子,可以直接运行,用了绝对说好!
libco 是腾讯开源的一个有趣的协程基础库,仅有的几个函数接口 co_create/co_resume/co_yield 再配合 co_poll, 可以支持同步或者异步的写法,如线程库一样轻松,库里面提供了socket族函数的hook, 包含如下内容: ...
易语言增强APIHook类1.4模块源码例程程序调用API函数实现APIHook的功能增强。...将调用原函数功能完全封装到类中,无需外部子程序配合。 添加 检测是否已被Hook 方法 使用新版核心库编译 三叶易学编程网
当然,此时的DLL还是ActiveX DLL,只是拥有对过程及函数的封装能力而已,并且已经没有了封装"类"的能力.因此,它也无法做一些只有标准DLL才能做的事(如全局HOOK等). 此DLL介于ActiveX DLL与标准DLL之间,算是一个微软的...
仅有的几个函数接口 co_create/co_resume/co_yield 再配合 co_poll, 可以支持同步或者异步的写法,如线程库一样轻松,库里面提供了socket族函数的hook,包含如下内容:pthread风格的coroutine接口封装事件循环以及...
1.1.3 程序入口函数 2 1.1.4 start.c代码分析 2 1.2 编译代码 3 1.2.1 安装Visual Studio 3 1.2.2 安装Microsoft Platform SDK 4 1.2.3 集成Microsoft Platform SDK与Visual C++速成版 5 1.2.4 Vista ...
在此要强调一个事情,我们封装这个hook源码并开源,初衷并不是让朋友去搞模拟器封包,只是为了更好弥补易语言对x64进程hook操作方面的资源 还有很多朋友经常来找我,加些其他封包API进来啊,某某按钮操作不方便啊,...
1.1.3 程序入口函数 2 1.1.4 start.c代码分析 2 1.2 编译代码 3 1.2.1 安装Visual Studio 3 1.2.2 安装Microsoft Platform SDK 4 1.2.3 集成Microsoft Platform SDK与Visual C++速成版 5 1.2.4 Vista ...
远程HOOK目标程序,回调到自己窗口显示数据,可及时获得数据,非注入模式. 函数实现:进程名获取进程句柄,地址反写,字符串转字节集,类的封装.
本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考。具体方法如下: 首先,类初始化时传入要注入的DLL文件名 只使用两个函数 代码如下:// 注入DLL到指定的地址空间 BOOL ...
首先我们来看看要实现一个远程HOOK的构成顺序:1:在目标进程申请内存空间,存放我们截断后的穿插代码与HOOK原代码2:修改HOOK目标位置的指令为跳转至1申请的内存空间中3:穿插代码中把我们需要的寄存器或其他通过...