|
马上注册,获取更多精彩内容!!!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
ShellHook是什么?当一个窗口创立、激活、封闭时,explorer总是能够捕捉相应的音讯,并更新义务栏上,就是经过ShellHook完成的。本课完成了对零碎一切顶级窗口的拦挡,和指定窗口的拦挡。
9 j5 V; e! E. E6 k( {0 u! V: I
# \" ]5 O& F3 I: h; y( L. XRegisterWindowMessage
" A' b# \+ \' V/ v: VRegisterWindowMessage函数定义一个新的窗口音讯,保障该音讯在零碎范畴内是惟一的。通常调用SendMessage或许PostMessage函数时,能够应用该函数前往的音讯值。) l8 L( M$ ^6 J, ^0 Z( o/ {
d* S' X5 {5 }6 n, y* t正文:- {4 C4 q8 U: x! g6 j
RegisterWindowMessage函数通罕用于为两个协作应用顺序之间的通讯注销音讯。 若两个不同的应用顺序注销了相反的音讯字符串,则这两个应用顺序前往相反的音讯值。该音讯不断维持被注销形态,直到Windows会话完结。当多个应用顺序必需解决同一音讯时才应用RegisterWindowMessage函数。在一个窗口类范畴内发送公有音讯时,获取调配给一个字串标识符的音讯编号 &C000(49152) 到 &FFFF(65535)之间的一个音讯编号。零象征着出错。5 T9 P0 H& T& M2 e3 A8 S6 j
! R" p R# c) ^$ b% \# D: Z$ K6 j, uhttps://docs.microsoft.com/en-us ... isterwindowmessagea
4 l8 Z+ Q3 I- ^% j0 K' w字符串罕见有:' n" C" M. X' ?' u0 }( X" c
TaskBarCreated 普通用于Explorer解体后的托盘图标重建
4 E) a& N# N3 d' ]) ZSHELLHOOK 配合RegisterShellHookWindow可用于拦挡零碎窗口创立等
1 L- i8 B8 m& pTaskbarButtonCreated 在win7里的义务按钮创立
O4 [ G- `" ^; ~6 J& ^
; o, |( d/ D+ N' n% gRegisterShellHookWindow
, y e, i$ b# j6 v5 s; Chttps://docs.microsoft.com/en-us ... stershellhookwindow
* w# Q2 W6 h' N# D2 b+ n! e3 s2 ~1 f N! e" R$ L
开始拦截- .版本 2
0 `. W! Y% J4 O% O* u4 O -
* I6 M( d! s* A - .子程序 开始拦截
2 J/ L: h" }7 C8 J - 3 Y# t9 ?( {( e1 ]" J
- MsgNum = RegisterWindowMessage (“SHELLHOOK”)/ y3 G+ k( A( w" A9 S- X
- .如果真 (MsgNum = 0)
4 E7 N1 u2 T8 `2 ?; j% Z - 信息框 (“注册shell hook 失败”, 0, , )
) S! Q g0 ]9 D! b - 返回 ()& u% K# e4 `# E2 h: |7 a2 c, t# b
- b3 e- n: U& V6 s3 O+ u; C
- .如果真结束/ N' D E% U9 I# ^. W
- RegisterShellHookWindow (取窗口句柄 ())" {! @6 d! `! k- g, ]0 c
- ' 窗口子类化/ F# S0 S8 ]" L
- SetRet = SetWindowLong (取窗口句柄 (), -4, 到整数 (&NewProc))
复制代码 窗口子类化- .版本 2
6 a6 m! u' q$ ?' Q/ g- H7 S! f - .支持库 iext
' d0 |" F/ m+ j- h6 Z* K - & H3 j& u9 x5 m% w
- .子程序 NewProc, 整数型/ L, {6 ~! O0 s9 n/ V
- .参数 Hwnd, , , 这个句柄是程序本身的句柄
/ q: M# W3 D8 r( i) I9 R( h# K - .参数 uMsg, , , 用户的消息识别类型
8 j# X7 G' |; Y$ ^8 f( i - .参数 wParam, , , 事件类别0 t* E- X3 M k
- .参数 lParam, , , 拦截的系统的窗口 的句柄
; \& J) ~5 Q$ B0 D/ H - .局部变量 Tid f. q2 J& k4 v1 `
- .局部变量 i
4 w5 }- k7 G9 |# \ - 1 b% y) W9 a( g- g
- ' 只针对某一个特定顶级窗口hook/ D0 s3 O, U$ L6 A) a
- .如果真 (lParam = 取指定窗口句柄 (“无标题 - 记事本”))
/ M- A: D! A/ ~- ]4 G: R - .判断开始 (wParam = 1) ' 顶级窗口的创建’
2 v7 Y/ S0 a/ `* v! R - GetWindowThreadProcessId (lParam, Tid)- E/ k% n8 ^& A, `0 d8 O
- .如果真 (Tid ≠ 0)$ d& l, f' K6 Q& t: W- r0 |& Q
- i = 超级列表框1.插入表项 (, “窗口创建”, , , , )
0 ^/ \4 _4 ]: c. e, p! U - 超级列表框1.置标题 (i, 1, 到文本 (lParam))
! J7 H/ I' o, A: ?: ~/ [' A - 超级列表框1.置标题 (i, 2, 到文本 (Tid))7 |2 ~& j1 t* W) F7 C! J9 _+ h
- 超级列表框1.置标题 (i, 3, 到文本 (取指定窗口标题 (lParam)))' l0 w8 G2 E0 s+ U" X3 d9 N3 S
- 超级列表框1.保证显示 (i)
+ x0 t# U1 ~# T9 T. a, ` - ; h# T6 i8 R6 p$ S
- .如果真结束9 E0 o. Q( ^2 o* z
-
2 e( |/ D. r0 V6 p - .判断 (wParam = 2) ' 顶级窗口的销毁’9 X) Y) I) K) [
- GetWindowThreadProcessId (lParam, Tid): E9 e; g0 Z+ ^5 m7 W% o! z% {& w+ d
- .如果真 (Tid ≠ 0)
4 x8 L( G2 o& O% L - i = 超级列表框1.插入表项 (, “窗口销毁”, , , , )6 S5 d: l7 x# u" w
- 超级列表框1.置标题 (i, 1, 到文本 (lParam)); a4 }9 E) ]; |; B
- 超级列表框1.置标题 (i, 2, 到文本 (Tid)): e8 q" }* O9 B( H( s$ X
- 超级列表框1.置标题 (i, 3, 到文本 (取指定窗口标题 (lParam)))6 F# j5 Z! v) F% v
- 超级列表框1.保证显示 (i)
) R" i v- R6 P( h - # @+ d6 ]* J( N5 ]9 s; X
- .如果真结束
, \8 y, w8 L; L- D. o4 `, n, h; | -
$ ^# f2 e& F/ z0 R2 `) B# z - .判断 (wParam = 32772) ' 顶级窗口切换
8 H3 b; L% w' \ - GetWindowThreadProcessId (lParam, Tid)
; _6 A/ ]4 d4 T* s5 c0 `* ` - .如果真 (Tid ≠ 0)
6 z9 P c& O( r1 g& H) F: z - i = 超级列表框1.插入表项 (, “窗口切换”, , , , )# Y0 R/ ^+ C4 o1 @0 {' M& [
- 超级列表框1.置标题 (i, 1, 到文本 (lParam))
& Q. b. _3 ^, K - 超级列表框1.置标题 (i, 2, 到文本 (Tid)): ^) z/ m# |% K D& C; |' v
- 超级列表框1.置标题 (i, 3, 到文本 (取指定窗口标题 (lParam))); [8 t: B. n$ b% H& L* ?( f
- 超级列表框1.保证显示 (i)
, q; W1 l) G' C$ | -
6 [8 c' I! [" h% ] - .如果真结束
5 l. y5 \ Q! v - 8 ]. P2 S- B5 V' b$ s( n
- .默认
+ X8 ]3 y! m, U [ - .判断结束
* z/ z8 E4 f! j1 x - .如果真结束& Y, ?) t. j1 I! T$ ^. G8 ?8 Y: e
- 返回 (CallWindowProc (SetRet, Hwnd, uMsg, wParam, lParam))
复制代码
" @* f+ w Q2 i
5 E2 v0 L) `4 c
# d- o2 g3 N" \& H" Y5 I
8 F! s6 c! Y* A2 _' Y8 w% k |
|