|
P版有个很棒的例子,挂勾函数"CreateWindowExW", https://www.autoitx.com/forum.ph ... amp;fromuid=7638255
#CS {几个很重要的函数的说明:
挂钩指定进程的指定系统函数。
_RTApiHookEx($hProcess, $pProcedure, $iNumberofParams, $pRedirect, $iFlags = $APIHOOK_Flags_Default)
参数:
$hProcess - 目标进程的句柄,返回于_RTOpenProcess函数。
$pProcedure - 系统函数的地址,返回于_RTGetProcAddress。
$iNumberofParams - (重要)系统函数的参数数量,注,一个8字节的参数实际为2个4字节参数,例如RtlInt64ToUnicodeString,其原型:
NTSTATUS RtlInt64ToUnicodeString(
__in ULONGLONG Value,
__in_opt ULONG Base,
__inout PUNICODE_STRING String
);
第一个参数Value,类型为ULONGLONG(8字节),所以在指定$iNumberofParams时,应该是:
实际参数数量(上例中有3个) + 8字节参数数量(上例中有1个) = 4个
$pRedirect - 回调函数地址,当目标进程调用指定函数时,程序将通知此回调函数,用于处理对系统函数的调用。
$iFlags - 指定何时通知$pRedirect函数,可以是以下值的组合:
$APIHOOK_Flags_1 (1) - 在系统函数被调用前通知$pRedirect函数。
$APIHOOK_Flags_2 (2) - 在系统函数被调用之后,但仍没有返回时调用$pRedirect函数。
$APIHOOK_Flags_LastError (4) - 不能单独使用,只能配合$APIHOOK_Flags_1或$APIHOOK_Flags_2,或3者一起使用。若设置了此标识,用户可以在回调函数中读取和设置、修改远程函数的LastError。
$APIHOOK_Flags_1和$APIHOOK_Flags_2可以结合使用。
默认值为BitOR($APIHOOK_Flags_1, $APIHOOK_Flags_LastError),在系统函数被调用之前调用$pRedirect函数,并可以在$pRedirect函数中设置LastError。
回调函数的定义:
Func _CallBack($hProcess, $pCallInfo)
EndFunc
参数;
$hProcess - 目标进程句柄,位于自身AutoIt进程空间内。
$pCallInfo - 系统函数调用信息,位于目标进程空间内。
回调函数的返回值:
$APIHOOK_Flags_Call_Abort - 如果_RTApiHookEx函数中的$iFlags参数设置了$APIHOOK_Flags_1标识(在系统函数被调用前通知$pRedirect函数),并且回调函数返回此值,目标进程将会中断对系统函数的调用,立即返回,并用回调函数所指定的值作为系统函数的返回值。如果_RTApiHookEx的$iFlags参数不包含$APIHOOK_Flags_1标识,那么回调函数返回此值将没有任何意义,只能在回调函数中设置远程函数的返回值和LastError。
以下这些函数只能在回调函数中使用:
--------------------------------------------------------------------------------------------
; 读取远程函数调用所使用的参数。
_RTApiHookReadParam($hProcess, $pCallInfo, $iParam = 1, $sRetType = "ptr")
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
$iParam - 指定读取第几个参数(一个8字节参数应作为2个参数),默认为第1个。
$sRetType - 参数类型,默认为ptr指针型。
返回值:
远程函数调用所使用的参数。
--------------------------------------------------------------------------------------------
; 获取远程函数被调用之后所返回的LastError。
_RTApiHookReadError($hProcess, $pCallInfo)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
返回值:
函数调用之后的LastError。
备注:
如果_RTApiHookEx的$iFlags参数不包含$APIHOOK_Flags_LastError,此函数将返回-1。
此函数只能在远程函数被调用之后再调用,否则将返回-1。
--------------------------------------------------------------------------------------------
; 获取远程函数被调用之后,函数的返回值。
_RTApiHookReadRetVal($hProcess, $pCallInfo)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
返回值:
远程函数的返回值。
备注:
此函数只能在远程函数被调用之后再调用,否则将返回-1。
--------------------------------------------------------------------------------------------
; 修改或设置远程函数调用的LastError。
_RTApiHookSetError($hProcess, $pCallInfo, $iError = 0)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
$iError - LastError值,默认为0
返回值:
True、False
备注:
如果_RTApiHookEx的$iFlags参数不包含$APIHOOK_Flags_LastError,调用此函数将没有意义。
如果是在系统函数被调用之前,回调函数通过_RTApiHookSetError设置LastError,那么回调函数应该返回$APIHOOK_Flags_Call_Abort以中断目标进程继续调用系统函数,否则回调函数设置LastError将没有任何意义。
如果是在系统函数被调用之后,回调函数通过_RTApiHookSetError设置LastError,那么远程系统函数将用此值作为新的LastError。
--------------------------------------------------------------------------------------------
; 修改或设置远程函数调用 的返回值。
_RTApiHookSetRetVal($hProcess, $pCallInfo, $pReturn = 0)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
$pReturn - 远程系统函数调用的返回值,默认为0。
返回值:
True、False
备注:
如果是在系统函数被调用之前,回调函数通过_RTApiHookSetRetVal设置返回值,那么回调函数应该返回$APIHOOK_Flags_Call_Abort以中断目标进程继续调用系统函数,否则回调函数设置返回值将没有任何意义。
如果是在系统函数被调用之后,回调函数通过_RTApiHookSetRetVal设置返回值,那么远程系统函数将用此值作为新的返回值。
--------------------------------------------------------------------------------------------
; 修改目标进程调用系统函数所使用的参数。
_RTApiHookSetParam($hProcess, $pCallInfo, $iParam, $pParam)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
$iParam - 指定要修改第几个参数(一个8字节参数应作为2个参数)。
$pParam - 第$iParam个参数的新值。
返回值:
True、False
备注:
此函数应该在系统函数被调用之前 调用,否则没有任何意义。
--------------------------------------------------------------------------------------------
; 读取系统函数被调用之后,目标进程所返回到的地址。
_RTApiHookReadRetAddr($hProcess, $pCallInfo)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
返回值:
系统函数被调用之后,目标进程的返回地址。
备注:
在系统函数被调用之前或之后,回调函数都可以用此函数来读取目标进程的返回地址。
--------------------------------------------------------------------------------------------
; 修改系统函数被调用之后,目标进程所返回到的地址。
_RTApiHookSetRetAddr($hProcess, $pCallInfo, $pRetAddress)
参数:
$hProcess - 即回调函数的$hProcess参数。
$pCallInfo - 即回调函数的$pCallInfo参数。
$pRetAddress - 系统函数被调用完之后,目标进程的返回地址。
返回值:
True、False
备注:
在系统函数被调用之前或之后,回调函数都可以用此函数来修改目标进程的返回地址。
--------------------------------------------------------------------------------------------
以上这些函数只能在回调函数中使用。}
#CE |
|