找回密码  加入

AUTOIT CN

搜索
查看: 198|回复: 6

[系统综合] 怎么挂钩其他进程的WM_NCACTIVATE消息

[复制链接]
发表于 2023-3-12 00:23:33 | 显示全部楼层 |阅读模式
本帖最后由 3131210 于 2023-3-12 00:25 编辑

试了半天都没消息 外网的论坛也扒了很多,找不到可用的实例
只有下面这个,只能监听au3自己的    不能监听其他进程的

怎么样才可以用钩子拦截和修改消息

  1. #include <GUIConstantsEx.au3>
  2. #include <WinAPI.au3>

  3. Opt( "MustDeclareVars", 1 )

  4. Global Const $tagCWPSTRUCT = "lparam lParam;wparam wParam;uint message;hwnd hwnd"

  5. Global $hHook

  6. MainScript()


  7. Func MainScript()

  8.   Local $hGui = GUICreate( "Test", 300, 200, -1, 300 )

  9.   Local $hStub_MyProc = DllCallbackRegister("_MyProc", "LRESULT", "int;wparam;lparam")
  10.   $hHook = _WinAPI_SetWindowsHookEx($WH_CALLWNDPROC, DllCallbackGetPtr($hStub_MyProc), 0, _WinAPI_GetCurrentThreadId())

  11.   GUISetState()

  12.   While 1
  13.     Switch GUIGetMsg()
  14.       Case $GUI_EVENT_CLOSE
  15.         ExitLoop
  16.     EndSwitch
  17.   WEnd

  18.   GUIDelete( $hGui )

  19.   _WinAPI_UnhookWindowsHookEx($hHook)
  20.   DllCallbackFree($hStub_MyProc)

  21.   Exit

  22. EndFunc


  23. Func _MyProc($nCode, $wParam, $lParam)
  24.   Local $tCWPSTRUCT = DllStructCreate( $tagCWPSTRUCT, $lParam )
  25.   Local $hWnd = DllStructGetData( $tCWPSTRUCT, "hwnd" )
  26.   ConsoleWrite( "$hWnd = " & $hWnd & @CRLF )
  27.   Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  28. EndFunc
复制代码



发表于 7 天前 | 显示全部楼层
据我所知,光靠au3自己是无法实现,要挂勾其它进程,必需使用DLL

有个办法,P版有个[原创] 跨进程API Hook UDF - RTApiHook32.au3 [09/10/2010更新],但我不太会用
 楼主| 发表于 7 天前 | 显示全部楼层
这个 我不会怎么hook 这个WM_NCACTIVATE  
发表于 6 天前 | 显示全部楼层
本帖最后由 benkel 于 2023-3-16 12:12 编辑

刚好最近有在折腾相关的东东,水平问题没有找到直接挂钩的方法,但是在MSDN上找到变通的方法,不知道是不是你要的效果

  1. #include <GUIConstantsEx.au3>
  2. #include <WinAPI.au3>

  3. Opt( "MustDeclareVars", 1 )

  4. Global Const $tagCWPSTRUCT = "lparam lParam;wparam wParam;uint message;hwnd hwnd"
  5. Global $hEventProc = DllCallbackRegister(_EventProc, "none", "ptr;dword;hwnd;long;long;dword;dword")
  6. Global $hEventHook = _WinAPI_SetWinEventHook(3, 3, DllCallbackGetPtr($hEventProc));$EVENT_SYSTEM_FOREGROUND=3


  7. Global $hGui = GUICreate('')

  8. GUISetState()

  9. While 1
  10.         Switch GUIGetMsg()
  11.                 Case -3
  12.                         _WinAPI_UnhookWinEvent($hEventHook)
  13.                         DllCallbackFree($hEventProc)
  14.                         Exit
  15.         EndSwitch
  16. WEnd
  17. ;


  18. Func _EventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime)
  19.         If $iEvent = 3 Then;$iEvent =$EVENT_SYSTEM_FOREGROUND
  20.                 Local $hClass = _WinAPI_GetClassName($hWnd)
  21.                 ConsoleWrite('当前激活窗口类名:' & $hClass & '-->标题:' & _WinAPI_GetWindowText($hWnd) & @CRLF)
  22.         EndIf
  23. EndFunc
  24. ;
复制代码



 楼主| 发表于 6 天前 | 显示全部楼层
这个不行 不能hook我想要的消息
发表于 5 天前 | 显示全部楼层
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
 楼主| 发表于 5 天前 | 显示全部楼层
关键这个消息是哪个DLL的 都不知道
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|小黑屋|手机版|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2023-3-22 18:45 , Processed in 1.150082 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表