又是一个APIHOOK

协议型外挂制作教程三 协议型外挂制作教程三By rix       上一节中我们说了外挂平台的搭建,我们做完了Hook.dll和wg.exe,但如何让wg.exe调用Hook.dll中的函数,可以自己查看CB的教程或者到网上查查。在这里我是在wg.exe的Hook按钮事件中添加了下面的语句来实现:if(gamethreadid){if(EnableHook(gamethreadid)==false) 阅读详情
  1. 借用了海风月影的HookApi 0.5的一些思路;
  2. 又是一个APIHOOK,没什么特别的!能顺利完成任务,没有什么多余的!代码里用到了libdasm,去下载一个吧!
  3. HookProc的函数类型和原来的api一样,只是参数比原API多2个
    DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...);
    //参数比原始的API多2个参数
    RetAddr //调用api的返回地址
    pfnXXX  //类型为__pfnXXXX,待hook的api的声明类型,用于调用未被hook的api
  4. 做成了一个类,构造对象的时候自动HOOK,析构的时候UnHook,注意一下实例的生存期就可以实现临时hook和全局hook。
使用例子,注意黄色部分: 
 1  typedef  int  (WINAPI  * __pfnMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
 2 
 3  int  WINAPI MyMessageBoxW( DWORD RetAddr, __pfnMessageBoxW pfnLoadLibraryA,  HWND hWnd, LPCWSTR lpText,
 4      LPCWSTR lpCaption, UINT uType)
 5  {
 6       return  pfnLoadLibraryA(hWnd,lpText,L " MyMessageBoxW " ,uType);
 7  }
 8 
 9  void  Test()
10  {
11      {
12          CApiHook h( " user32.dll " , " MessageBoxW " ,MyMessageBoxW);
13          MessageBoxW( this -> m_hWnd,L " 标题应该被修改了 " ,L " 标题 " ,MB_OK);
14      }
15      MessageBoxW( this -> m_hWnd,L " 标题应该没有被修改了 " ,L " 标题 " ,MB_OK);
16  } 
ApiHook.h
 1  #pragma once
 2  typedef  int  (WINAPI  * __pfnMessageBoxW)( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
 3  class  CApiHook
 4  {
 5  protected :
 6       bool  m_bHooked;
 7      PBYTE m_Stub;
 8       int  m_ReplaceCodeSize;
 9      LPVOID m_pfnAPI;
10  public :
11      CApiHook(LPCTSTR lpLibName,LPCTSTR lpProcName,LPVOID lpHookProc);
12       ~ CApiHook( void );
13       bool  Hooked();
14  };
15 
ApiHook.cpp
  1  #include  " ApiHook.h "
  2  #include  " libdasm.h "
  3  #pragma comment( lib,  " libdasmd.lib "  )
  4 
  5  // 00   FF3424        push    dword ptr [esp]
  6  // 03   FF3424        push    dword ptr [esp]
  7  // 06   50            push    eax
  8  // 07   E8 00000000   call    0C
  9  // 0C   58            pop     eax
 10  // 0D   83C0 0E       add     eax, 0E
 11  // 10   894424 0C     mov     dword ptr [esp+C], eax
 12  // 14   58            pop     eax
 13  // 15   E9 00000000   jmp     1A <== modify
 14 
 15  const  BYTE Stub_Temp[] =
 16  {
 17       // 0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f
 18       0xFF , 0x34 , 0x24 , 0xFF , 0x34 , 0x24 , 0x50 , 0xE8 , 0x00 , 0x00 , 0x00 , 0x00 , 0x58 , 0x83 , 0xC0 , 0x0E ,
 19       0x89 , 0x44 , 0x24 , 0x0C , 0x58 , 0xE9 , 0x00 , 0x00 , 0x00 , 0x00 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 ,
 20       //                             ~~~~~~~~~~~~~~~~~~~
 21       0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90 , 0x90  
 22  };
 23 
 24  #define  JMP_MY_OFFSET (0x15)
 25  #define  ORG_HEAD_OFFSET (0x1a)
 26  #define  STUB_LENGTH (0x30)
 27  CApiHook::CApiHook(LPCTSTR lpLibName,LPCTSTR lpProcName,LPVOID lpHookProc)
 28      :m_bHooked( false )
 29      ,m_Stub(NULL)
 30      ,m_ReplaceCodeSize( 0 )
 31  {
 32      HMODULE hMod = GetModuleHandle(lpLibName);
 33       if (hMod == NULL)
 34      {
 35          hMod = LoadLibrary(lpLibName);
 36      }
 37       if (hMod == NULL)
 38      {
 39           return ; // 取模块句柄失败
 40      }
 41      LPVOID pfnAPI;
 42      pfnAPI = GetProcAddress(hMod,lpProcName);
 43       if (pfnAPI == NULL)
 44      {
 45           return ; // 取API地址失败
 46      }
 47      INSTRUCTION inst;
 48       int  iReplaceCodeSize = 0 ,il;
 49      DWORD RetSize = 0 ;
 50       while (iReplaceCodeSize < 5 )
 51      {
 52          iReplaceCodeSize += (il = get_instruction( & inst,(BYTE * )pfnAPI + iReplaceCodeSize,MODE_32));
 53           if (il == 0 )
 54          {
 55               return ; // 解析指令失败
 56          }
 57      }
 58       if (iReplaceCodeSize > 16 )
 59      {
 60           return ; // 超出预计的大小
 61      }
 62      m_Stub = (PBYTE)VirtualAlloc(NULL,STUB_LENGTH,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
 63       if (m_Stub == NULL)
 64      {
 65           return ;
 66      }
 67      __try
 68      {
 69          memcpy(m_Stub,Stub_Temp, sizeof (Stub_Temp));
 70           if (ReadProcessMemory(GetCurrentProcess(),pfnAPI, & m_Stub[ORG_HEAD_OFFSET],iReplaceCodeSize, & RetSize) == 0 )
 71          {
 72               return ; // 保存原始API头失败
 73          }
 74          DWORD dwDelta;
 75           // set my jump
 76          dwDelta = (DWORD)lpHookProc - (DWORD) & m_Stub[JMP_MY_OFFSET + 5 ];
 77           * (DWORD * ) & m_Stub[JMP_MY_OFFSET + 1 ] = dwDelta;
 78           // set org jmp
 79          m_Stub[ORG_HEAD_OFFSET + iReplaceCodeSize] = 0xe9 ;
 80          dwDelta = ((DWORD)pfnAPI + iReplaceCodeSize) - (DWORD) & m_Stub[ORG_HEAD_OFFSET + iReplaceCodeSize + 5 ];
 81           * (DWORD * ) & m_Stub[ORG_HEAD_OFFSET + iReplaceCodeSize + 1 ] = dwDelta;
 82 
 83           // modify API entry
 84          BYTE buf[ 8 ];
 85          dwDelta = (DWORD) & m_Stub[ 0 ] - ((DWORD)pfnAPI + 5 );
 86           * (DWORD * ) & buf[ 1 ] = dwDelta;
 87          buf[ 0 ] = 0xe9 ;
 88           if (WriteProcessMemory(GetCurrentProcess(),pfnAPI,buf, 5 , & RetSize) == 0 )
 89          {
 90               return ;
 91          }
 92          m_bHooked = true ;
 93          m_pfnAPI = pfnAPI;
 94          m_ReplaceCodeSize = iReplaceCodeSize;
 95      }
 96      __finally
 97      {
 98           if ( ! Hooked())
 99          {
100              VirtualFree(m_Stub,STUB_LENGTH,MEM_RELEASE);
101              m_Stub = NULL;
102          }
103      }
104  }
105 
106  CApiHook:: ~ CApiHook( void )
107  {
108      DWORD RetSize = 0 ;
109       if (Hooked())
110      {
111          WriteProcessMemory(GetCurrentProcess(),m_pfnAPI, & m_Stub[ORG_HEAD_OFFSET],m_ReplaceCodeSize, & RetSize);
112          VirtualFree(m_Stub,STUB_LENGTH,MEM_RELEASE);
113      }
114  }
115 
116  bool  CApiHook::Hooked()
117  {
118       return  m_bHooked;
119  }
windows-API劫持(API-HOOK) API Hook ApiHook又叫做API劫持,也就是如果A程序调用了B.cll里面的C函数,我们可以做到当A调用C函数执行的时候,直接执行我们自己事先准备好的函数,之后我们在执行真正的C,当然我们可以不执行C或者更改C的参数等等,实现的核心思路就是: ... 阅读详情

相关推荐

strongOD 海风月影

海风月影比较好的隐藏od插件我我我我我我我我我我我我我我我

《Windows核心编程》---CAPIHook类

<br />封装CAPIHook类:(某本书的笔记)<br /> <br />1)HOOK所有模块<br />HOOK一个进程对某个API的调用时,不仅要修改主模块的导入表,还必须遍历此进程的所有模块,替换掉每个对目标API的调用:<br />void CAPIHook::ReplaceIATEntryInOneMod(LPSTR pszExportMod, PROC pfnCurrent, <br />                            PROC pfnNew, HMODULE hMo

ASCE1885 6398

StrongOD v0.3.1 by 海风月影[CUG]

OllyDBG v1.10 plugin - StrongOD v0.3.1 by 海风月影[CUG] ==================================================================== [2010.03.05 v0.3.1.610] 1,修复了一个anti-anti的BUG,以及其他的一些小BUG 2,Splash可以自定义,在ollydbg.ini中加入 [Plugin StrongOD] logo = c:\ollydbg\Splash1.bmp 默认是加载ollydbg.exe目录下的Splash.bmp 3,cmdbar可以用tab键快速选命令 比如,a开头的命令有 asm at ac attach等 输入a,然后按tab,就可以切换a开头的所有命令:at a asm ac attach 输入at,然后按tab,就可以切换at开头的所有命令:at attach 4,alt+Q快捷键是在目标进程内申请内存,在配置里面可以设置默认大小 [Plugin StrongOD] AllocSize = 10 读取的值是16进制的,申请内存的大小是 AllocSize * 0x1000,默认情况下AllocSize = 1 5,增加新命令:ALLOC [AllocSize],在目标进程内申请内存,内存大小是 AllocSize * 0x1000 如果没有指定 AllocSize,则读取配置文件中的值 如果配置文件中没指定,默认为1

关于滴水的VT调试器

关于滴水的VT调试器 by 海风月影 论坛上今天吵的比较火热,主要是关于滴水的VT调试器,很多人不了解这个东西,我对Intel的VT技术略有了解,所以我来简单的介绍一下。 第一,什么是VT技术 VT是Intel的硬件虚拟化技术,说到VT,就不得不提虚拟机(例如VMWare)。在硬件还没有支持VT前,系统级的虚拟机其实是很难做的,要考虑的 东西非常多(主要是效率问题,因为用软件模拟

whatday的专栏 8052

x64 APIHOOK

64位系统的apihook类,方便使用apihook,64位asm很麻烦的..

[OllyDbg Plugin] StrongOD.v0.4.3.By.海风月影[CUG][2011.04.21]

[2011.04.21 v0.4.3.770] 1,增强反反调试 [2011.02.09 v0.4.1.716] 1,增强反反调试(bypass anti-debug) [2011.01.10 v0.4.0.712] 1,修复处理PE的一个BUG [2010.10.10 v0.3.7.666] 1,增强反反调试 2,修复部分BUG 3,执行脚本时,OD可以最小化 [2010.08.17 v0.3.6.650] 1,修复一个驱动可能的蓝屏BUG 2,防止OD被postmessage关闭 3,修复分析PE的一个BUG 4,驱动转移到数据段 [2010.06.24 v0.3.5.639] 1,Add AutoUpdate [2010.06.13 v0.3.4.633] 1,优化解决OD调试卡死的BUG 2,驱动释放到插件目录 3,增加PatchOD功能,od所有窗口类名随机化,避免被检测 4,cmdbar的窗口名采用Draw的方式画出来,避免被检测 5,修复导入表处理的一处BUG 6,解决cmdbar与Ollyskin不兼容的问题

利用HOOK API做进程保护器

其实就很简单,只是对TerminateProcess的HOOK,因为要阻止的不是本进程的,所以要用到全局钩子,也就是把他做成dll形式的! 首先,对前面的HOOK API进行封装CAPIHook:   [cpp] view plain copy /////////////////////////////////////////////////////////   // APIHook...

bruce135lee的专栏 2026

CAPIHook类代码

有错误有错误有错误有错误有错误有错误有错误有错误

用Apihook实现的打印监控

用Apihook实现的打印监控 去发现同类优质开源项目:https://gitcode.com/ 此资源文件详细介绍了如何通过Apihook技术实现对打印过程的监控。主要功能是拦截并监控startDoc函数,通过打印控制块(Print Control Block, PCB)实现。 文件描述 该资源文件中包含了以下内容: Apihook技术的基本概念和应用 如何拦截startDoc函数 实现打印监...

gitblog_06701的博客 411

一个比较稳定的API劫持代码APIHookX86X64.rar

一个比较稳定的API劫持代码APIHookX86X64

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

APIHOOK实例剖析

APIHOOK实例剖析 关于APIHOOK的基础知识有很多,如dll的相关知识、Hook的相关知识、系统进程与线程之间的联系等。具体可以看我的另两篇文章:"我的Dll(动态链接库)学习笔记" 和 "我的Hook学习笔记"。:)下面进入这篇文章的重点,根据APIHook源码进行APIHook的剖析。 一、APIHOOK之dll部分 ////////////////////////////////

jiangxinyu的专栏 478

遥感图像处理实战:DOTA数据集旋转框转YOLO格式全流程解析(附代码)

本文详细解析了将DOTA遥感数据集的旋转框标注转换为YOLO格式的全流程。针对遥感图像中物体朝向任意性的特点,文章重点阐述了将旋转框转换为外接水平框的数学原理与代码实现,并提供了批量转换脚本和可视化验证方法,帮助开发者高效处理数据,为基于YOLO的遥感目标检测项目奠定基础。

weixin_29082143的博客 398

模拟WSockExpert,使用APIHOOK

不知道大家用过WSockExpert没有, 它可以用来截获指定进程网络数据的传输. 前面我还以为它是通过实时远程注入DLL来更改IAT. 不过后来发现在程序一运行时, 它就已经将DLL插入所有进程了,这个跟冰哥写的那个模拟SOCKCAP的程序很相似. 似乎是将DLL注入所有进程, 不过再想一下, 如果是这样的话,那么后来启动的程序 应该不会被注入DLL(除非用定时^_^,这样就太麻烦了),

M-先生 1649

网络可视化工具netron详细安装流程

netron安装目录1.netron 简介2.不同操作系统下的安装使用方式2.1 在线版本:只要有浏览器就可以2.2 不同操作系统安装使用3.netron支持的网络框架4.netron测试演示 1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构。如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构。 这时,就可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。 2.不同操作系统下的安装使用方式 2.1

江南研习社 12万+

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

APIHOOK之拦截OpenProcess(真正的实现了拦截TerminateProcess)

 关于API HOOK(OpenProcess),根据网上文章改写  以下是部分程序,在VC++6.0   Plat  SDK 2003 SP1下编译通过#include #include "APIHook.h"extern CAPIHook g_OpenProcess;// 自定义OpenProcess函数#pragma data_seg("YCIShared")HHOOK

sanshao27的专栏 4573

芒果YOLO11改进59:分类损失函数Loss篇FocalLoss:即插即用|最新改进FocalLoss损失函数,提高处理不平衡数据分类场景下的任务性能,提升YOLO11检测精度

即插即用|最新改进FocalLoss损失函数,提高处理不平衡数据分类场景下的任务性能,提升YOLO11检测精度

包括YOLOv5、YOLOv7、YOLOv8等模型改进 548

asm的本地Apihook(IAT)

.386 .model flat, stdcall option casemap: none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib IAT_OPCODE_LEN equ 6 ;JMPOPCODE struct

大鹌鹑咕咕咕 777

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

前程算法屋的博客 900

eDP V1.4协议介绍

eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要求;AUX通道电路设计不同(相对DP取消了AC耦合电容和100KΩ/1MΩ的上下拉电阻):典型应用场景;

qflook的博客 4302

C 优雅的 APIHOOK 支持X86+X64源码

C# 优雅的 APIHOOK 支持X86+X64源码 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了C#语言编写的一个优雅的APIHOOK实现,兼容X86和X64架构。以下是对该源码的简要介绍: 简介 该源码演示了如何使用C#进行API钩子(APIHOOK)操作,这里特别针对Windows操作系统的MessageBoxW函数进行了拦截。APIHOOK是一种技术,允许...

gitblog_06743的博客 511

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C优雅的APIHOOK支持X86+X64源码:为你的程序加上智能监控

C#优雅的APIHOOK支持X86+X64源码:为你的程序加上智能监控 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 优雅的APIHOOK支持X86与X64架构,实现函数拦截与消息增强。 项目介绍 在现代软件开发领域,进程间的交互与监控变得日益重要。C#优雅的APIHOOK支持X86+X64源码正是一个满足这一需求的开源项目。它以C#语言为基础,提供了一种简...

gitblog_06784的博客 724

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: jmp address windows hook
下一篇: 中转inline hook,不需要恢复首字节的hook
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值