PayLoads有效负载和DLL导入编辑
? ? 除了附加和分离detours函数的api外,detours包还包括附加任意数据段(称为有效负载)到Windows二进制文件和编辑DLL导入表的api。Detours中的二进制编辑api是完全可逆的;Detours在二进制文件中存储恢复信息,以便在将来的任何时候删除编辑。
?
? ? ?Windows PE二进制文件格式。
? ?上图显示了Windows Portable Executable (PE)二进制文件的基本结构。Windows二进制文件的PE格式是COFF(通用对象文件格式)的扩展。一个Windows二进制文件包括一个DOS兼容的头文件,一个PE头文件,一个包含程序代码的文本部分,一个包含初始化数据的数据部分,一个包含任何导入dll和函数的导入表,一个包含代码导出函数的导出表,以及调试符号。除了两个头文件外,文件的其他部分都是可选的,可能在给定的二进制文件中不存在。
? ??
detours修改二进制文件的格式。
? ? ? 要修改Windows二进制文件,Detours在导出表和调试符号之间创建一个新的. Detours部分,如上面图所示。注意,在Windows二进制文件中,调试符号必须总是位于最后。新section包含一个detours头记录和一个原始PE头的副本。如果修改导入表,Detours将创建新的导入表,将其附加到复制的PE头,然后修改原始PE头以指向新的导入表。最后,Detours在. Detours部分的末尾写入任何用户有效负载,并附加调试符号以完成文件。Detours可以通过从. Detours部分恢复原始PE头并删除. Detours部分来逆转对Windows二进制文件的修改。上图显示了经过detours修改的Windows二进制文件的格式。
? ? ? 创建一个新的导入表有两个目的。首先,它保留了原始的导入表,以防程序员需要逆转对Windows文件的所有修改。其次,新的导入表可以包含重命名的导入dll和函数,也可以包含全新的dll和函数。例如,Detours包中包含的setdll.exe程序将用户DLL的初始条目插入到目标应用程序二进制文件中。作为应用程序导入表中的第一个条目,用户的DLL始终是应用程序地址空间中运行的第一个DLL。
? ? ? ? ? Detours提供了用于编辑导入表(DetourBinaryEditImports)、添加payloads有效负载(DetourBinarySetPayload)、枚举有效负载(DetourBinaryEnumeratePayloads)和删除有效负载(detourbinarypurgepayload)的api。Detours还提供了枚举映射到地址空间的二进制文件(detourenumeratemodule)和在这些映射的二进制文件中定位有效负载(DetourFindPayload)的api。也可以使用DetourFindRemotePayload在远程进程中找到有效负载。每个有效负载由128位全局唯一标识符(GUID)标识。Payloads有效负载可用于将每个应用程序配置数据附加到应用程序二进制文件。
? ? ? ?Payloads有效负载可以直接复制到目标进程使用DetourCopyPayloadToProcess或DetourCopyPayloadToProcessEx API。
|