API Hook的几种实现

API Hook完全手册 注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助。1 基本原理API Hook是什么我就不多说了,直接进入正题。API Hook技术主要有下面的技术难点:1.     如何将自己的的代码Inject到其他进程2.     如何Hoo 阅读详情

API Hook的几种实现

所谓的API Hook,就是利用某种技术将API的调用转为我们自己定义的函数的调用。这种技术在实际项目里面的应用也是很广泛的。最近,我在做关于我们项目的自动化测试的时候,就遇到了这种情况。在写测试代码之前,我们对测试代码有一些要求。1. 不能因为测试代码而修改原代码。2. 原有的模块是以dll格式输出的,在做测试的时候,要测的类和函数也只能使用dll的导出类或者函数,而不能将源文件重新编译。由于这些限制,导致测试用例往往不能在普通的机器上运行。比如这样一个函数:

int func()
{
// Some initializing codes
int hardware_code = get_hardware_code();
if (is_valid_code(hardware_code))
{
//
}
//
return ret;
}
复制代码

此处,函数get_hardware_code()是与特定平台相关的,在普通PC上运行肯定无法获得正确的结果。如果拿不到正确的结果,也就不能对函数func()进行测试了。于是,我们就可以利用API Hook技术,在测试代码里面,把所有对get_hardware_code()的调用换成我们自定义的函数mock_get_hardware_code()的调用,这样,在我们自己定义的函数里面,可以返回一个有效的代码以保证原代码能够正确的往下执行。

经过研究,API Hook有这么几种方法。

1. 改写函数的首地址。

这个是在《Windows核心编程》里面大师提到的API Hook的方法之一。原理就是,首先获得要被Hook的函数的地址(比如get_hardware_code()),然后将其首地址之后的若干字节(通常是5个字节)改成一条jmp指令,而jmp的目标地址就是自定义函数的地址(此处为mock_get_hardware_code())。这样,当函数每次执行目标函数的时候,就会跳转到我们自定义的函数里面去。这种方法很简洁,据说在Win16的年代经常被使用。但是大师并不推荐,好像是因为这种方法在多线程的环境下会有什么问题(具体的我忘记了,大家可以翻书看看)。

这样的话,只要我们能得到被调函数的地址,我们就可以随心所欲的修改。当然,由于大师的不推荐,我这种方法只是实现了一下,并未真正应用。

2. 改写导入表

这个也是《Windows核心编程》里面提到的,也是大师所推荐的。具体来说,就是遍历当前进程里面的所有模块,对其中每一个模块查找它的导入表。如果找到被测函数所在的dll,并且发现这个函数,那么就把这个地址修改成自定义函数的地址。关于如何从导入表中发现被测函数,我也总结了两种方式。1)对于一般的C导出函数,可以直接通过比较地址的方式去找,这个也在核心编程上面有一个小例子。2)对于C++中的导出的类成员函数而言,由于C++的指向成员函数的指针和普通的指针有所差别(我没仔细研究过,从网上查的),在将一个成员函数指针转化成普通的函数指针的时候编译通不过,因此我采取了第二种查找方式,也就是查找函数名。这还有一个问题,由于C++的导出成员函数名都进行了修饰,类似于?MethodName@ClassName@...@Z这种怪异的名字,不过,只要知道类名和方法名,然后查找MethodName@ClassName字符串就行。如果找到了这样的函数,然后在修改它的地址就行了。

另,关于导入表,大家可以去看雪论坛上有关Windows PE文件格式的介绍。此处就不多说了。

3. 改写虚函数表。

本来以为通过方法2就能hook住所有的导出类成员函数和普通函数,但还是出现了一个问题,因为我在尝试hook一个成员函数的时候,发现这个函数根本没有在导入表里面。后通过反汇编发现,由于那个导出类成员函数是一个虚函数,因为在通过指针调用的时候,它实际上是从虚函数表里面获得的函数地址进行调用的。因此对于hook这类函数,就需要改写它的虚函数表了。关于这个需要对C++的内存布局有所了解。我在这里就说一种比较简单的方式吧。

一般来说,对于某个含有虚函数表的C++类,this指针指向的地址,取值就是虚函数表指针。虚函数表指针指向了虚函数表,里面的每一个元素都指向了实际要调用的函数的地址。因此,可以按照这样的方式访问虚函数表指针:

int** pVTable = (int**)this;

也就是将指向对象的指针强制转化成指针的指针,这样就可以通过取值就可以访问虚函数表:

(*pVTable)[0] = address of virtual function 1;

(*pVTable)[1] = address of virtual function 2;

...

因此,我们就可以改写虚函数的地址了,从而达到hook的目的。这种技术来源于网上。当然,我对C++的内存布局也不是十分的清楚,如果一个类进行了多重继承,它的虚函数表是什么样子我也不太明白,这里只是说明了这样一种技术。

以上就是目前为止我应用到的三种API Hook的技术,其实实际应用到的也就是后两种,这两种技术能够满足我目前项目的需要了。如果还有其他关于API Hook技术的话大家也可以交流。

另外需要说明的一点是,上述三种方法中不管哪一种在改写地址的时候,由于Windows一般将那个地址所在的页面设置了保护属性,因为你需要用VirtualProtect函数将页面改为可读可写的属性才能改写,否则会有异常的。


[Win32] API Hook(1)在32位系统上的实现 本博文由优快云博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: API Hook技术,虽然很老了,但是依旧是很有用的技术,同时网上的资料往往不能直接拿过来用,c语言的太少。这回呢,我要用C语言来完整的编写一个Win32SDK编程的API Hook源码,但是我还是用cpp保存编译,为哈?因为微软对c语言标准支持的很不好,我不知道vs2013支持c 阅读详情

相关推荐

HOOK其他进程API和全局HOOK-API

HOOK是一种WINDOWS下存在很久的技术了。 HOOK一般分两种1。HOOK MESSAGE  2。HOOK API 本问讨论的是HOOK API。(如果你是HOOK高手就不要看了) 在最初学HOOK-API的时候通常都是通过覆盖地址和修改IAT的方法。通过这两种技术,我们基本都可以实现对本进程的API函数进行HOOK了。但是在高兴之余会有点遗憾,怎么才能HOOK其他进程的API函数呢?怎么才

4292

C/C++ HOOK 全局 API

全局 API Hook 用于在操作系统级别劫持和修改全局API(Application Programming Interface,应用程序编程接口)的调用。通过全局API Hook,可以截获和篡改应用程序对特定API的调用,从而实现对应用程序行为的监控、修改或增强。

微软技术分享 1万+

Android利用ptrace实现Hook API

Hook API的技术由来已久,在操作系统未能提供所需功能的情况下,利用Hook API的手段来实现某种必需的功能也算是一种不得已的办法。 笔者了解Hook API技术最早是在十几年前,当时是在Windows平台下开发电子词典的光标取词功能。这项功能就是利用Hook API的技术把系统的字符串输出函数替换成了电子词典中的函数,从而能得到屏幕上任何位置的字符串。无论是16位的Windows9

u013234805的专栏 9940

如何Hook一个函数

函数是什么  在LUA中, 一个函数是一个简单的变量。从LUA的文档来看:<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  The statement  function f () ... end  trans

分享建筑软件的乐趣 2412

深入探索API Hook技术与实现

在现代软件开发中,API Hook技术是不可或缺的一部分,它使得开发者能够监控和控制应用程序调用的系统API。通过API Hook,开发者可以实现软件调试、系统监控、安全分析以及恶意软件检测等多种功能。简单来说,API Hook技术就是一种通过拦截API调用来修改或增强系统或应用程序行为的技术。它可以让我们在应用程序运行时,插入自定义的代码来影响API调用的正常流程。

weixin_36078669的博客 1357

VC++环境下API Hook技术实现指南

API Hook,也被称为API挂钩,是一种在软件开发中广泛使用的技术,用于拦截对特定应用程序接口(Application Programming Interface,简称API)的调用,并可以根据需要执行额外的代码或修改API的行为。这种技术主要用于监控、调试、性能分析以及扩展或修改应用程序的功能。钩子函数是一种特殊的函数,它能够在软件的执行流程中插入自定义的代码,从而改变原有函数的行为或监控其执行过程。

weixin_28922227的博客 1270

网上收集的C#获取硬件信息

using System;using System.Runtime.InteropServices;using System.Management;namespace Hardware{    ///     /// Hardware_Mac 的摘要说明。     ///     public class HardwareInfo    {        //取机器名         publ

stonezhuzisgu的专栏 1291

(API HOOK)进程保护工具

运行本软件之后,选择启用保护 (本软件适用于32位系统) 功能: (进程保护) 1、在任务栏里面终止进程是无效的。 (注意:窗口的正常关闭仍然是可以的, 也可以适用命令参数 taskkill 来终止 程序的进程。) 2、防止一些外挂程序对进程的注入控制 3、防止OD,CE以及其他一些调试器对进程 的读取(不是全部噢,暂时我没发现而已) (系统保护) 1、禁止使用CMD 2、禁止使用regedit 3、禁止使用.reg文件 程序运行后点击隐藏,本软件将自动隐藏起来。 隐藏后按F12即可呼出窗口。 PS:本软件采用了API拦截的技术,所以杀毒软件 可能会误报病毒,请放心使用。 软件还在改进中。。。 作者:GhostHand 本人QQ:544980123 希望加我QQ一起交流技术

HOOK API 的几种方式

**HOOK API** 是指截获特定进程或对某个API函数的调用,使得API的执行流程转向指定代码。 1、需要将可以代替API执行的函数的执行代码注入到目标进程 2、再将进程对该API函数的调用改为对注入目标进程中自定义函数的调用。第一种方式是采取DLL注入,将执行代码写入DLL中,使用钩子函数注入DLL、使用注册表注入DLL、使用远程线程注入DLL。第二种方式是修改模块的导入表,将API

lanmao0的博客 2275

aip hook实现

hook api 的简单DEMO vc实现

hook windows api小测试

hook windows api 的小测试 用win32汇编写的,是hook messagebox的小测试

内核级HOOK的几种实现与应用

转帖】内核级HOOK的几种实现与应用 创建时间:2003-03-2

康林工作室 2046

ssdt HOOK截获指定进程检测API

目前来看绝无仅有的程序,原创!监控指定进程的详细操作 内涵三个文件夹,一个驱动注入工具,一个启动设备端,一个被监控程序。 五脏俱全!!不是像目前流行的监控所有进程的对某系统资源的监控! 同时因为分数少所有才多要了些分

Hook技术之API拦截(API Hook)

Inline Hook就是修改

bobopeng 3万+

系统API拦截测试 TestHookInject.rar

系统API拦截测试2个文件, 对 FlashWindow系统API拦截测试

axi时序图_(AXI)握手协议(pvld/prdy或者valid-ready)中ready打拍技巧

内容提要ready打拍的问题用FIFO的思路去解决用Buffer的思路去解决问题提出:ready时序如何优化?在valid/ready 握手协议中,valid 与 data的时序优化比较容易理解,(不熟悉valid/ready协议或者valid打拍方法的)大家可以参考上次推送(握手协议(pvld/prdy或者valid-ready或AXI)中Valid及data打拍技巧)。 但是有时候,关键路径是...

weixin_29763641的博客 3327

【一分钟学C++】Windows API Hook实现

Windows API Hook实现

记录点滴,终成江河! 1652

用5毫欧采样电阻实现高精度电流检测?数字可调电源控制板的硬件设计陷阱

本文深入探讨了在数字可调电源控制板设计中,如何利用5毫欧采样电阻实现高精度电流检测。从微小信号放大电路设计、采样电阻布局与热管理,到电源切换与电池管理电路优化,提供了全面的硬件设计解决方案和实用技巧,帮助工程师规避常见设计陷阱,提升系统性能。

wdx0123456的博客 1032

android hook api

搞了好几个星期,终于有点头绪,欢迎交流。转载请注明出处http://blog.youkuaiyun.com/lingfong_cool/article/details/8109290。    android安全可以从三个层面考虑,一次是java虚拟机层,nativec层,还有linux kernel层,本次hook api是属于nativec层的。 hook api之后就可以使得程序对原有系统函数的调

2万+

ESP32-C3微型9轴感知模块的硬件工程实践

在嵌入式系统小型化趋势下,低功耗微控制器与多传感器融合成为智能终端的基础技术路径。其核心原理在于芯片能效比、射频合规性与电源噪声抑制的协同优化,技术价值体现在降低认证门槛、提升EMC鲁棒性及保障MEMS传感器精度。典型应用场景包括可穿戴设备、微型无人机姿态控制和工业边缘传感节点。本文围绕ESP32-C3平台展开,深入解析QFN封装选型逻辑、同步降压电源设计、LSM9DS1九轴校准策略等关键环节,覆盖FCC/CE认证规避、USB-C接口EMC防护等高频工程痛点。

weixin_42607969的博客 371

CH582低功耗实战:从1.2mA降到5uA,我的蓝牙广播功耗优化笔记

本文详细记录了沁恒CH582蓝牙芯片从1.2mA降至5μA的功耗优化全过程。通过建立基准测试环境、分层排查软件配置与IO状态、精细调优射频参数以及硬件层面的电源管理,实现了极致的低功耗表现。文章还提供了实用的功耗测量方法和典型问题排查指南,为蓝牙设备开发者提供了宝贵的参考经验。

weixin_30368405的博客 574
上一篇: 内存屏障
下一篇: Android开发者应该深入学习的10个开源应用项目
code_farmer
博客等级 码龄22年 9粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值