220712 Hook了解一二
1、
钩子(Hook)是Windows消息处理机制的一个要点(Point)。应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。同DOS中断截获处理机制类似,应用程序可以在钩子上设置多个钩子函数,由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)。当钩子所监视的消息出现时,Windows首先将其送到调用链表中所指向的第一个钩子函数中,钩子函数将根据其各自的功能对消息进行监视、修改和控制,并在处理完成后把消息传递给下一钩子函数直至到达钩子链表的末尾。在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数。虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成。
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代码的某个地方模拟实现。
(参考链接:https://blog.csdn.net/q2243088760/article/details/123521145)
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。(参考链接:https://blog.csdn.net/liangzixx/article/details/105427776)
2、
在网上看了下,“PC微信HOOK逆向”是破解微信通讯的问题关键词,其他的类似于“python爬虫JS逆向”是破解js加密接口的相关搜索。在网上看了下,“cheat engine”软件是寻找对应通讯基址的内存修改软件,还未学会使用方法。另有一个OllyDbg软件,是调试基址的动态追踪工具,使用还不会,大概思路是根据两个工具逆向出来的关键数据基址偏移量,找出处理语音或文字消息的关键函数,用hook调用该函数内容并处理(参考链接:https://mp.weixin.qq.com/s?__biz=MzI1NTUzMjUzMQ==&mid=2247483883&idx=1&sn=c36d8053960258bd67fe5ca2370e0174&scene=21#wechat_redirect)。
看了下也许微信基址寻找与PC微信注入,用C++比较合适,准备抽时间学习下C++语法,可以模仿的项目有:https://github.com/chengciming/wechatPc与https://github.com/anhkgg/SuperWeChatPC/tree/master/src/WeChatSDKCore。
3、
看大佬解释:3A地址转换: 即VA 、RVA 、FOA(虚拟地址/相对虚拟地址/文件偏移地址),这个对于汇编工具来说极其重要的东西,比如你用HIEW/W32dasm/IDA/2进制忍者/Ollydbg/MDebug,16进制编辑器。你第一步得整明白,谁对应谁吧?这就好比问你家住哪里?虚拟地址? 好比说,某某小区xx地址,相对虚拟地址?好比说吾爱破解大楼对过的。文件偏移地址?中国天津塘沽区xx。。。。这样能更好的理解了吧?这里涉及到汇编语言。就好比另一个文章中用x64dbg调试将je语句调试改完jmp,实现了防撤回功能(参考链接:https://www.cnblogs.com/meowv/p/11428772.html),看了下应该是汇编语言的修改,还需要确认。经搜索确认,jmp指令和loop指令是汇编语言中无条件跳转指令与计数器循环指令,还需要继续学习。
具体x64dbg工具使用方法:https://zhuanlan.zhihu.com/p/146121094。
查找微信消息收发地址的具体方法和步骤,可以参考:https://guishou.blog.csdn.net/article/details/93339861?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3-93339861-blog-107577537.pc_relevant_multi_platform_whitelistv2_ad_hc&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3-93339861-blog-107577537.pc_relevant_multi_platform_whitelistv2_ad_hc&utm_relevant_index=5