Detours学习4 - 32位与64位目标进程拦截

Detouring 32-bit and 64-bit Processes

Detours通常的使用是拦截应该程序中的函数,而不必修改原始应用程序二进制文件。所以用户只需要提供拦截函数并打包在Dll中,然后通过DetourCreateProcessWithDll函数将其注入到应用程序中。从父进程中调用DetourCreateProcessWithDll;它通过为拦截Dll插入导入表条目来更改应用程序内存中的副本。此新的导入表条目在应用程序代码运行之前加载Dll。然后,拦截Dll就在目标进程中拦截目标函数。

在64-bit的处理器计算机中,Windows同时支持32-bit和64-bit的应用程序。若要同时支持32-bit和64-bit的应用程序,必须同时创建32-bit和64-bit版本的拦截Dll。还必须用DetourCreateProcessWithDllExDetourCreateProcessWithDlls函数来代替DetourCreateProcessWithDll函数。因为DetourCreateProcessWithDllExDetourCreateProcessWithDlls函数可以根据目标应用程序在Dll的32-bit或64-bit版本之间进行选择。

What To Do

要在一个父进程在同时支持32-bit和64-bit的应用程序,必须创建两个拦截Dll。一个拦截Dll包含32-bit的代码,另一个拦截Dll包含64-bit代码。这些Dll需要位于相同的目录中,并且具有相同的名称,32-bit的Dll名称以32结尾,64-bit的Dll名称以64结尾。例如:foo32.dll``foo64.dll

使用DetourCreateProcessWithDllExDetourCreateProcessWithDlls函数来注入你的Dll到进程中。

此外,Dll还必须满足:

How It Works

如果父进程和目标进程是同一个进程,则DetourCreateProcessWithDllExDetourCreateProcessWithDll在32位或64位的工作原理相同。

当父进程是32位目标进程是64位或父进程是64位目标进程是32位的情况下,DetourCreateProcessWithDllEx会创建一个帮助进程去加载你的Dll到rundll32.exe进程,然后通过调用DetourFinishHelperProcess导出序号1。该函数使用正确的32位或64位代码修补应用程序的导入表。

关于从Dll导出

Dll文件的布局与.exe文件非常相似,但有一个重要的区别:Dll文件包含导出表。导出表包含Dll导出到其它可执行文件的每个函数的名称。这些函数是进入Dll中的入口点;只有导出表中的函数才能被其它可执行文件访问。Dll中的任何其它函数都是Dll的私有函数。

可使用两种方法从Dll导出函数:

  • 创建模块定义.def文件,然后在生成时使用.def文件。如果希望按序号而不是按名称(或者以NONAME选项)从Dll中导出函数,则使用此方法。VS中配置的路径为/配置属性/链接器/输入/模块定义文件,比较需要导出DetourFinishHelperProcess到序号1

    LIBRARY
    EXPORTS
    DetourFinishHelperProcess @1 NONAME
  • 在函数定义中使用关键字__declspec(dllexport)

更多关于Dll的导入与导出主题请查看官方文档导入和导出

posted @   非法关键字  阅读(1250)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示