前言
主要思路是在VX代码中撤回消息函数将撤回的消息和撤回的消息提示当做参数压栈,我们只需要hook这个撤回消息的函数即可在栈中得到我们想要的信息。要hook这个撤回消息的函数我们就需要获得以下关键信息:
调用关键call的相对地址
关键call下一条汇编指令的相对地址
要hook函数的相对地址(即关键call的相对地址)
调用关键call时,撤回信息和撤回提示相对ESP的栈位置
因为地址随机化原因这个关键函数的地址会变化的,但是它相对于其dll模块的位置是不会发生变化,所以我们只需要获得他的相对地址,再在代码中动态获取dll模块的基地址,两者相加即可得到函数在虚拟内存中的地址,再通过dll注入到vx就可以修改他的代码从而实现hook
本文将讨论如何获得这些关键信息
使用工具
- OD
- CE
CE
使用CE附加到VX

发送一条消息

选择Value Type 为 String,并勾选UTF-16

撤回消息后,找到值变为<revok(这个是撤回消息的提示内容),这个就是存储本次会话消息的内存地址(042BF650):

OD动态调试
使用OD附加到VX:

使用dd 042BF650,跟踪到数据窗口:

下一个内存写入断点

发送消息再撤回,发送消息也会在这段内存中断下来所以请先将其放行,在撤回处断下:
观察栈的变化,这里我是两次F9后看到了关键信息,就是撤回消息的提示和撤回的内容

在 WeChatWi.56BA6F9A 中我们的关键信息压栈了,在反汇编窗口跟随这个Call

下面是call WeChatWi.56BA6F9A的两条汇编指令
55EFD358 E8 3D9CCA00 call WeChatWi.56BA6F9A
55EFD35D 8B07 mov eax,dword ptr ds:[edi]
在call WeChatWi.56BA6F9A处下断点(暂时设置为禁用),并删除上面设置的内存断点(避免干扰调试)
重新发送消息并且撤回,在撤回消息时启用F2断点,观察栈上的数据直到出现我们想要的关键数据。(这里可能出现程序崩溃的情况请多次尝试),在多次F9后看见如下关键信息:

esp + 0x0 :撤回消息的内容
esp + 0x4 : 撤回消息的提示
call WeChatWi.56BA6F9A 调用的是WeChatWi.dll的函数,我们在可以在od中看到WeChatWi.dll模块的基址为559D0000

计算出call指令和其下一条指令的相对地址(hook时需要用到,基址都会变所以我们要用到相对地址):
call WeChatWi.56BA6F9A的相对地址:55EFD358 - 559D0000 = 52 D358
mov eax,dword ptr ds:[edi]的相对地址:55EFD35D - 559D0000 = 52 D35D
要hook函数的相对地址(也就是关键call的相对地址):56BA6F9A - 559D0000 = 11D 6F9A
尾言
至此我们就拿到了我们需要的关键信息,分别为:
调用关键call的相对地址
关键call下一条汇编指令的相对地址
要hook函数的相对地址(即关键call的相对地址)
调用关键call时,撤回信息和撤回提示相对ESP的栈位置
网友评论