|
本帖最后由 Tesla.Angela 于 2010-7-28 23:50 编辑
陈辉大牛写的HOOK估计大家都看到了,十分牛逼吧。
不过大牛写的东西估计一般小菜看不懂而只能膜拜,所以我今天抽空写了个简单的Hook例子(HOOK自己进程内部的MessageBoxW),让大家了解一下Hook。
以下是核心代码:
'////////////////////
'Simple VB Hook
'Code By Tesla.Angela
'////////////////////
Option Explicit
Public Declare Function MessageBoxA Lib "user32.dll" _
(ByVal a As Long, _
ByVal b As String, _
ByVal c As String, _
ByVal d As Long) As Long
Public Declare Function MessageBoxW Lib "user32.dll" _
(ByVal a As Long, _
ByVal b As Long, _
ByVal c As Long, _
ByVal d As Long) As Long
Public Declare Function WriteProcessMemory Lib "kernel32.dll" _
(ByVal a As Long, _
ByVal b As Long, _
ByVal c As Long, _
ByVal d As Long, _
ByVal e As Long) As Long
Public Declare Function LoadLibraryA Lib "kernel32.dll" _
(ByVal szLibName As String) As Long
Public Declare Function GetProcAddress Lib "kernel32.dll" _
(ByVal hLib As Long, _
ByVal szFuncName As String) As Long
Public Declare Function memcpy Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal pDst As Long, _
ByVal pSrc As Long, _
ByVal dwLength As Long) As Long
Dim OldCode(4) As Byte, NewCode(4) As Byte
Dim FunAddr As Long
Public Function HookStatus(ByVal Status As Boolean) As Boolean
Dim ret As Boolean: ret = False
If Status = True Then
ret = WriteProcessMemory(-1, FunAddr, VarPtr(NewCode(0)), 5, 0)
If ret = True Then
HookStatus = True
Exit Function
End If
Else
ret = WriteProcessMemory(-1, FunAddr, VarPtr(OldCode(0)), 5, 0)
If ret = True Then
HookStatus = True
Exit Function
End If
End If
HookStatus = False
End Function
Public Function Fake_MsgBoxW(ByVal a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long) As Long
MessageBoxA 0, "MessageBoxW被HOOK了!显示此消息后才调用Real_MessageBoxW!" & vbCrLf & _
"如果传给MessageBoxW的最后一个参数为4,将会被拒绝调用Real_MessageBoxW!", _
"Fake_MessageBoxW", 0
If (d <> 4) Then
HookStatus False
Fake_MsgBoxW = MessageBoxW(a, b, c, d)
HookStatus True
Else
MessageBoxA 0, "拒绝访问!拒绝原因:传给MessageBoxW的最后一个参数为4。", "Fake_MessageBoxW", 0
Fake_MsgBoxW = 0
End If
End Function
Private Function SubPtr(ByVal AnyPtr As Long) As Long
SubPtr = AnyPtr
End Function
Public Function Hook_MsgBoxW() As Boolean
Dim JmpAddr As Long
FunAddr = GetProcAddress(LoadLibraryA("User32.dll"), "MessageBoxW")
Call memcpy(VarPtr(OldCode(0)), FunAddr, 5)
NewCode(0) = &HE9
JmpAddr = SubPtr(AddressOf Fake_MsgBoxW) - FunAddr - 5
Call memcpy(VarPtr(NewCode(1)), VarPtr(JmpAddr), 4)
Call HookStatus(True)
Hook_MsgBoxW = True
End Function
调用代码:
Private Sub Command1_Click()
MessageBoxW 0, StrPtr("txt"), StrPtr("title"), 0
End Sub
Private Sub Command2_Click()
Hook_MsgBoxW
Command2.Enabled = False
Command3.Enabled = True
End Sub
Private Sub Command3_Click()
HookStatus False
Command2.Enabled = Not False
Command3.Enabled = Not True
End Sub
Private Sub Command4_Click()
MessageBoxW 0, StrPtr("txt"), StrPtr("title"), 4
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub
如果要想这段代码在别的进程里起作用,方法有两个:
1.用老马的《VB函数添加大师》写个DLL
2.写个驱动禁用Copy-On-Write机制 |
|