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 @ 2020-12-20 14:11  非法关键字  阅读(1347)  评论(0)    收藏  举报