`
hududumo
  • 浏览: 236784 次
文章分类
社区版块
存档分类
最新评论

修改函数代码HOOK的封装

 
阅读更多

对外的接口:

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的封装方法,有助于深入了解C++的HOOK原理,需要的朋友可以参考下

    EasyHook 函数钩子 最好的完整稳定的钩子Demo程序(VS2010 C++ 版本)

    Hook.dll动态库封装了一套稳定的下钩子的机制,以后对函数下钩子,只需要填下数组表格就能实现了,极大的方便了今后的使用。 Inject.exe是用MFC写的界面程序,只需要在界面上输入进程ID就能正确的HOOK上相应的进程,...

    WINAPI调用约定函数的inlineHOOK模板类(class)

    使用class封装的inlineHOOK模板类(class),可劫持大部分WINAPI函数,此种函数的特征为前5字节为 8B FF 55 8B EC;和使用此模板类的几个示例。 如果劫持关键DLL中的函数,请注意DEP的状态:AlwaysOff或者自己实现过...

    完美支持64&32位InlineHook,C语言,C++类 都有

    Windows 64位和32位Inline Hook的例子。包括C语言代码,和封装好的C++类,绝对超值,超简单实用的例子,可以直接运行,用了绝对说好!

    libco文档以及代码.zip

    libco 是腾讯开源的一个有趣的协程基础库,仅有的几个函数接口 co_create/co_resume/co_yield 再配合 co_poll, 可以支持同步或者异步的写法,如线程库一样轻松,库里面提供了socket族函数的hook, 包含如下内容: ...

    易语言-易语言增强APIHook类1.4模块

    易语言增强APIHook类1.4模块源码例程程序调用API函数实现APIHook的功能增强。...将调用原函数功能完全封装到类中,无需外部子程序配合。 添加 检测是否已被Hook 方法 使用新版核心库编译 三叶易学编程网

    VB函数添加大师 V2.2

    当然,此时的DLL还是ActiveX DLL,只是拥有对过程及函数的封装能力而已,并且已经没有了封装"类"的能力.因此,它也无法做一些只有标准DLL才能做的事(如全局HOOK等). 此DLL介于ActiveX DLL与标准DLL之间,算是一个微软的...

    协程基础库Libco.zip

    仅有的几个函数接口 co_create/co_resume/co_yield 再配合 co_poll, 可以支持同步或者异步的写法,如线程库一样轻松,库里面提供了socket族函数的hook,包含如下内容:pthread风格的coroutine接口封装事件循环以及...

    精通WindowsAPI 函数 接口 编程实例

    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 ...

    x64进程远程hook,x64_远程调用函数,源码更新V2.3:2021/5/5-易语言

    在此要强调一个事情,我们封装这个hook源码并开源,初衷并不是让朋友去搞模拟器封包,只是为了更好弥补易语言对x64进程hook操作方面的资源 还有很多朋友经常来找我,加些其他封包API进来啊,某某按钮操作不方便啊,...

    精通Windows.API-函数、接口、编程实例.pdf

    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 ...

    32位_C++_MFC_远程超级HOOK_vs2022_进程名获取进程句柄_字符串转字节集

    远程HOOK目标程序,回调到自己窗口显示数据,可及时获得数据,非注入模式. 函数实现:进程名获取进程句柄,地址反写,字符串转字节集,类的封装.

    C++封装远程注入类CreateRemoteThreadEx实例

    本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考。具体方法如下: 首先,类初始化时传入要注入的DLL文件名 只使用两个函数 代码如下:// 注入DLL到指定的地址空间 BOOL ...

    浅谈64位进程远程hook技术及64模块导出表的一些变化,附源码-易语言

    首先我们来看看要实现一个远程HOOK的构成顺序:1:在目标进程申请内存空间,存放我们截断后的穿插代码与HOOK原代码2:修改HOOK目标位置的指令为跳转至1申请的内存空间中3:穿插代码中把我们需要的寄存器或其他通过...

Global site tag (gtag.js) - Google Analytics