[封装]简单易用的Api Hook函数 - MyApiHookFun

使用方法:
0.首先使用者请保证跑我的函数时已经注入到目标程序中
1.引用外部变量
extern DWORD *g_pApiAddr;
extern BYTE *g_pOldCode;
2.建立一个hook后工作函数

以下是hook后的测试函数
LPVOID _declspec(naked) WINAPI TestFun(LPVOID UnKnow1, LPVOID UnKnow2)
{
    ::MessageBox(NULL, TEXT("这是一个hook提示"), TEXT("提示"), NULL);

//以下汇编不可动
    _asm
    {
        push g_pOldCode
        ret;
    }
}

3.调用
例子:
    MODULEAPI tagModuleAPI = {
        {TEXT("kernel32.dll"), "ExitProcess"},
    };
    MyApiHookFun(&tagModuleAPI,TestFun);

MyApiHookFun.h:

#pragma once
#include <windows.h>
//////////////////////////////////////////////////////////////////////////
//定义
typedef struct _MODULE_API
{
    TCHAR *pModuleName;
    char  *pApiName;
}MODULEAPI,*PMODULEAPI;
//////////////////////////////////////////////////////////////////////////
//函数声明
BOOL WINAPI MyApiHookFun(PMODULEAPI pModuleAPI, LPVOID pfnHookFun);

MyApiHookFun.cpp:

#include "MyApiHookFun.h"

DWORD g_dwApiAddr = NULL;
BYTE *g_pOldCode = NULL;
/************************************************************************
函数名字:BOOL WINAPI MyApiHookFun(PMODULEAPI pModuleAPI, LPVOID pfnHookFun)
功    能:API HOOK主函数
参  数 1:pModuleAPI  模块和api名字的数组
参  数 2:pfnHookFun  hook后执行的函数数组
返 回 值:TRUE - 成功/ FALSE - 失败
************************************************************************/
BOOL WINAPI MyApiHookFun(PMODULEAPI pModuleAPI, LPVOID pfnHookFun)
{
    char chE9 = (char)0xe9;
    TCHAR szTmp[MAX_PATH] = {0};
    DWORD dwPID = 0;
    BOOL bRet = FALSE;
    LPVOID pAllocAddr = NULL;
    DWORD dwOld = 0;
    HMODULE hModule = NULL;

    g_pOldCode = new BYTE[12];
    if (g_pOldCode == NULL)
    {
#ifdef _DEBUG
        ::OutputDebugString(TEXT("new g_pOldCode Error!"));
#endif
        return FALSE;
    }
    memset(g_pOldCode, 0, 12);

    //获得API地址
    hModule = ::GetModuleHandle(pModuleAPI->pModuleName);
    if (hModule == NULL)
    {
#ifdef _DEBUG
        ::OutputDebugString(TEXT("GetModuleHandle Error!"));
#endif
        return FALSE;
    }

    g_dwApiAddr = (DWORD)::GetProcAddress(hModule, pModuleAPI->pApiName);
    if (g_dwApiAddr == NULL)
    {
#ifdef _DEBUG
        ::OutputDebugString(TEXT("GetProcAddress Error!"));
#endif
        return NULL;
    }

    //改变内存属性 HOOK
    bRet = ::VirtualProtect((LPVOID)g_dwApiAddr,
                            5,
                            PAGE_EXECUTE_READWRITE,
                            &dwOld);
    if (bRet == FALSE)
    {
#ifdef _DEBUG
        wsprintf(szTmp, TEXT("VirtualProtect %08X Error!"), pApiAddr[i]);
        OutputDebugString(szTmp);
#endif
        return FALSE;
    }

    //shell code
    g_pOldCode[0] = (char)0xb8;
    *(DWORD *)(&g_pOldCode[1]) = g_dwApiAddr + 5;
    g_pOldCode[5] = *(BYTE *)g_dwApiAddr;
    *(DWORD *)(&g_pOldCode[6]) = *(DWORD *)(g_dwApiAddr + 1);
    g_pOldCode[10] = (char)0xff;
    g_pOldCode[11] = (char)0xe0;

    //写入
    *(BYTE *)g_dwApiAddr = 0xE9;
    *(DWORD *)(g_dwApiAddr + 1) = (DWORD)pfnHookFun - (g_dwApiAddr + 5);

    bRet = ::VirtualProtect((LPVOID)g_dwApiAddr,
                            5,
                            dwOld,
                            &dwOld);
    if (bRet == FALSE)
    {
#ifdef _DEBUG
        wsprintf(szTmp, TEXT("VirtualProtect2 %08X Error!"), pApiAddr[i]);
        OutputDebugString(szTmp);
#endif
        return FALSE;
    }
    return TRUE;
}

  

时间: 2024-10-08 07:52:16

[封装]简单易用的Api Hook函数 - MyApiHookFun的相关文章

iOS菜鸟之FMDB的二次封装简单易用

闲来无事写点东西,希望大家多多指正! 大家先去git下载FMDB,然后将其中source文件夹中的fmdb文件夹拖入自己的项目中.最后就可以引用下面的代码对fmdb进行一次简单的封装. 这样可以更直观的使用数据库进行增删改操作. /** *  可以存储数据类型  text  integer  blob  boolean  date *  keyTypes      存储的字段  以及对应数据类型 *  keyValues     存储的字段  以及对应的值 */ #import <Foundat

封装简单的API——微信小程序

前几天自己琢磨微信小程序的基本开发,里边用到的技术包括WebAPI,也就是方法的封装. 当然也可以用ASP.NET MVC WCF来写接口.更简单应该就是 WinForm 简单易部署. 这里用的是 2017版本的 Core 2.0 WebAPI [Route("api/select")] //定义路由 public class SelectController:Controller { /// <summary> /// 查询所有信息 /// </summary>

Windows Dll Injection、Process Injection、API Hook

catalogue 1. 引言 2. 使用注册表注入DLL 3. 使用Windows挂钩来注入DLL 4. 使用远程线程来注入DLL 5. 使用木马DLL来注入DLL 6. 把DLL作为调试器来注入 7. 使用createprocess来注入代码 8. api拦截 9. Detours - Inline Hook 1.  引言 应用程序需要跨越进程边界来访问另一个进程的地址空间的情况如下 1. 我们想要从另一个进程创建的窗口派生子类窗口 2. 我们需要一些手段来辅助调试,例如我们需要确定另一个进

Windows API Hook

原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是因为看了原文,我才学会了HOOK,鉴于原文的排版不是很好, 又没有原工程例子源码下载,因此我决定对其重新整理,文章后面附有我测试时的工程源码下载地址. 注:我测试的环境为Win7+VS2008+MFC 原文出处,好像是这篇:http://blog.csdn.net/glliuxueke/article/details/2702608      //后来才看到

进程动态拦截注入API HOOK

最近工作中遇到一个问题,需要通过程序界面进行判断程序的运行状态,刚开始认为很简单,不就是一个窗体控件获取,获取Button的状态和Text.刚好去年干过该事情,就没太在意,就把优先级排到后面了,随着项目交付时间的临近,就准备开始解决问题,一下懵逼了,这次软件作者也聪明了,居然换了花样. 从图中可以发现,此处的按钮上的文字等信息不是通过Button信息进行操作.静想猜测是通过Windows API直接将信息进行写入,那么哪个API可以进行写入呢,想想不难发现,其实就是窗口程序中在窗口中写入文字的方

API HOOK介绍 【转】

什么是“跨进程 API Hook”? 众所周知Windows应用程序的各种系统功能是通过调用API函数来实现.API Hook就是给系统的API附加上一段小程序,它能监视甚至控制应用程序对API函数的调用.所谓跨进程也就是让自己的程序来控制别人程序的API调用了. API Hook 理论 通过对Win32 PE文件的分析(如果你还不熟悉PE文件格式,可以看看Iczelion的PE教程或者LUEVELSMEYER的<<The PE File Format>>).我们知道在PE文件中的

API HOOK

API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技术,但是计算机病毒经常使用这个技术来达到隐藏自己的目的. API HOOK解释 在windows系统下编程,应该会接触到api函数的使用,常用的api函数大概有2000个左右.今天随着控件,stl等高效编程技术的出现,api的使用概率在普通的用户程序上 就变得越来越小了.当诸如控件这些现成的手段不能

API Hook完全手册

文章来源: http://blog.csdn.net/atfield 原文作者: ATField 整理日期: 2008-07-16 发表评论 字体大小: 小 中 大 注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章).最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助. 1 基本原理 API Hook是什么我就不多说了,直接进入正题.API Hook技术主要有下面的技术难点: 如何将自己的的代码In

程序破解之 API HOOK技术 z

API HOOK,就是截获API调用的技术,在程序对一个API调用之前先执行你的函数,然后根据你的需要可以执行缺省的API调用或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socket API : recv,recvfrom, send, sendto等等,当然你可以用网络抓包工具,这里只介绍通过API HOOK的方式来实现, 主要原理是在程序运行中动态修改目标函数地址的内存数据,使用jmp语句跳转到你的函数地址,执行完后再恢复内存数据, 汇编代码是: mov eax, pNe