Detours学习之九:用于路由目标函数的api

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

用于路由目标函数的api

一、DetourTransactionBegin

开始一个附加或分离弯道的新事务。

  • 定义

LONG DetourTransactionBegin(VOID);
  • 返回值

如果成功返回NO_ERROR;否则返回ERROR_INVALID_OPERATION。

  • 错误代码

ERROR_INVALID_OPERATION:一个挂起的事务已经存在。

  • 说明

DetourTransactionBegin开始一个新的事务,用于附加或分离弯道。

在开始一个事务之后,程序调用DetourAttach或DetourAttachEx API将一个DetourAttach附加到一个目标函数,调用DetourDetach API将一个DetourDetach API从一个目标函数中分离出来,或者调用DetourUpdateThread API在事务更新中包含一个线程。

在程序使用DetourTransactionCommit或DetourTransactionCommitEx API提交事务之前,附加、分离和线程操作不会生效。或者,程序可以使用DetourTransactionAbort API中止事务。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的实例

commmem, Cping, Dtest, Excep, FindFunc, Member, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。

二、DetourUpdateThread

在当前事务中征募用于更新的线程。

  • 定义

LONG DetourUpdateThread(
    _In_ HANDLE hThread
);
  • 参数

hThread:要用挂起的事务更新的线程句柄。如果hThread等于当前线程的伪句柄(由GetCurrentThread()返回),则不执行任何操作,并返回NO_ERROR。

  • 返回值

如果成功返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_NOT_ENOUGH_MEMORY:没有足够的内存来记录线程的标识。

  • 说明

当由DetourTransactionBegin API打开的当前事务提交时,DetourUpdateThread登记指定的线程进行更新。

当一个DetourUpdateThread事务提交时,Detours确保通过DetourUpdateThread API在事务中注册的所有线程都被更新,如果它们的指令指针位于重写的代码中目标函数或trampoline函数中。

事务提交时,未在事务中登记的线程不会更新。因此,他们可能会试图执行旧代码和新代码的非法组合。

目前不支持对当前线程使用非伪句柄调用DetourUpdateThread,并将导致应用程序挂起。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的实例

commmem, Cping, Dtest, Excep, FindFunc, Member, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。

三、DetourAttach

给目标函数附加一个路由。

  • 定义

LONG DetourAttach(
    _Inout_ PVOID * ppPointer,
    _In_    PVOID pDetour
);
  • 参数

ppPointer:指向绕道将附加到的目标指针的指针。有关其他注意事项,请参阅下面的注释部分。

pDetour:指向detour函数的指针。

  • 返回值

如果成功返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_INVALID_BLOCK:被引用的函数太小,不能绕道。

ERROR_INVALID_HANDLE: ppPointer形参为NULL或指向NULL指针。

ERROR_INVALID_OPERATION:不存在挂起的事务。

ERROR_NOT_ENOUGH_MEMORY:没有足够的内存来完成操作。

  • 说明

警告:ppPointer参数所指向的变量必须在事务期间保持活动,直到DetourTransactionCommit、DetourTransactionCommitEx或DetourTransactionAbort被调用。

DetourAttach将一个绕道附加到目标函数,作为DetourTransactionBegin API打开的当前事务的一部分。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的实例

Commem, Cping, Dtest, Excep, FindFunc, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。

四、DetourAttachEx

将绕道附加到目标函数,并获取关于最终目标的额外细节。

  • 定义

 LONG DetourAttachEx(
    _Inout_   PVOID * ppPointer,
    _In_      PVOID pDetour,
    _Out_opt_ PDETOUR_TRAMPOLINE * ppRealTrampoline
    _Out_opt_ PVOID * ppRealTarget
    _Out_opt_ PVOID * ppRealDetour
);
  • 参数

ppPointer:指向绕道将附加到的目标指针的指针。有关其他注意事项,请参阅下面的注释部分。

pDetour:指向detour函数的指针。

ppRealTrampoline:可选接收蹦床地址的变量。

ppRealTarget:可选接收目标函数的最终地址的变量。

ppRealDetour:可选接收detour函数最终地址的变量。

  • 返回值

如果成功返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_INVALID_BLOCK:被引用的函数太小,不能绕道。

ERROR_INVALID_HANDLE: ppPointer形参为NULL或指向NULL指针。

ERROR_INVALID_OPERATION:不存在挂起的事务。

ERROR_NOT_ENOUGH_MEMORY:没有足够的内存来完成操作。

  • 说明

警告:ppPointer参数所指向的变量必须在事务期间保持活动,直到DetourTransactionCommit、DetourTransactionCommitEx或DetourTransactionAbort被调用。

DetourAttachEx将一个绕道附加到目标函数,并检索关于最终目标的额外细节,作为DetourTransactionBegin API打开的当前事务的一部分。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的应用实例

dynamic_alloc Tracebld。

五、DetourAllocateRegionWithinJumpBounds

在给定地址附近分配一个可执行区域。

  • 定义

PVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget, _Out_ PDWORD pcbAllocatedSize);
  • 参数

pbTarget:开始搜索可分配空间的地址

pcbAllocatedSize:接收以字节为单位的已分配区域大小的变量

  • 返回值

如果成功,返回所分配的页面区域的基址;否则,返回NULL。

  • 说明

detourallocateregionwithinjumpoundtries to allocate a region near enough to make a跳转from the given address. detourallocateregionwithinjumpoundtries to allocate a region near to make a跳转from the given address。

要释放由detourallocateregionwithinjumpounds分配的区域,请使用VirtualFree函数。

正如在拦截二进制函数中所解释的,Detours将一个带有带符号的32位偏移量的相对跳转写入目标函数,从而跳转到detour函数。这意味着detour函数需要放置在目标的+/- 2GB范围内。detourallocateregionwithinjumpounds分配一个可执行区域,Detours可以从给定的目标地址写入跳转到该区域。如果您想动态地创建一个detour函数,这是非常有用的。

  • 相关的应用实例

dynamic_alloc

六、DetourDetach

从目标函数中分离一个绕道。

  • 定义

长DetourDetach(_Inout_ PVOID * ppPointer, _In_ PVOID pDetour);
  • 参数

ppPointer:指向将从中分离绕道的目标指针的指针。

pDetour:指向detour函数的指针。

  • 返回值

如果成功返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_INVALID_BLOCK:要分离的函数太小,不能绕道。

ERROR_INVALID_HANDLE: ppPointer参数是NULL或引用一个NULL '地址。

ERROR_INVALID_OPERATION:不存在挂起的事务。

ERROR_NOT_ENOUGH_MEMORY:没有足够的内存来完成操作。

  • 说明

DetourDetach将一个DetourTransactionBegin API打开的当前事务的一部分从目标函数中分离出来。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的实例

Commem, Cping, FindFunc, Member, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。

七、DetourSetIgnoreTooSmall

在附加或分离单独的绕道功能失败时启用或禁用事务中止。

  • 定义

BOOL DetourSetIgnoreTooSmall(_In_ BOOLfIgnore);
  • 返回值

如果Detours之前忽略了目标函数太小而不能绕道,则返回TRUE;否则,返回FALSE。

  • 参数

fIgnore:指定是否忽略过小而不能绕道的函数。如果该参数设置为TRUE,则遇到这些函数时将被忽略。如果将此参数设置为FALSE,则遇到太小而不能绕道的函数将导致DetourTransactionCommit失败。

  • 说明

DetourSetIgnoreTooSmall设置标志,以确定如果目标函数太小而不能绕行,则绕行失败是否足以导致当前绕行事务中止。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的实例

Traceapi。

八、DetourSetRetainRegions

强制Detours保留Trampline分配区域,即使已经释放了蹦床。

  • 定义

Bool DetourSetRetainRegions(_In_ BOOLfRetain);
  • 返回值

如果Detours之前保留了未使用的trampolines区域,则返回TRUE;否则,返回FALSE。

  • 参数

fRetain:指定在区域中的所有trampolines被释放后,是否应该保留(并重用)trampolines内存分配区域。如果设置为TRUE,则保留这些区域。如果该参数设置为FALSE,则不保留region。

  • 说明

Detours从64KB内存的连续区域分配trampolines。默认情况下,当区域中的所有trampolines都被释放(分离)后,这些区域将返回给操作系统。然而,在某些情况下,例如当程序频繁地附加、分离和重新附加时,可能需要保留内存区域。

在3.0版本之前的Detours版本总是保留了trampolines区域。为了向后兼容,一些程序可能希望通过调用DetourSetRetainRegions(TRUE)来强制执行这个已弃用的行为。

九、DetourSetSystemRegionLowerBound

设置不能用于Trameplnes的内存区域的下界,因为它是为系统dll保留的。

  • 定义

PVOID DetourSetSystemRegionLowerBound(_In_ PVOID pSystemRegionLowerBound);
  • 返回值

返回上一个下界值。

  • 参数

pSystemRegionLowerBound:指定Detours必须避免放置Trameplenes的系统区域的下界。

  • 说明

DetourAttach和DetourTAttachEx api为每个DetourAttach函数分配一个Trameplines。为了避免内存碎片,Detours尝试创建分配Trameplines的区域,该区域尽可能接近要路由绕行的代码。在某些情况下,Trameplines区域可能会与操作系统或应用程序为稍后加载的dll预留的内存发生冲突。当这种情况发生时,应用程序将继续正常运行,但可能会迫使操作系统将一个或多个dll重新定位到另一个位置,这将增加进程所需的虚拟内存。

为了避免这些dll重定位冲突,Detours被编程来避免在称为“系统区域”的内存区域中放置任何Trameplines。缺省情况下,区域范围是0x70000000 ~ 0x80000000。调用DetourSetSystemRegionLowerBound和DetourSetSystemRegionUpperBound来改变区域。例如,如果绕过系统dll后将CLR加载到进程中,则可能会增加该区域。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的应用实例

Region.

十、DetourSetSystemRegionUpperBound

设置不能用于Tramplines的内存区域的下界,因为它是为系统dll保留的。

  • 定义

PVOID DetourSetSystemRegionUpperBound(_In_ PVOID pSystemRegionUpperBound);
  • 返回值

返回上一个上限值。

  • 参数

pSystemRegionUpperBound:指定Detours必须避免放置蹦床的系统区域的上界。

  • 说明

DetourAttach和DetourAttachEx api为每个DetourAttach函数分配一个 trampolines。为了避免内存碎片,Detours尝试创建分配 trampolines的区域,该区域尽可能接近要绕行的代码。在某些情况下, trampolines区域可能会与操作系统或应用程序为稍后加载的dll预留的内存发生冲突。当这种情况发生时,应用程序将继续正常运行,但可能会迫使操作系统将一个或多个dll重新定位到另一个位置,这将增加进程所需的虚拟内存。

为了避免这些dll重定位冲突,Detours被编程来避免在称为“系统区域”的内存区域中放置任何 trampolines。缺省情况下,区域范围是0x70000000 ~ 0x80000000。调用DetourSetSystemRegionLowerBound和DetourSetSystemRegionUpperBound来改变区域。例如,如果绕过系统dll后将CLR加载到进程中,则可能会增加该区域。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的实例

Region

十一、DetourTransactionAbort

中止当前事务以附加或分离绕道。

  • 定义

Long DetourTransactionAbort(VOID);
  • 返回值

如果挂起的事务完全中止,则返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_INVALID_OPERATION:不存在挂起的事务。

  • 说明

DetourTransactionAbort将终止使用DetourTransactionBegin创建的当前事务。中止一个事务将逆转事务中对DetourAttach、DetourAttachEx、DetourDetach或DetourUpdateThread api的任何调用的效果。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的应用实例

dynamic_alloc。

十二、DetourTransactionCommit

提交用于附加或分离弯道的当前事务。

  • 定义

Long DetourTransactionCommit(VOID);
  • 返回值

如果成功返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_INVALID_DATA:目标函数在事务的各个步骤之间被第三方更改。

ERROR_INVALID_OPERATION:不存在挂起的事务。

Other: API在DetourAttach、DetourAttachEx或DetourDetach中返回的导致事务失败的错误代码。

  • 说明

DetourTransactionCommit提交用DetourTransactionBegin创建的当前事务。提交事务将在事务中调用DetourAttach、DetourAttachEx、DetourDetach或DetourUpdateThread api中指定所有更新。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的应用实例

commmem, Cping, Dtest, Excep, FindFunc, Member, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。

十三、DetourTransactionCommitEx

提交用于附加或分离弯道的当前事务。

  • 定义

Long DetourTransactionCommitEx(_Out_opt_ PVOID ** pppFailedPointer);
  • 参数

pppFailedPointer:用于接收传递给导致最近事务失败的DetourAttach、DetourAttachEx或DetourDetach调用的目标指针的变量。

  • 返回值

如果成功返回NO_ERROR;否则,返回错误代码。

  • 错误代码

ERROR_INVALID_DATA:在事务完成之前,目标函数被第三方更改。

ERROR_INVALID_OPERATION:不存在挂起的事务。

其他代码:API在DetourAttach、DetourAttachEx或DetourDetach中返回的导致事务失败的错误代码。

  • 说明

DetourTransactionCommitEx提交用DetourTransactionBegin创建的当前事务。提交事务将在事务中调用DetourAttach、DetourAttachEx、DetourDetach或DetourUpdateThread api中指定所有更新。

有关使用Detours拦截函数调用的更多信息,请参阅Detours概述中的拦截二进制函数或使用Detours。

  • 相关的应用实例

Traceapi

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jyl_sh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值