Detours学习2 - 函数拦截原理
Interception of Binary Functions
Detours
可以拦截目标函数。拦截代码在运行时动态调用。Detours
通过替换目标函数的前几条指令直接跳转到用户提供的函数。来自目标函数的指令保留在Trampoline
函数中。从目标函数中删除的指令和到目标函数其余部分的直接跳转部分组成Trampoline
函数
当执行到目标函数时,控制权将直接跳转到用户提供的Detour
函数。Detour
函数可以将控制权返回给源函数,也可以调用Trampoline
函数,该功能可以在不拦截的情况下调用目标功能。目标函数执行完成后,它将控制权返回给Trampoline
函数。Detour
函数执行相应的处理,并将控制权返回给源函数。
Detours
通过重写目标函数的进程内二进制映像来拦截目标函数。对于每个目标函数,Detours
实际上重写了两个函数,即目标函数和与之匹配的Trampoline
函数,以及一个函数指针,即目标指针。Trampoline
函数由Detours
动态分配。在插入detour
之前,Trampoline
仅包含指向目标函数的一条跳转指令。插入后,Trampoline
会包含来自目标函数的初始指令,并跳转到目标函数的其余部分。
用户初始化目标指针并指向目标函数。当DetourAttach
到目标函数之后,目标指针被修改并指向Trampoline
函数。当目标函数DetourDetach
后,目标指针将指向原始目标函数。
要绕开目标函数,Detours
首先为动态Trampoline
函数分配内存(如果未提供静态Trampoline
函数),然后启用对目标和Trampoline
函数的写访问。从第一条指令开始,Detours
将指令从目标函数复制到Trampoline
函数,至少复制5个字节(足够用于跳转指令)。如果目标函数少于5个字节,则Detours
中止并返回错误代码。
为了复制指令,Detours
使用了一个简单的表驱动反汇编程序。Detours
在Trampoline
函数的末尾添加了一条跳转指令指向目标函数的未复制部分的头部。Detours
将跳转指令写入到detour
函数中,作为目标函数的第一条指令。最后,Detours
还原了目标函数和Trampoline
函数的原始页面权限(PAGE_EXECUTE_),并通过调用FlushInstructionCache
刷新了CPU指令缓存。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗