Detours学习之十二:Detours API用于修改二进制文件的api

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

用于修改二进制文件的api

一、DetourBinaryOpen

将二进制文件的内容读入内存进行编辑。

  • 定义

PDETOUR_BINARY DetourBinaryOpen(_In_ HANDLE hFile);
  • 参数

hFile:要打开进行编辑的二进制文件的句柄。

  • 返回值

如果成功,返回一个指向detours二进制对象的指针;否则,返回NULL。

  • 错误代码

如果合适,该函数将设置以下错误代码。在函数返回后,可以通过调用GetLastError来检索错误代码。

ERROR_OUT_OF_MEMORY:内存不足,无法完成操作。

  • 说明

DetourBinaryOpen将Windows PE COFF二进制文件的内容读入内存进行编辑。

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

  • 相关的应用实例

Dumpi、Impmunge Setdll。

二、DetourBinaryEnumeratePayloads

在二进制文件中枚举有效负载。

  • 定义

_Writable_bytes_(*pcbData)
_Readable_bytes_(*pcbData)
_Success_(return != NULL)
PVOID DetourBinaryEnumeratePayloads(
    _In_      PDETOUR_BINARY pBinary,
    _Out_opt_ GUID * pGuid,
    _Out_     DWORD * pcbData,
    _Inout_   DWORD * pnIterator
);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针。

pGuid:指向变量的指针,用于接收下一个负载的GUID。

pcbData:指向变量的指针,用于接收下一个有效负载的字节大小。

pnIterator:枚举变量。应设置为零以开始枚举。在对该函数的连续调用之间不应修改枚举变量。

  • 说明

DetourBinaryEnumeratePayloads枚举由DetourBinaryOpen打开的二进制文件中的所有有效负载。

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

  • 返回值

如果成功,返回指向下一个有效负载的指针;否则,返回NULL。

三、DetourBinaryFindPayload

在二进制文件中找到有效负载。

  • 定义

_Writable_bytes_(*pcbData)
_Readable_bytes_(*pcbData)
_Success_(return != NULL)
PVOID DetourBinaryFindPayload(
    _In_  PDETOUR_BINARY pBinary,
    _In_  REFGUID rguid,
    _Out_ DWORD * pcbData
);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针。

rguid:指定负载的GUID。

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

  • 说明

detourbinaryfindpayload在由DetourBinaryOpen打开的二进制文件中找到一个特定的负载。

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

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

四、DetourBinarySetPayload

将有效载荷附加到二进制文件上。

  • 定义

PVOID DetourBinarySetPayload(
    _In_                   PDETOUR_BINARY pBinary,
    _In_                   REFGUID rguid,
    _In_reads_opt_(cbData) PVOID pData,
    _In_                   DWORD cbData
);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针

rguid:要添加到二进制文件中的有效负载的GUID。

pData:指向有效负载数据的指针。

cbData:负载数据的大小,以字节为单位。

  • 说明

DetourBinarySetPayload将一个有效负载附加到由DetourBinaryOpen打开的二进制文件上。可以使用DetourFindPayload API在运行时定位负载。

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

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

五、DetourBinaryDeletePayload

从二进制文件中移除有效负载。

  • 定义

BOOL DetourBinaryDeletePayload(_In_ PDETOUR_BINARY pBinary, _In_ REFGUID rguid);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针。

rguid:要移除的负载的GUID。

  • 说明

DetourBinaryDeletePayload从DetourBinaryOpen打开的二进制文件中删除一个有效负载。

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

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

六、DetourBinaryPurgePayloads

从二进制文件中删除所有有效负载。

  • 定义

BOOL DetourBinaryPurgePayloads(_In_ PDETOUR_BINARY pBinary);
  • 参数

pBinary:指向要被清除的二进制文件的指针,由DetourBinaryOpen打开。

  • 说明

DetourBinaryPurgePayloads移除由DetourBinaryOpen打开的二进制文件中的所有有效负载。

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

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

七、DetourBinaryEditImports

编辑二进制文件的导入表。

  • 定义

BOOL DetourBinaryEditImports(_in_pdetour_binary pBinary, _In_opt_ PVOID pContext, _In_opt_ PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway, _In_opt_ PF_DETOUR_BINARY_FILE_CALLBACK pfFile, _In_opt_ PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol, _In_opt_ PF_DETOUR_BINARY_COMMIT_CALLBACK pfFinal);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针。

pContext:特定于程序的上下文指针,要不加修改地传递给每个回调函数。

pfByway:在导入表中每个模块之前调用的回调函数。

pfFile:为导入表中的每个模块调用一次回调函数。

pfSymbol:为导入表中的每个符号调用一次的回调函数。

pfCommit:如果没有错误,在导入表的末尾调用回调函数。

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

  • 说明

DetourBinaryEditImports编辑由DetourBinaryOpen打开的二进制文件的导入表。Detours使用Detours有效载荷以可逆格式存储编辑。可以使用DetourBinaryResetImports函数来删除编辑。

DetourBinaryEditImports按顺序遍历二进制文件的导入表,对所有感兴趣的点进行回调。目前支持四个感兴趣的点,每个点都有自己的回调函数:

  • Files:对导入表中列出的每个文件调用pfFile函数。回调函数可以自行更改文件名。
  • Symbol:对导入表中每个文件中列出的每个符号调用pfSymbol函数。回调函数可以自行更改符号名。
  • Byways:pfByway函数在导入表的开头、每对导入函数之间调用一次,然后在导入表的结尾再次调用一次。的pfByway函数可以自行决定将新的导入文件导入到导入表中。当插入一个旁路时,导入表被修改为从命名的导入文件导入序号为#1的函数。
  • Commit:如果之前的回调函数没有返回任何错误,则在遍历导入表的最后调用pfCommit函数。

考虑一个二进制文件,它从Kernel32.dll中导入CreateFileW和CloseHandle函数,从Shell32.dll中导入CommandLineToArgvW函数,从AdvApi32.dll中导入RegOpenKeyExW, RegQueryValueW和RegCloseKey函数,并从先前调用DetoursBinaryEditImports中插入mydetourl .dll。调用DetoursBinaryEditImports的程序将收到以下回调:

  • BywayCallback (..., NULL, ...)
  • BywayCallback (..., "MyDetour.dll", ... )
  • BywayCallback (..., NULL, ...)
  • FileCallback (..., "Kernel32.dll", ...)
  • SymbolCallback (..., "CloseHandle", ...)
  • SymbolCallback (..., "CreateFileW", ...)
  • BywayCallback (..., NULL, ...)
  • FileCallback (..., "Shell32.dll", ...)
  • SymbolCallback (..., "CommandLineToArgvW", ...)
  • BywayCallback (..., NULL, ...)
  • FileCallback (..., "AdvApi32.dll", ...)
  • SymbolCallback (..., "RegCloseKey", ...)
  • SymbolCallback (..., "RegQueryValueW", ...)
  • SymbolCallback (..., "RegOpenKeyExW", ...)
  • BywayCallback (..., NULL, ...)
  • CommitCallback (...)

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

注意:作为旁路插入的每个DLL必须导出序号为#1的函数。如果DLL的导出表没有导出序号#1的函数,则目标二进制文件将无法正确加载。

  • 相关的应用实例

Dumpi、Impmunge Setdll。

八、DetourBinaryResetImports

删除Detours对二进制文件导入表的所有编辑。

  • 定义

BOOL DetourBinaryResetImports(_In_ PDETOUR_BINARY pBinary);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针。

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

  • 说明

DetourBinaryResetImports删除所有DetourBinaryOpen打开的二进制文件导入表的编辑。

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

  • 相关的应用实例

Setdll。

九、DetourBinaryWrite

将更新后的二进制文件写入文件。

  • 定义

BOOL DetourBinaryWrite(_In_ PDETOUR_BINARY pBinary, _In_ HANDLE hFile);
  • 参数

pBinary:指向要写入文件的二进制文件的指针。

hFile:接收二进制文件内容的句柄。

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

  • 说明

DetourBinaryWrite将由DetourBinaryOpen打开的更新的二进制文件写入一个文件。

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

  • 相关的应用实例

Impmunge Setdll。

十、DetourBinaryClose

关闭打开供编辑的二进制文件。

  • 定义

BOOL DetourBinaryClose(_In_ PDETOUR_BINARY pBinary);
  • 参数

指向DetourBinaryOpen打开的二进制文件的指针。

  • 返回值

如果成功,返回TRUE;否则,返回FALSE。

  • 说明

DetourBinaryClose关闭由DetourBinaryOpen打开用于编辑的二进制文件。

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

  • 相关的应用实例

Dumpi、Impmunge Setdll。

  • 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、付费专栏及课程。

余额充值