Nicol 发表于 2024-3-9 18:18:11

没有人讨论VB6的全局钩子吗?

如何用VB6制作除WH_MOUSE 、WH_MOUSE_LL之类本身就是全局钩子的其他全局钩子,vb6只能调用32位dll,那么对于32位应用程序可以被注入。64位的程序就不能被勾住,请教如何解决

AyalaRs 发表于 2024-3-10 01:16:38

如果用vb处理,那么回调函数也用vb写,那么就需要 wow64和w64来回切换,需要些汇编功底

Nicol 发表于 2024-3-10 01:31:17

AyalaRs 发表于 2024-3-10 01:16
如果用vb处理,那么回调函数也用vb写,那么就需要 wow64和w64来回切换,需要些汇编功底 ...

我看了listary,是分别用32位dll和64位dll来实现,这样岂不是也要2个对应的exe?
版主你所说的方法能细说一下吗。汇编只能马马虎虎看个大概,没有能力写。

Nicol 发表于 2024-3-10 01:35:19

类似https://www.0xaa55.com/thread-1895-1-1.html【测试】32位进程强行注入DLL到64位进程(支持XP~WIN10)?

Nicol 发表于 2024-3-10 01:54:45

Nicol 发表于 2024-3-10 01:35
类似https://www.0xaa55.com/thread-1895-1-1.html【测试】32位进程强行注入DLL到64位进程(支持XP~WIN10 ...

但是钩子dll是系统自动加载的啊…

AyalaRs 发表于 2024-3-10 02:43:27

你是为了处理全局事件还是为了注入dll,两者复杂程序不同,另外vb6不能写64位dll,后续的事情无论哪个都无法处理

Nicol 发表于 2024-3-10 10:20:15

本帖最后由 Nicol 于 2024-3-10 10:32 编辑

AyalaRs 发表于 2024-3-10 02:43
你是为了处理全局事件还是为了注入dll,两者复杂程序不同,另外vb6不能写64位dll,后续的事情无论哪个都无 ...

我是为了获得外部程序的窗口(不一定是系统级窗体)的 弹出,非激活和移动 消息,所以必须得钩子,不想用定时器。也无法用WH_SHELL,这个可以不用dll全局,但只能获得系统级窗体,也无法获得窗体实时移动消息WM_MOVING。VB不能写64位dll,单一的钩子dll相对简单些,可以VC6(有点基础,不熟)

tlwh163 发表于 2024-3-10 19:31:58

要不要试试hook showwindow API

Nicol 发表于 2024-3-10 19:42:41

tlwh163 发表于 2024-3-10 19:31
要不要试试hook showwindow API

hook api不是更难吗?我想hook移动和弹出,还有就是改变z序(或者转入非激活)几个消息

AyalaRs 发表于 2024-3-11 00:55:04

Nicol 发表于 2024-3-10 19:42
hook api不是更难吗?我想hook移动和弹出,还有就是改变z序(或者转入非激活)几个消息 ...

都不简单,vc6也不适合写64位程序,想要同时处理64位和32位 vc6 vb6都不适合

Nicol 发表于 2024-3-11 08:50:27

AyalaRs 发表于 2024-3-11 00:55
都不简单,vc6也不适合写64位程序,想要同时处理64位和32位 vc6 vb6都不适合

是因为这俩都不能写64位dll的原因吗?
或者是别的原因吗?我看好几种软件都是2个dll(一个32一个64),比较简单点的实际路径是怎么样的呢?(或者说就趁现在就该转其它语言了)

AyalaRs 发表于 2024-3-11 09:59:13

Nicol 发表于 2024-3-11 08:50
是因为这俩都不能写64位dll的原因吗?
或者是别的原因吗?我看好几种软件都是2个dll(一个32一个64),比较 ...

vc6升级下就行

Nicol 发表于 2024-3-11 10:20:27

AyalaRs 发表于 2024-3-11 09:59
vc6升级下就行

升级下是解决编译64位dll的问题,但是还是不知道思路怎么搞

美俪女神 发表于 2024-3-11 18:33:49

看到你的帖子有点感慨,仿佛看到了15年前的自己。当年的我就很纠结这个问题。

VB6搞全局钩子是不现实的,原因有二:
1、VB6难以生成32位标准DLL(VB6生成的DLL叫做ACTIVE X DLL)。
2、VB6无法生成64位标准DLL。

如果非要用VB6搞全局钩子,需要:
1、用C或汇编写一个钩子程序,分别编译为32位和64位的DLL,然后用pe_to_shellcode把DLL转换为机器码(不清楚pe_to_shellcode是否好使)。
2、把DLL注入到目标进程里,需要同时支持32位和64位进程。

但是你会发现:
1、很多进程(比如某些系统进程、杀毒软件进程等)无法被注入,因为有“对象回调”在保护它们,或者在EPROCESS上被设置了保护。
2、有些进程(比如EDGE浏览器进程)被注入了也无效,因为微软给EDGE浏览器用虚拟化技术上了内存保护。

结局:
随后你决定,先学习C语言,再学习写WINDOWS驱动,然后学习“微软不鼓励的歪门邪道技术”SHADOW SSDT HOOK。
然后你发现,从WINDOWS 8开始,SHADOW SSDT已经被PatchGuard保护了,然后你会学习怎么过PatchGuard。
随着越学越多,你最终会成为WINDOWS驱动大牛。蓦然回首,你才想起你一开始只是想用VB6来HOOK一些窗口API而已。

YY菌 发表于 2024-3-11 19:19:22

美俪女神 发表于 2024-3-11 18:33
看到你的帖子有点感慨,仿佛看到了15年前的自己。当年的我就很纠结这个问题。

VB6搞全局钩子是不现实的, ...

再补充一个,等它把x86的HOOK学完了之后,又发现Windows还有Arm版的系统,Arm版Windows同样也还要再分32位和64位,然后Arm64还被巨硬搞成了三个版本(一个纯Arm64,一个跟x64相互兼容的Arm64EC,一个同时兼容Arm64和Arm64EC的ArmX):lol

Nicol 发表于 2024-3-11 21:32:08

美俪女神 发表于 2024-3-11 18:33
看到你的帖子有点感慨,仿佛看到了15年前的自己。当年的我就很纠结这个问题。

VB6搞全局钩子是不现实的, ...

看来大佬已经解决了。能给我抄抄不……

Nicol 发表于 2024-3-11 21:33:09

YY菌 发表于 2024-3-11 19:19
再补充一个,等它把x86的HOOK学完了之后,又发现Windows还有Arm版的系统,Arm版Windows同样也还要再分32 ...

大佬,是他不是它

Nicol 发表于 2024-3-11 21:36:31

美俪女神 发表于 2024-3-11 18:33
看到你的帖子有点感慨,仿佛看到了15年前的自己。当年的我就很纠结这个问题。

VB6搞全局钩子是不现实的, ...

2、把DLL注入到目标进程里,需要同时支持32位和64位进程。
这句是什么意思,意思是分别用32位程序和64位去注入吗?

美俪女神 发表于 2024-3-12 16:54:03

YY菌 发表于 2024-3-11 19:19
再补充一个,等它把x86的HOOK学完了之后,又发现Windows还有Arm版的系统,Arm版Windows同样也还要再分32 ...

具体什么体系架构无所谓的,这些东西一通百通。

重点在于,楼主想要解决的问题,看似简单,实际上是一个万丈深坑。

就好比,枪没什么复杂的零件和原理,就是几片金属合在一起而已。但哪怕只是手搓一把单发的滑膛枪,你都至少要懂:建模(电脑),金属加工或铸造(工程),受力分析(物理),火药制作(化学)。上面提到的每一个点都是一个大坑,不是一两天就能学会的。

美俪女神 发表于 2024-3-12 17:00:11

Nicol 发表于 2024-3-11 21:36
2、把DLL注入到目标进程里,需要同时支持32位和64位进程。
这句是什么意思,意思是分别用32位程序和64位 ...

如果你想在32位进程里直接给64位进程注入DLL,需要懂得调用NTDLL64的函数。推荐阅读《Mixing x86 with x64 code》。

我想说的是,这里面涉及到WINDOWS核心编程的内容,跟VB6几乎无关,是个万丈深坑,不要指望别人点播你一两句话就能解决问题。

最简单的技术路线至少是:学会C语言 --> 了解WINDOWS内核基本原理和架构 --> 了解X86和X86-64汇编语言基础知识 --> 学会使用反汇编引擎 --> 学会写Inline Hook --> 学会在WOW64程序里调用NTDLL64的API。

然而正如我之前说的,即使你把上面的代码都写出来了,你会无奈地发现,很多进程根本不让你注入(或注入无效),然后你就会愤而学习WINDOWS驱动开发。:lol
页: [1] 2
查看完整版本: 没有人讨论VB6的全局钩子吗?