首页 > 系统相关 >通过 Dll 注入实现应用层跨进程 inline 挂钩

通过 Dll 注入实现应用层跨进程 inline 挂钩

时间:2024-09-11 21:14:18浏览次数:1  
标签:函数 jmp 挂钩 Dll 指令 Detours inline 应用层 Target

一、导入 Detours 库

Detours 是微软提供的一个开发库,可以简单、高效且稳定的实现 API hook。

Detours 是一个可以在 x86、x64 和 IA64 平台上挂钩任意 win32 函数的程序开发库,它通过在需要进行挂钩的目标函数头部重写内存代码而达到接管函数控制权,进而实现自己功能的目的。除此之外,Detours 还可将任意的 Dll 或数据片段(有效载荷)注入到任意 win32 二进制文件中。

利用 Detours 库挂钩的原理其实很简单,首先我们要搞清楚 Detours 里面的三个概念:

  • Target 函数:需要进行挂钩的函数,通常情况下为 Windows API(当然其实任意地址都可以挂钩,传入相应的地址即可)。
  • Trampoline 函数:也叫蹦床函数,顾名思义,用来跳转的。由于我们需要在 Target 函数头写入 jmp 指令跳到我们的 Detours 函数,那么就会覆盖头部对应长度的指令,而这部分指令是没有执行的,那么我们要将这部分指令写入到我们创建的蹦床内存,对这段未在 Target 函数中执行的部分头部代码进行执行,最后再跟一个 jmp 指令,跳回 Target 函数中剩余的指令继续执行。
  • Detours 函数:用来代替 Target 函数,除了实现 Target 函数的功能,还要实现我们自己的功能。

所以 Detours 挂钩的原理就很简单了。首先我们需要在 Target 函数头部写入一个 5 字节的 jmp 指令跳到 Detours 函数,在 Detours 函数中,我们首先要执行 Target 函数的功能,那我们是直接从 Target 函数的头部 jmp 到 Detours 函数的,而且 Target 函数已经被改写了,如果我们在 Detours 函数中调用 Target 函数就会又跳到 Detours 函数,形成死循环。此时 Trampoline 函数就发挥作用了,在将 jmp 指令写入 Target 函数头部之前,将即将被覆盖的汇编指令拷贝到 Trampoline 函数中,最后再跟上一个 jmp 指令,跳转到 Target 剩余的部分继续执行。那么当函数流程跳到 Detours 时,我们就可以调用 Trampoline 函数执行完原函数的全部流程,然后会返回到 Detours 函数,我们就可以执行我们自己的逻辑,可以看看下面的流程图:

所以我们得提前对即将被覆盖的这部分汇编指令拷贝到我们的 Trampoline 函数中,然后在 Trampoline 函数最后跟一个 jmp 指令跳回原函数余下的代码处,

首先在需要挂钩的目标函数头部写入一个 5 字节的 jmp 指令,

直接对需要挂钩的目标函数前 5 个字节写入一个 jmp 指令,

首先,我们要想挂钩其他进程中的函数,我们可以新建一个 Dll 动态链接库工程,将需要挂钩的功能写到 Dll 中,然后我们将这个 Dll 注入到目标进程,即可实现跨进程挂钩的功能。

新建好 Dll 工程后,我们就可以导入 Detours 库了,我们可以直接去 github 上下载:
https://github.com/microsoft/Detours

下载完之后我们将其中的 Detours 文件夹导入工程,如下图所示:

注:这个 DetoursHook.cpp 和 DetoursHook.h 是自己新建的用于实现 Detours 功能的文件。

选中所有导入的 cpp 后缀文件名文件(包括自己建立的),然后 右键 -> 属性 -> C/C++ -> 预编译头 -> 不使用预编译头(至于预编译头的作用,不懂的朋友可以去了解了解)。

然后右键 uimports.cpp 文件 -> 属性 -> 常规 -> 从生成中排除 -> 是,将该文件在编译中排除。

此时我们就完成了 Detours 库的导入,直接对项目进行编译即可。

二、使用 Detours 库函数进行 hook

标签:函数,jmp,挂钩,Dll,指令,Detours,inline,应用层,Target
From: https://www.cnblogs.com/lostin9772/p/18408753

相关文章

  • 《浪人崛起》游戏启动时闪退提示“找不到KernelBase.dll”该怎么解决?浪人崛起游戏崩溃
    启动《浪人崛起》时,游戏闪退并提示“找不到KernelBase.dll”,这着实令人烦恼。别着急,这个问题是可以解决的。可能需要重新安装相关组件,或者检查系统文件完整性。具体该如何操作才能顺利解决呢?本篇将为大家带来《浪人崛起》游戏启动时闪退提示“找不到KernelBase.dll”该怎么解决......
  • 《守望先锋2》游戏启动时黑屏弹窗“找不到steam_api.dll”该怎么处理?守望先锋2游戏崩
    在启动《守望先锋2》时,出现黑屏弹窗,提示“找不到steam_api.dll”,这给玩家带来极大困扰。别慌张,这种状况是能够处理的。可能需要重新获取该文件,或者检查相关设置是否正确。具体要怎么操作呢?本篇将为大家带来《守望先锋2》游戏启动时黑屏弹窗“找不到steam_api.dll”该怎么处理的......
  • 《最终幻想7重制版》游戏启动时黑屏闪退提示“找不到msvcp120.dll”文件该怎么解决?最
    在启动《最终幻想7重制版》时,遭遇黑屏闪退并提示“找不到msvcp120.dll”文件,这无疑让玩家倍感郁闷。别着急,这种情况是有解决办法的。可能要重新安装相关组件,或者修复系统文件的缺失。具体该如何处理呢?本篇将为大家带来《最终幻想7重制版》游戏启动时黑屏闪退提示“找不到msvcp1......
  • 《守望先锋2》游戏启动时崩溃弹窗“找不到vcruntime140.dll”该怎么修复错误?守望先锋2
    当启动《守望先锋2》时,游戏崩溃且弹窗提示“找不到vcruntime140.dll”,这实在令人糟心。别担忧,这个错误是能够修复的。可能需要重新获取该文件并正确安装,或者对系统相关设置进行检查调整。具体怎么做呢?本篇将为大家带来的内容,感兴趣的小伙伴们一起来看看吧,希望能够帮助到大家。......
  • 深入解析 cnbjop7u.dll 文件丢失后的修复步骤
    cnbjop7u.dll是一款优秀的文件修复系统。cnbjop7u.dll是存放在windows系统中的一个重要dll文件,对于系统的正常运行至关重要。cnbjop7u.dll运行程序报错时,就是显示错误提示“无法启动此程序,因为计算机中丢失cnbjop7u.dll。尝试重新安装该程序以解决此问题”。cnbjop7u.dll丢......
  • HtmlWebpackPlugin插件和HtmlWebpackInlineSourcePlugin插件的使用
    一、HtmlWebpackPlugin1.作用自动创建HTML自动创建HTML:在构建过程中自动生成一个HTML5文件,该文件可以包含所有webpack打包过程中生成的bundles。这意味着你不需要手动创建HTML文件,插件会为你处理这一切。自动注入资源:自动将打包生成的JavaScript、CSS等文件注入到生成的HTML文......
  • 总结电脑报错找不到msvcr110.dll原因,5种方式完美解决
    msvcr110.dll作为MicrosoftVisualC++运行时库的一部分,包含了执行许多基于Windows操作系统的应用程序所必需的函数和例行程序。当用户尝试运行依赖于此库的应用程序时,如果系统中缺少msvcr110.dll文件或者该文件损坏,可能会遇到错误提示,如“找不到msvcr110.dll”或“msvcr110.dl......
  • python怎么封装dll
    Cython是结合了Python和C的语法的一种语言,可以简单的认为就是给Python加上了静态类型后的语法。安装Cython如果已经安装过Cython可以跳过此步。安装Cython需要使用easy_install,Python2.7.9以上的版本已经自带easy_install。在VisualStudio的命令提示符下完成(注意配合Py......
  • Win11系统提示找不到rdvgogl32.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个rdvgogl32.dll文件(挑选合适的版本文件)把它......
  • Win11系统提示找不到rdvgu1164.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个rdvgu1164.dll文件(挑选合适的版本文件)把它......