API Hook完全手册

HOOK API (一)——HOOK基础+一个鼠标钩子实例 HOOK API (一)——HOOK基础+一个鼠标钩子实例 原文出处:http://www.cnblogs.com/fanling999/p/4592740.html code:https://github.com/hfl15/windows_kernel_development/tree/master/demo_source_code/MouseHook 0x00 起因 最近在做毕... 阅读详情

注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助。

1 基本原理

API Hook是什么我就不多说了,直接进入正题。API Hook技术主要有下面的技术难点:

1.     如何将自己的的代码Inject到其他进程

2.     如何HookAPI

1.1 代码的Injection

常用的方法有:

1.     使用注册表HKLM/Software/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs

 

这种方法可以指定多个DLL,用空格隔开。这些DLL会被任何用到User32.dll的所有程序自动加载。当User32.dll加载的时候,User32.dllDllMain会收到一个DLL_PROCESS_ATTACH通知,User32在这个时候读取注册表项中的值,调用LoadLibrary加载各个DLL

显然使用这种方法要求设置注册表之后立刻重起系统,不过一般情况下这不是大问题。这种方法的主要问题在于,只有用到User32.dll的应用程序才会被Inject。所有的GUI和少部分CUI程序会用到User32.dll,所以如果你的API Hook程序不打算监视CUI程序的话,那么可能问题并不太大。但是如果你的API Hook程序需要监视系统中所有进程的话,这种方法的限制将是非常致命的。

 

2.     调用SetWindowsHookEx(WH_GETMESSAGE, …, 0)

 

可以使用SetWindowsHookEx(WH_GETMESSAGE, …, 0) 设置全局的消息钩子,虽然可能你的程序并不用到消息钩子,但是钩子的一个副作用是会将对应的DLL加载到所有的GUI线程之中。类似的,只有用到GUI的进程才会被挂接。虽然有这种限制,这种方法仍然是最常用的挂接进程的方法。

 

3.     使用CreateRemoteThread函数在目标进程中创建远程线程

 

这种方法可以在任意的目标进程中创建一个远程线程,远程线程中可以执行任意代码,这样便可以做到把我们的代码Inject到目标进程中。这种方法具有最大的灵活性,但是难度也最高:

a) 远程线程代码必须可以自重定位

b) 要能够监视进程的启动和结束,这样才可以挂接到所有进程

这两个问题都是可以解决的,在本文中我将重点讲述如何创建远程线程和解决这两个问题。

 

4.     如果你只是要挂接某个特定进程的并且情况允许你自己来创建此进程,你可以调用CreateProcess(…, CREATE_SUSPENDED)创建子进程并暂停运行,然后修改入口代码使之调用LoadLibrary加载自己的DLL。该方法在不同CPU之间显然是无法移植的。

1.2 Hook API

常用的方法有:

1.     找到API函数在内存中的地址,改写函数头几个字节为JMP指令跳转到自己的代码,执行完毕再执行API开头几个字节的内容再跳回原地址。这种方法对CPU有较大的依赖性,而且在多线程环境下可能出问题,当改写函数代码的时候有可能此函数正在被执行,这样做可能导致程序出错。

2.     修改PE文件的IAT (Import Address Table),使之指向自己的代码,这样EXE/DLL在调用系统API的时候便会调用你自己的函数

 

2 PE文件结构和输入函数

Windows9xWindows NTWindows 2000/XP/2003等操作系统中所使用的可执行文件格式是纯32PEPortable Executable)文件格式,大致如下:

文件中数据被分为不同的节(Section)。代码(.code)、初始化的数据(.idata),未初化的数据(.bss)等被按照属性被分类放到不同的节中,每个节的属性和位置等信息用一个IMAGE_SECTION_HEADER结构来描述。所有的这些IMAGE_SECTION_HEADER结构组成一个节表(Section Table),这个表被放在所有节数据的前面。由于数据按照属性被放在不同的节中,那么不同用途但是属性相同的数据可能被放在同一个节中,因此PE文件中还使用IMAGE_DATA_DIRECTORY数据目录结构来指明这些数据的位置。数据目录和其他描述文件属性的数据和在一起称为PE文件头。PE文件头被放在节和节表的前面。PE文件中的数据位置使用RVARelative Virtual Address)来表示。RVA指的是相对虚拟地址,也就是一个偏移量。当PE文件被装入内存中的时候,WindowsPE文件装入到某个特定的位置,称为映像基址(Image Base)。而某个RVA值表示某个数据在内存中相对于映像基址的偏移量。

输入表(Import Table)是来放置输入函数(Imported functions)的一个表。输入函数就是被程序调用的位于外部DLL的函数,这些函数称为输入函数。它们的代码位于DLL之中,程序通过引用其DLL来访问这些函数。输入表中放置的是这些函数的名称(或者序号)以及函数所在的DLL路径等有关信息。程序通过这些信息找到相应的DLL,从而调用这些外部函数。这个过程是在运行过程中发生的,因此属于动态链接。由于操作系统的API也是在DLL之中实现的,因此应用程序调用API也要通过动态连接。在程序的代码中,当需要调用API的时候,就执行类似下面语句:

 

0040100E      CALL          0040101A

可以看到这是一个call语句。Call语句则调用下面的语句:

 

0040101A      JMP           DWORD PTR [00402000]

上面的代码称为桩代码(Stub code),jmp语句中的目标地址[00402000]才是API函数的地址。这段Stub code位于.lib输入库中。如果加以优化,那么调用代码是下面这样:

 

XXXXXXXX      CALL          DWORD PTR [XXXXXXXX]

其中[XXXXXXXX]指向IATImport Address Table)即输入地址表中的表项。表项中指定了API的目标地址。这是经过编译器优化过的调用方法,通常速度要比原来的CALL+JMP快一些。

3 挂接API

从上面的PE文件结构可知,当我们知道了IAT中的地址所在位置,便可以把原来的API 的地址修改为新的API的地址。这样,进程在调用API

SGLang:结构化生成语言推理框架深度解读 SGLang是由斯坦福大学和加州大学伯克利分校联合提出的高性能大语言模型推理框架,针对复杂多轮对话、结构化输出等场景优化。其核心创新包括: RadixAttention机制:通过基数树数据结构实现跨请求的KV Cache自动复用,避免重复计算共享前缀 跳跃前瞻解码:对格式化输出中的固定模板部分直接填充,仅采样变量槽位,提升3-5倍生成速度 约束解码引擎:通过正则表达式和JSON Schema保证输出严格符合预定义格式 声明式DSL:提供类Python的编程接口简化复杂推理流程开发 相比传统框架,SGLang 阅读详情

相关推荐

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 9564

9.3 挂钩API技术(HOOK API

9.3 挂钩API技术(HOOK API

qq_36314864的博客 3627

1978-2022年 中国各地级市全要素生产率数据(+参考文献+计算说明).zip

各地级市全要素生产率是指地级市生产单位(包括企业和个人)在整个经济系统中所拥有的各种投入要素的综合生产率。 TFP 测算方法主要从异质性、 内生性、 假设放松三个方面, 对传统的 OLS 方法进行扩展。参考文献:《产业集聚与地区间劳动生产率差异》-范剑勇数据来源: 《 中国城市统计年鉴》 以及各省市的统计年鉴。省份、地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法。

简述API HOOK技术及原理

我们观察内核代码的时候,很多时候一些函数调用都初始化的时候设置成回调函数的,例如上一个例子读取文件目录,那么proc有自己独有的读取目录处理函数,相对于的ext4、ceph、hpfs等等文件系统都有自己的处理函数,那么getdents的时候如何能调用到正确的处理函数呢?而在应用程序建立套接字的时候选择了v4还是v6,都是同一个系统调用(sys_socket),只是传入的参数是不一样的,那么内核根据传参的差异,灵活的选择使用不同函数来初始化套接字,不同的函数又使用各自对应的结构体来初始化后续的调用函数。

bing1564的博客 3301

Hook API (C++)

一、基本概念:钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子

jiangxinyu的专栏 5153

Hook技术之API拦截(API Hook)

Inline Hook就是修改

bobopeng 3万+

HookAPI函数

unit dllMain;{*********************************************************程序:   HookAPI函数作者:   sunsjwQQ  :   25656016Blog:   http://www.kao8.cn/blog.asp?name=sunsjw***************************************

P-Blog 1842

Hook API 2

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

千里之外 1195

没有HOOK就没有病毒?详谈HOOK API技术(转)

HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻...

cuankuangzhong6373的博客 817

hook API 详解

来源:http://cisco.chinaitlab.com/safety/366596.html详谈HOOK API的技术HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOK TextOut()或Ex

jsl8998620的专栏 1866

补——HOOK API函数

HOOKAPI的意思就是,给系统函数API挂钩,让系统调用API的时候,先执行我们自己设定的程序,之后再决定是不是执行具体的API函数的功能。 HOOK API的原理: 如下图: 至于是否执行完整API函数的完整代码则无所谓 大概思路: 1、 要hook MessageBox这个API,首先要获取到这个API的地址,这个API是User32.dll的导出函数,所以要先获得这个模块的地址 2、 获...

4SecNet团队专栏 855

API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)

一个完整的hook,如果hook程序是以dll形式生成的,是分两步:1.完成dll本身的设计和生成,2.完成dll注入程序的设计和生成 本文完成第一步。 第二步在http://blog.csdn.net/arvon2012/article/details/7767437有详细讲解。 最近在64位win7上hook文件复制,拖拽和剪切的hook(这个要通过hook IFileOperating接口实现)。所以学习了API hook。这里是对自己的学习做个简单的总结,希望和hook新手们共同探讨和进.

翻肚鱼儿的博客 2390
上一篇: COM对象创建过程总结(进程外和进程内)
下一篇: 转贴一篇Matt Pietrek的关于SEH的文章
ATField
博客等级 码龄24年 673粉丝 119原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值