找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 14973|回复: 15

[原创] 纯VB写的HOOK

 火... [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-28 23:43:54 | 显示全部楼层 |阅读模式
本帖最后由 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机制

SimpleVBHook.rar

6.08 KB, 阅读权限: 1, 下载次数: 195

售价: 1 水晶币  [记录]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-7-31 12:15:49 | 显示全部楼层
vbAdvance做标准dll也不错,大家可以试一下。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-8-3 14:17:47 | 显示全部楼层
学习一下.

这个代码很精简.
我就是嗷嗷叫的老马了......

0

主题

56

回帖

0

精华

铜牌会员

积分
67
发表于 2010-8-13 22:53:12 | 显示全部楼层
这个是做什么用的?

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-8-13 22:55:07 | 显示全部楼层
回复 4# fengerpro


做演示用的
头像被屏蔽

27

主题

136

回帖

2

精华

铂金会员

积分
2257
发表于 2010-8-14 16:41:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

2

回帖

0

精华

初来乍到

积分
8
发表于 2010-10-21 08:35:08 | 显示全部楼层
这个不会

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-11-5 22:03:52 | 显示全部楼层
VBadvanced是怎么用的哦!?

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-11-5 22:04:33 | 显示全部楼层
视频演示······

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-11-6 00:23:28 | 显示全部楼层
回复 8# oopww


VBadvanced自带演示文件的

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2011-11-25 20:42:27 | 显示全部楼层
这个不错

但是为什么没用setwindowhook这个函数?

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-12-2 15:21:04 | 显示全部楼层
ok100fen 发表于 2011-11-25 20:42
这个不错

但是为什么没用setwindowhook这个函数?

这个是API HOOK,那个是系统的消息HOOK,不是同一类型的HOOK.
我就是嗷嗷叫的老马了......

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2011-12-2 20:56:11 | 显示全部楼层
ok了,

谢谢老马

0

主题

27

回帖

0

精华

铜牌会员

积分
98
发表于 2013-2-8 00:27:47 | 显示全部楼层
{:soso_e120:}{:soso_e128:} 不错哦。学习了

0

主题

21

回帖

0

精华

铜牌会员

积分
94
发表于 2014-6-14 23:13:50 | 显示全部楼层
赞一个

评分

参与人数 1水晶币 +10 收起 理由
everyone + 10 ..

查看全部评分

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-10 10:32:38 | 显示全部楼层
吼吼 代码真好看
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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