PC微信hook

      钩子(Hook)是Windows消息处理机制的一个要点(Point)。应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。同DOS中断截获处理机制类似,应用程序可以在钩子上设置多个钩子函数,由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)。当钩子所监视的消息出现时,Windows首先将其送到调用链表中所指向的第一个钩子函数中,钩子函数将根据其各自的功能对消息进行监视、修改和控制,并在处理完成后把消息传递给下一钩子函数直至到达钩子链表的末尾。在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数。虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成

hook的作用

HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOK TextOut()或ExtTextOut()这两个函数实现的,在操作系统用这两个函数输出文本之前,就把相应的英文替换成中文而达到即时翻译;IFS和NDIS过滤也是如此,在读写磁盘和收发数据之前,系统会调用第三方提供的回调函数来判断操作是否可以放行,它与普通HOOK不同,它是操作系统允许的,由操作系统提供接口来安装回调函数。 

甚至如果没有HOOK,就没有病毒,因为不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系统服务来实现自己的功能的:DOS下的病毒靠HOOK INT 21来感染文件(文件型病毒),靠HOOK INT 13来感染引导扇区引导型病毒);WINDOWS下的病毒靠HOOK系统API(包括RING0层的和RING3层的),或者安装IFS(CIH病毒所用的方法)来感染文件。因此可以说“没有HOOK,就没有今天多姿多彩的软件世界”。 

由于涉及到专利和知识产权,或者是商业机密,微软一直不提倡大家HOOK它的系统API,提供IFS和NDIS等其他过滤接口,也是为了适应杀毒软件和防火墙的需要才开放的。所以在大多数时候,HOOK API要靠自己的力量来完成。 

HOOK API有一个原则,这个原则就是:被HOOK的API的原有功能不能受到任何影响。就象医生救人,如果把病人身体里的病毒杀死了,病人也死了,那么这个“救人”就没有任何意义了。如果你HOOK API之后,你的目的达到了,但API的原有功能失效了,这样不是HOOK,而是REPLACE,操作系统的正常功能就会受到影响,甚至会崩溃。 

HOOK API的技术,说起来也不复杂,就是改变程序流程的技术。在CPU的指令里,有几条指令可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。理论上只要改变API入口和出口的任何机器码,都可以HOOK,但是实际实现起来要复杂很多,因为要处理好以下问题: 

1,CPU指令长度问题,在32位系统里,一条JMP/CALL指令的长度是5个字节,因此你只有替换API里超过5个字节长度的机器码(或者替换几条指令长度加起来是5字节的指令),否则会影响被更改的小于5个字节的机器码后面的数条指令,甚至程序流程会被打乱,产生不可预料的后果; 

2,参数问题,为了访问原API的参数,你要通过EBP或ESP来引用参数,因此你要非常清楚你的HOOK代码里此时的EBP/ESP的值是多少; 

3,时机的问题,有些HOOK必须在API的开头,有些必须在API的尾部,比如HOOK CreateFilaA(),如果你在API尾部HOOK API,那么此时你就不能写文件,甚至不能访问文件;HOOK RECV(),如果你在API头HOOK,此时还没有收到数据,你就去查看RECV()的接收缓冲区,里面当然没有你想要的数据,必须等RECV()正常执行后,在RECV()的尾部HOOK,此时去查看RECV()的缓冲区,里面才有想要的数据; 

4,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了; 

5,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要; 

6,最后要注意的是,被替换的CPU指令的原有功能一定要在HOOK代码的某个地方模拟实现。 

下面以ws2_32.dll里的send()为例子来说明如何HOOK这个函数: 

Exported fn(): send - Ord:0013h 

地址 机器码 汇编代码 

:71A21AF4 55 push ebp //将被HOOK的机器码(第1种方法) 

:71A21AF5 8BEC mov ebp, esp //将被HOOK的机器码(第2种方法) 

:71A21AF7 83EC10 sub esp, 00000010 

:71A21AFA 56 push esi 

:71A21AFB 57 push edi 

:71A21AFC 33FF xor edi, edi 

:71A21AFE 813D1C20A371931CA271 cmp dword ptr [71A3201C], 71A21C93 //将被HOOK的机器码(第4种方法) 

:71A21B08 0F84853D0000 je 71A25893 

:71A21B0E 8D45F8 lea eax, dword ptr [ebp-08] 

:71A21B11 50 push eax 

:71A21B12 E869F7FFFF call 71A21280 

:71A21B17 3BC7 cmp eax, edi 

:71A21B19 8945FC mov dword ptr [ebp-04], eax 

:71A21B1C 0F85C4940000 jne 71A2AFE6 

:71A21B22 FF7508 push [ebp+08] 

:71A21B25 E826F7FFFF call 71A21250 

:71A21B2A 8BF0 mov esi, eax 

:71A21B2C 3BF7 cmp esi, edi 

:71A21B2E 0F84AB940000 je 71A2AFDF 

:71A21B34 8B4510 mov eax, dword ptr [ebp+10] 

:71A21B37 53 push ebx 

:71A21B38 8D4DFC lea ecx, dword ptr [ebp-04] 

:71A21B3B 51 push ecx 

:71A21B3C FF75F8 push [ebp-08] 

:71A21B3F 8D4D08 lea ecx, dword ptr [ebp+08] 

:71A21B42 57 push edi 

:71A21B43 57 push edi 

:71A21B44 FF7514 push [ebp+14] 

:71A21B47 8945F0 mov dword ptr [ebp-10], eax 

:71A21B4A 8B450C mov eax, dword ptr [ebp+0C] 

:71A21B4D 51 push ecx 

:71A21B4E 6A01 push 00000001 

:71A21B50 8D4DF0 lea ecx, dword ptr [ebp-10] 

:71A21B53 51 push ecx 

:71A21B54 FF7508 push [ebp+08] 

:71A21B57 8945F4 mov dword ptr [ebp-0C], eax 

:71A21B5A 8B460C mov eax, dword ptr [esi+0C] 

:71A21B5D FF5064 call [eax+64] 

:71A21B60 8BCE mov ecx, esi 

:71A21B62 8BD8 mov ebx, eax 

:71A21B64 E8C7F6FFFF call 71A21230 //将被HOOK的机器码(第3种方法) 

:71A21B69 3BDF cmp ebx, edi 

:71A21B6B 5B pop ebx 

:71A21B6C 0F855F940000 jne 71A2AFD1 

:71A21B72 8B4508 mov eax, dword ptr [ebp+08] 

:71A21B75 5F pop edi 

:71A21B76 5E pop esi 

:71A21B77 C9 leave 

:71A21B78 C21000 ret 0010 

下面用4种方法来HOOK这个API: 

1,把API入口的第一条指令是PUSH EBP指令(机器码0x55)替换成INT 3(机器码0xcc),然后用WINDOWS提供的调试函数来执行自己的代码,这中方法被SOFT ICE等DEBUGER广泛采用,它就是通过BPX在相应的地方设一条INT 3指令来下断点的。但是不提倡用这种方法,因为它会与WINDOWS或调试工具产生冲突,而汇编代码基本都要调试; 

2,把第二条mov ebp,esp指令(机器码8BEC,2字节)替换为INT F0指令(机器码CDF0),然后在IDT里设置一个中断门,指向我们的代码。我这里给出一个HOOK代码: 

lea ebp,[esp+12] //模拟原指令mov ebp,esp的功能 

pushfd //保存现场 

pushad //保存现场 

//在这里做你想做的事情 

popad //恢复现场 

popfd //恢复现场 

iretd //返回原指令的下一条指令继续执行原函数(71A21AF7地址处) 

这种方法很好,但缺点是要在IDT设置一个中断门,也就是要进RING0。 

3,更改CALL指令的相对地址(CALL分别在71A21B12、71A21B25、71A21B64,但前面2条CALL之前有一个条件跳转指令,有可能不被执行到,因此我们要HOOK 71A21B64处的CALL指令)。为什么要找CALL指令下手?因为它们都是5字节的指令,而且都是CALL指令,只要保持操作码0xE8不变,改变后面的相对地址就可以转到我们的HOOK代码去执行了,在我们的HOOK代码后面再转到目标地址去执行。 

假设我们的HOOK代码在71A20400处,那么我们把71A21B64处的CALL指令改为CALL 71A20400(原指令是这样的:CALL 71A21230) 

而71A20400处的HOOK代码是这样的: 

71A20400: 

pushad 

//在这里做你想做的事情 

popad 

jmp 71A21230 //跳转到原CALL指令的目标地址,原指令是这样的:call 71A21230 

这种方法隐蔽性很好,但是比较难找这条5字节的CALL指令,计算相对地址也复杂。 

4,替换71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(机器码:813D1C20A371931CA271,10字节)成为 

call 71A20400 

nop 

nop 

nop 

nop 

nop 

(机器码:E8 XX XX XX XX 90 90 90 90 90,10字节) 

在71A20400的HOOK代码是: 

pushad 

mov edx,71A3201Ch //模拟原指令cmp dword ptr [71A3201C], 71A21C93 

cmp dword ptr [edx],71A21C93h //模拟原指令cmp dword ptr [71A3201C], 71A21C93 

pushfd 

//在这里做你想做的事 

popfd 

popad 

ret 

这种方法隐蔽性最好,但不是每个API都有这样的指令,要具体情况具体操作。 

以上几种方法是常用的方法,值得一提的是很多人都是改API开头的5个字节,但是现在很多杀毒软件用这样的方法检查API是否被HOOK,或其他病毒木马在你之后又改了前5个字节,这样就会互相覆盖,最后一个HOOK API的操作才是有效的,所以提倡用第3和第4种方法。

希望可以帮到有需要的朋友

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python钩子微信是一种使用Python编程语言编写的程序,用于检测和捕获微信应用程序的输入和输出,并进行处理和操作。该程序可以用于自动发送和接收微信消息,拦截和修改微信消息,获取微信用户信息以及实现其他自定义功能。要实现Python钩子微信,需要了解微信应用程序的工作原理和API,以及Python的基本编程知识和技能。在编写程序时,需要使用第三方库和工具,例如itchat、pymouse、pyHook等。通过这些工具,可以轻松地编写Python钩子微信程序,并实现自己想要的功能。但是需要注意,在编写程序时,应遵守微信的相关规定和条例,不得用于非法或未经授权的用途。除此之外,在编写钩子程序时,还应注意安全问题,避免损坏计算机系统或容易出现安全漏洞。总之,Python钩子微信是实现微信自定义功能的一种有效方法,但需要在充分了解微信API和Python编程基础的基础上进行。 ### 回答2: Python hook PC微信,也就是通过Python程序来对PC版的微信进行一些自定义的操作。首先需要了解的是,PC微信是一个Windows平台的桌面应用程序,而Python是一种高级编程语言,可以通过一些模块和库来实现对PC微信的控制和管理。 要实现钩取(hookPC微信,需要使用到相关的模块和包,比如pyHook、keyboard、ctypes等。其中,pyHook是一个Python钩子模块,它可以捕获各种Windows事件,如键盘鼠标事件等。而keyboard则是另一个Python模块,它也可以用于监测和记录键盘事件。最后,ctypes是一个Python模块,用于调用或操作Windows中的DLL、API以及C的库。 钩取PC微信主要可以实现以下几个方面: 1. 监测和记录键盘事件 通过使用pyHook、keyboard等模块,可以在Python程序中监测和记录PC微信中的各种键盘事件,比如输入字符、快捷键等。这可以方便地实现自动回复、自动切换聊天窗口等功能。 2. 控制和管理PC微信窗口 通过使用ctypes,在Python程序中可以调用Windows API函数,比如FindWindow、SetWindowPos等,来实现对PC微信窗口的控制和管理,比如改变窗口大小、位置,最小化窗口等。 3. 实现自动化脚本 通过以上两个方面的应用,可以实现对PC微信的自动化控制和管理。比如可以编写Python脚本,使其自动监测PC微信中的消息,自动回复、发送消息,或者进行一些其他操作等。 总之,Python hook PC微信可以为我们带来很多便利和效率,在实际应用中也有很多种可能,比如在聊天机器人、自动化聊天、消息推送等方面都有着广泛的应用。 ### 回答3: Python Hook PC微信,简单来说就是使用Python编写程序完成对PC微信软件的钩子(hook)功能。钩子是一种编程技术,可以监视计算机的特定活动,并在特定事件发生时触发自定义功能。 对于PC微信软件而言,可能存在一些无法实现的需求,或者需要对其界面进行改进等情况。这时,我们可以使用Python编写程序,来完成对微信软件的钩子,实现我们想要的效果。 具体来说,Python Hook PC微信可以通过以下步骤实现: 1. 导入Python的ctypes库,用于调用Windows的API函数。 2. 使用WinAPI获取微信的句柄(handle),并将其与Python中的句柄绑定。 3. 使用WinAPI获取微信窗口中的各种控件,包括菜单、列表、文本框、按钮等。 4. 对这些控件进行钩子操作,比如监控鼠标和键盘事件,或者改变控件的样式、位置、大小等。 5. 根据需要编写自己的功能,比如监听微信收到新消息的通知,自动回复消息,或者改变接收到的消息格式等。 需要注意的是,钩子的实现需要一定的编程技巧和经验,同时也具有一定的安全风险。在实际编写过程中,应当按照规范操作,避免对微信软件及其用户造成损害。此外,Python Hook PC微信也有一定的局限性,可能会受到微信版本升级、系统环境变化、安全策略影响等问题。因此,我们需要在编写程序前进行足够的研究和测试,以确保可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值