32位和64位进程路由
Detours最常见的使用场景是通过路由绕过现有应用程序中的功能,而不修改原始应用程序二进制文件。在这些场景中,用户提供的DetourCreateProcessWithDll函数被打包在DLL中,DLL在启动时使用DetourCreateProcessWithDll API加载到应用程序中。从父进程调用DetourCreateProcessWithDll API;它通过为detour DLL插入导入表项来更改应用程序的内存副本。这个新的导入表条目导致OS加载程序在应用程序进程启动之后(但在任何应用程序代码运行之前)加载DLL。然后,绕道DLL就有机会在目标进程中钩住目标函数。
在64位处理器的计算机中,Windows同时支持32位和64位应用程序。要同时支持32位和64位应用程序,必须同时创建detour DLL的32位和64位版本。您还必须使用DetourCreateProcessWithDll API或DetourCreateProcessWithDllEx API或DetourCreateProcessWithDlls API替换所有的DetourCreateProcessWithDll API。DetourCreateProcessWithDllEx和DetourCreateProcessWithDlls api选择适合目标应用程序的32位或64位版本的DLL。
要做的任务
要在单个系统上同时支持32位和64位应用程序,必须创建两个dll。一个DLL必须包含32位代码,另一个DLL必须包含64位代码。DLL必须驻留在相同的目录中,并且必须具有相同的名称,只是32位DLL的名称应该以“32”结尾,64位DLL的名称应该以“64”结尾。例如,匹配的dll将命名为foo32.dll和foo64.dll。
你应该使用DetourCreateProcessWithDllEx或DetourCreateProcessWithDlls API来启动一个带有DLL的进程。此外,你的dll必须:
- 将DetourFinishHelperProcess API导出为序号1。
- 在DllMain函数中调用DetourIsHelperProcess API。如果DetourIsHelperProcess返回TRUE,立即返回TRUE。
- 调用DetourCreateProcessWithDllEx或DetourCreateProcessWithDlls API而不是DetourCreateProcessWithDll来创建新的目标进程。
它是如何工作的
在父进程和目标进程都是相同的情况下,例如32位或64位,DetourCreateProcessWithDllEx API的工作方式与DetourCreateProcessWithDll API相同。
当父进程是32位而目标进程是64位或者父进程是64位而目标进程是32位时,DetourCreateProcessWithDllEx通过将DLL加载到rundll32.exe进程中,并通过export Ordinal 1调用DetourFinishHelperProcess来创建一个helper进程。这个API使用正确的32位或64位代码修补应用程序的导入表。
尝试测试
要尝试helper进程,首先使用32位构建环境构建32位的Detours示例。然后使用64位构建环境构建64位的示例。然后在示例\tryman目录中,在64位环境中,类型为“nmake size64”,以运行一个在32位和64位进程之间交替的递归进程集。
相关文档说明
有关rundll32.exe的更多信息,请参见http://support.microsoft.com/kb/164787。
相关的api:
DetourCreateProcessWithDllEx, DetourCreateProcessWithDlls, DetourFinishHelperProcess, DetourIsHelperProcess, DetourRestoreAfterWith。
相关的例子程序
FindFunc, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。