Detours学习之十一:用于访问已加载的二进制文件和有效负载的api

66 篇文章 0 订阅
62 篇文章 37 订阅

用于访问已加载的二进制文件和有效负载的api

一、DetourEnumerateModules

枚举进程中的PE二进制文件。

  • 定义

HMODULE DetourEnumerateModules(_In_opt_ HMODULE hModuleLast);
  • 参数

hModuleLast:最后枚举模块的句柄。传递NULL以启动进程开始时的枚举。

  • 返回值

进程中加载的下一个模块的句柄,如果枚举完成则为NULL。

  • 说明

detourenumeratemodule枚举加载到进程中的所有PE二进制文件。一旦一个模块被枚举,它的入口点可以用DetourGetEntryPoint API定位,它的导出可以用detourrenumerateexports API枚举,它的有效负载可以用DetourFindPayload API找到。

  • 相关的应用实例

Disas, Einst, FindFunc, Tracebld, Tracelnk, Tracereg, Tryman,

二、DetourGetEntryPoint

返回模块的入口点。

  • 定义

PVOID DetourGetEntryPoint(_In_opt_ HMODULE HMODULE);
  • 参数

hModule:需要入口点的模块句柄。如果该参数为NULL,则DetourGetEntryPoint返回用于创建调用进程的模块的入口点(. exe)。

  • 返回值

如果找到,返回模块的入口点;否则,返回NULL。

  • 错误代码

该函数将根据需要设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

NO_ERROR:指定模块没有入口点。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

ERROR_EXE_MARKED_INVALID:指定模块的PE头无效,解析出错。

  • 说明

DetourGetEntryPoint返回模块的入口点。对于. exe文件,入口点是运行时启动运行时的代码的开始。对于. dll文件,入口点是DllMain函数代码的开始部分。

休眠示例展示了如何通过绕过程序的入口点来捕获DLL初始化后的程序执行。

  • 相关的应用实例

Disas, Dumpe, FindFunc, Tracebld, Slept。

三、DetourGetModuleSize

返回模块的加载大小。

  • 定义

ULONG DetourGetModuleSize(_In_ HMODULE HMODULE);
  • 参数

hModule:需要加载大小的模块的句柄。

  • 返回值

如果可以确定,返回模块的大小(以字节为单位);否则,返回0。

  • 错误代码

该函数将根据需要设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

  • 相关的应用实例

DisasTracebld.

四、DetourEnumerateExports

枚举模块中的导出。

  • 定义

BOOL DetourEnumerateExports(_in_hmodule HMODULE, _In_opt_ PVOID pContext, _in_pf_detour_enumerate_export_callback pfExport);
  • 参数

hModule:要枚举其导出的模块的句柄。

pContext:将被传递给pfExport的程序特定的上下文。

pfExport:每个从模块导出的符号调用一次的回调函数。

  • 返回值

如果模块导出被枚举,则为TRUE;否则错误。

  • 错误代码

该函数将根据需要设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

  • 相关的应用实例

Disas, Dumpe, Einst, Tracelnk, Tracereg。

五、DetourEnumerateImports

枚举模块中的导入。

  • 定义

BOOL DetourEnumerateImports(_In_opt_ HMODULE HMODULE, _In_opt_ PVOID pContext, _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile, _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc);
  • 参数

hModule:要枚举其导入的模块的句柄。

pContext:程序特定的上下文,将被传递给pfImportFile和pfImportFunc。

pfImportFile:每个模块导入的文件调用一次的回调函数。

pfImportFunc:每个模块导入的函数调用一次的回调函数。

  • 返回值

如果模块导入被枚举,则为TRUE;否则错误。

  • 错误代码

该函数将根据需要设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

  • 说明

如果你需要一个指向导入地址表(“IAT”)的指针,你应该使用DetourEnumerateImportsEx。

  • 相关的应用实例

Tracebld。

六、DetourEnumerateImportsEx

枚举模块中的导入。

  • 定义

BOOL DetourEnumerateImportsEx(_In_opt_ HMODULE HMODULE, _In_opt_ PVOID pContext, _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile, _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK_EX pfImportFunc);
  • 参数

hModule:要枚举其导入的模块的句柄。

pContext:程序特定的上下文,将被传递给pfImportFile和pfImportFunc。

pfImportFile:每个模块导入的文件调用一次的回调函数。

pfImportFunc:每个模块导入的函数调用一次的回调函数。

  • 返回值

如果模块导入被枚举,则为TRUE;否则错误。

  • 错误代码

该函数将根据需要设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

  • 说明

DetourEnumerateImports和DetourEnumerateImportsEx非常相似。DetourEnumerateImports的回调函数接收一个指针,该指针指向Import Address Table(“IAT”)所指向的代码(或更不常见的数据)。DetourEnumerateImportsEx的回调函数接收到一个指向IAT的指针。

  • 相关的应用实例

Tracebld。

七、DetourFindPayload

返回模块中指定的有效负载的地址。

  • 定义

_Writable_bytes_(*pcbData)
_Readable_bytes_(*pcbData)
_Success_(return != NULL)
PVOID DetourFindPayload(
    _In_opt_  HMODULE hModule,
    _In_      REFGUID rguid,
    _Out_opt_ DWORD  *pcbData
);
  • 参数

hModule:存放指定负载的模块。

rguid:指定负载的GUID。

pcbData:以字节为单位接收指定负载的大小的变量。

  • 返回值

指向指定负载的指针,如果负载不存在则为NULL。

  • 错误代码

如果无法在模块中搜索目标载荷,该函数将设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

  • 说明

DetourFindPayload返回模块中指定的有效负载的地址。有效负载可以在编译链接时创建,参见Einst,也可以使用DetourBinarySetPayload API将其插入现有的二进制文件。

有关使用Detours和有效负载进行二进制编辑的更多信息,请参阅Detours概述中的有效负载和DLL导入编辑。

  • 相关的应用实例

Einst Tracebld。

八、DetourFindPayloadEx

返回进程中指定的有效负载的地址。

  • 定义

_Writable_bytes_(*pcbData)
_Readable_bytes_(*pcbData)
_Success_(return != NULL)
PVOID DetourFindPayloadEx(
    _In_      REFGUID rguid,
    _Out_opt_ DWORD  *pcbData
);
  • 参数

rguid:指定负载的GUID。

pcbData:以字节为单位接收指定负载的大小的变量。

  • 返回值

指向指定负载的指针,如果负载不存在则为NULL。

  • 错误代码

如果无法在模块中搜索目标载荷,该函数将设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_BAD_EXE_FORMAT:指定模块的MZ报头无效。

ERROR_EXE_MARKED_INVALID:指定模块的NT COFF头无效。

ERROR_INVALID_EXE_SIGNATURE:指定模块的NT COFF头签名无效。

ERROR_MOD_NOT_FOUND:枚举进程中的所有模块,发现不匹配的有效负载。

  • 说明

DetourFindPayload接受一个用于搜索负载的模块,而DetourFindPayloadEx则枚举流程中的每个模块,搜索指定的负载。

DetourFindPayloadEx返回模块中指定负载的地址。有效负载可以在编译链接时创建,参见Einst,也可以使用DetourBinarySetPayload API将其插入现有的二进制文件。

有关使用Detours和有效负载进行二进制编辑的更多信息,请参阅Detours概述中的有效负载和DLL导入编辑。

  • 相关的应用实例

PlayLoads,Einst Tracebld。

九、DetourFindRemotePayload

返回远程进程中指定的payloads有效负载的地址。

  • 定义

_Success_(return != NULL)
PVOID DetourFindRemotePayload(
    _In_      HANDLE  hProcess,
    _In_      REFGUID rguid,
    _Out_opt_ DWORD  *pcbData
);
  • 参数

hProcess:搜索指定负载的进程。

rguid:指定负载的GUID。

pcbData:以字节为单位接收指定负载的大小的变量。

  • 返回值

指向指定负载的指针,如果负载不存在则为NULL。

  • 错误代码

失败时,DetourFindRemotePayload将返回NULL。扩展的错误代码信息可以通过调用GetLastError来检索。

  • 说明

DetourFindPayload和DetourFindPayloadEx在当前进程中搜索一个负载,DetourFindRemotePayload在不同的进程中搜索一个负载。然后可以使用ReadProcessMemory或WriteProcessMemory读取或写入返回值。

有关使用Detours和有效负载进行二进制编辑的更多信息,请参阅Detours概述中的有效负载和DLL导入编辑。

  • 相关的应用实例

Payloads

十、DetourGetContainingModule

在一个包含已知函数的进程中找到PE二进制文件。

  • 定义

HMODULE DetourGetContainingModule(_In_ PVOID vpAddr);
  • 参数

pvAddr:进程中的函数地址。

  • 返回值

包含模块的句柄,如果地址不在装入的PE二进制文件中,则为NULL。

  • 相关的应用实例

Tryman

十一、DetourGetSizeOfPayloads

返回模块内所有有效载荷的大小。

  • 定义

DWORD DetourGetSizeOfPayloads(
    _In_ HMODULE hModule
);
  • 参数

hModule:要返回的有效载荷大小的模块。

  • 返回值

如果成功,返回模块内有效负载的字节大小;否则,返回0。

  • 错误代码

该函数将根据需要设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_INVALID_HANDLE:模块句柄无效。

  • 相关的应用实例

Tryman

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyl_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值