微信HOOK 从撤回消息深度剖析微信的一些设计理念

12 篇文章 19 订阅
11 篇文章 4 订阅

很久没有发博文了,也是因为最近没有什么值得讲的,近日有了一些所得,便发出来和大家分享
首先是关于微信协议,以往的协议虽有缺陷,但总体还是可以做一些项目业务的,自微信8.0以来,协议几乎处于不可用状态,以往的一些项目也中断,建议大家逐渐脱离协议,协议的存在会让项目的稳定性十分脆弱
在这里插入图片描述
说完了协议,下面就是本片博文的重点了—微信HOOK

前些天因为客户的一个需求,我深入研究了撤回消息的一些操作
常规步骤分为两步
其1.HOOK微信发送消息的消息ID,定位到了消息ID才能正确指引微信要撤回
具体的哪条消息
其2.执行撤回命令的CALL,参数分别为WXID和消息ID

以上就是正常情况下的微信撤回操作了,当然博文不可能到此为止,不然我也不会单独发出来了
因为客户的一些需求,我需要实现的撤回操作不允许本地有提示,也不能撤回本地的聊天,但其他人的微信中,这条消息是正常撤回的

简而言之,就是我撤回了一条消息,但我这边没有任何提示和反应,其他人的微信却能看到正常的撤回消息

基于这个需求,我就开始思考实现方法了
众所周知,但凡通讯软件,都是要和服务器通讯的,然后由服务器进行处理分发
具体到撤回操作就是,发送撤回命令给服务器→服务器处理命令→处理结果回调给微信客户端
在这里插入图片描述
明白了这些,我们的思路就逐渐清晰了,想要真的撤回消息,又不显示出来,只能在服务器运算处理完成之后进行操作
因此我找到了微信接收撤回命令回调的区域,将此回调的消息ID随便改了个其他的数
到这里我想结果应该就完成了,回调的消息ID错误之后,本地的消息就不会被撤回,事情完成了

然而令人没有想到的是,微信的对撤回消息的回调还有一个单独的校验,当撤回正常时,客户端会向服务器发送一个已正常撤回的反馈,服务器确认后这事才算完
但是我们改动了消息ID,撤回失败了,成功撤回的反馈当然就没有了,然后服务器就不停的向本地客户端回调,到这里我就开始逐渐头大了

不过此事也算是我思考的过于简单了,撤回消息作为一个需要准确验证的功能,对他的回调结果再做一个校验也不足为奇

此事的最终结局当然也是我成功的搞定了回调结果的校验,不过收获也是蛮多的,一个真正的HOOK高手,不仅要有过硬的技术,还要有严谨,正确的思考逻辑,只有你能把这一个功能完善的写出来,你才能信手拈来的HOOK它

这篇博文算是比较冷门的功能,想要了解一些常用的微信HOOK功能请观看我的其他博文

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 很抱歉,作为AI语言模型,我不能提供关于微信hook发送视频号消息的代码。这种行为可能会违反微信的使用协议,也可能会对其他用户造成不必要的麻烦和风险。建议您遵守微信的规定和原则,保持良好的网络行为和安全意识。 ### 回答2: 微信hook发送视频号消息的代码可以参考如下: ```python import frida def on_message(message, data): if message['type'] == 'send': payload = message['payload'] if 'message' in payload and 'mp_video_xml' in payload['message']: # 提取视频号的XML数据 mp_video_xml = payload['message']['mp_video_xml'] # 在此对视频号消息进行处理或记录 print(mp_video_xml) # 启动Frida session = frida.get_usb_device().attach('WeChat') # 加载JavaScript脚本 js_code = """ function hookSendMessage() { // 寻找消息发送的入口 var sendMessage = Module.findExportByName("WeChat", "SendMessage") if (sendMessage) { console.log("SendMessage address: " + sendMessage) // hook发送消息的函数 Interceptor.attach(sendMessage, { onEnter: function (args) { // 提取消息内容 var xmlBuffer = args[1] var xmlData = xmlBuffer.readCString() // 解析XML数据 var xmlDoc = new XMLDocument(xmlData) var messageNode = xmlDoc.getRootNode() var messageType = messageNode.getAttribute("datatype") if (messageType == "47") { var mpVideoXml = messageNode.getNodeByName("wxv") send({message: {mp_video_xml: mpVideoXml}}) } } }) } } // 调用函数进行hook hookSendMessage() """ script = session.create_script(js_code) script.on('message', on_message) script.load() ``` 上述代码使用了Frida来进行hook操作,通过hooking WeChat的SendMessage函数,获取发送消息的XML数据,从中解析出视频号消息的XML字段`wxv`,并进行处理或记录。 注意,此代码只是演示了hook操作的基本原理,具体实现还需要结合微信的实际运行环境来进行调试和适配。 ### 回答3: 要实现微信hook发送视频号消息的代码,需要借助一些工具和技术。下面是一个基本的 Python 代码示例: ```python import frida def on_message(message, data): if message['type'] == 'send': if 'video' in message['payload']: video_url = message['payload']['video'] # 在这里可以对视频链接进行处理,比如下载到本地或者转发给其他用户 print(f"收到视频链接:{video_url}") def hook_wechat_send_video(): # 获取微信进程 session = frida.attach("com.tencent.mm") # 读取 JavaScript hooking 脚本 with open("hook_wechat_send_video.js", "r") as f: hook_script = f.read() # 加载 JavaScript hooking 脚本 script = session.create_script(hook_script) # 设置消息回调函数 script.on("message", on_message) # 运行 JavaScript hooking 脚本 script.load() # 保持脚本持续运行 frida.resume(pid) # 执行 Hook hook_wechat_send_video() # 保持主线程运行 while True: pass ``` 上述代码中,我们使用了 `frida` 这个 Python 包来实现与手机应用的通信和 hook 功能。通过运行 `hook_wechat_send_video()` 函数,首先获取微信应用进程,然后加载 JavaScript hooking 脚本。在回调函数 `on_message()` 中,我们可以对接收到的视频链接进行任意处理,比如打印、下载或转发给其他用户。最后,保持主线程运行以保证持续监听微信应用的消息。 请注意,以上代码只是提供一个示例,并不能直接运行,因为具体的 hook 逻辑需要写在 JavaScript 脚本 `hook_wechat_send_video.js` 中,并且需要根据具体的微信版本和手机操作系统进行适配。对于较新版本的微信可能需要更高级的 hook 技术,同时需要越狱或者 root 权限。因此,如果需要实现微信 hook 功能,建议参考专业的 hook 工具和文档,并遵守法律和道德规范。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值