当前位置: 首页 > news >正文

frida hook微信防撤回(PC端)

PC端:

微信的主要功能都是在WeChat\[3.9.10.27]\WeChatWin.dll动态链接库中实现的

直接进IDA分析

都没有符号表

我们需要找一下实现撤回功能的函数,尝试在字符串里搜索revokeMsg

也是有非常多的字符串

我们需要用frida来hook这些字符串来找出撤回实际调用的函数

先初步写一个脚本找到WeChatWin.dll的基地址

#wecaht_hook
import frida
import sysdef main(target_process):session = frida.attach(target_process)jsCode = """//找WeChatWin.dll映射到内存的根地址const baseAddr = Module.findBaseAddress('WeChatWin.dll');console.log("WeChatWin.dll baseAddr: " + baseAddr);"""#js脚本控制注入逻辑script = session.create_script(jsCode)script.load() #加载脚本print("Process attatched successfully!")sys.stdin.read() #持续执行if __name__=='__main__':target_process = 15964 #pidmain(target_process)
'''
WeChatWin.dll baseAddr: 0x7ffb6d8e0000
Process attatched successfully!
'''

任务管理器可以查看pid

成功回显

但是这里输出的地址是个装载之后的虚拟地址,要与ida中函数的地址对应,还需要进行一个转化

这是IDA中的基地址0x180000000

#wecaht_hook
import frida
import sysdef main(target_process):session = frida.attach(target_process)jsCode = """//找WeChatWin.dll映射到内存的根地址const baseAddr = Module.findBaseAddress('WeChatWin.dll');console.log("WeChatWin.dll baseAddr: " + baseAddr);const revokeMsgFunAddr = resolveAddress('0x1823CC870'); //测试的目标函数地址console.log('revokeMsgFunAddr: ' + revokeMsgFunAddr);Interceptor.attach(revokeMsgFunAddr, {//一旦进入地址的回调函数onEnter(args) {console.log('test!');}})//虚拟地址转化为实际内存地址function resolveAddress(addr) {const idaBase = ptr(0x180000000);const offset = ptr(addr).sub(idaBase); //偏移地址const result = baseAddr.add(offset);return result;}"""#js脚本控制注入逻辑script = session.create_script(jsCode)script.load() #加载脚本print("Process attatched successfully!")sys.stdin.read() #持续执行if __name__=='__main__':target_process = 15964main(target_process)

然后把这个脚本跑起来,用另一个号发消息并进行撤回操作,逐个函数进行尝试

调试到SyncMgr::ProcessRevokeMsg对应的函数时,有了回显

我们进相应的函数sub_1823CC870进行静态分析

发现多个分支都调用了sub_1826DA2D0函数,且之前的字符串也在其参数当中,这时候再去hook该函数0x1826DA2D0也是有回显的

那么只要跳过这个函数应该就不会撤回了

但是这个位置的if判断过于复杂(或),不容易跳过

那我们就看一下上一级的sub_1823CC870函数在哪里被调用

可以看到是sub_1823E4AD0函数

这里也可以hook一下,确认回显

转成伪代码会发现这里是一个switch语句,当v9==4时就会触发撤回的函数

很显然那是通过cmp edi, 4来比较

那就在这里注入0x1823E4CBA

我们把edi(64位对应的rdi)的值强行修改成不是4的值(这里改成0)

#wecaht_hook
import frida
import sysdef main(target_process):session = frida.attach(target_process)jsCode = """//找WeChatWin.dll映射到内存的根地址const baseAddr = Module.findBaseAddress('WeChatWin.dll');console.log("WeChatWin.dll baseAddr: " + baseAddr);const revokeMsgFunAddr = resolveAddress('0x1823E4CBA');console.log('revokeMsgFunAddr: ' + revokeMsgFunAddr);Interceptor.attach(revokeMsgFunAddr, {//一旦进入地址的回调函数onEnter(args) {console.log('called!');console.log("original rdi: " + this.context.rdi);this.context.rdi = 0;console.log("changed rdi: " + this.context.rdi);}})//虚拟地址转化为实际内存地址function resolveAddress(addr) {const idaBase = ptr(0x180000000);const offset = ptr(addr).sub(idaBase); //偏移地址const result = baseAddr.add(offset);return result;}"""#js脚本控制注入逻辑script = session.create_script(jsCode)script.load() #加载脚本print("Process attatched successfully!")sys.stdin.read() #持续执行if __name__=='__main__':target_process = 15964main(target_process)

撤回的消息就被固定了!

当然要在本地持续化利用,直接把dll里面的

这部分指令NOP掉也行

参考:

广东财经大学-信息安全-基于IDA Pro和Frida的微信消息撤回无效实验_哔哩哔哩_bilibili

[原创]hook 微信信息撤回功能-Android安全-看雪-安全社区|安全招聘|kanxue.com

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Rust-03-数据类型
  • 【前端】详解JavaScript事件代理(事件委托)
  • ---java 抽象类 和 接口---
  • 【设计模式】行为型设计模式之 迭代器模式
  • LeetCode 算法:合并区间c++
  • 封装了一个简单理解的iOS竖直文字轮播
  • k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
  • Wireshark TS | 应用传输丢包问题
  • No ‘ChromeSansMM’ font 错误解决
  • 渗透测试之内核安全系列课程:Rootkit技术初探(一)
  • vue面试题2-根据以下问题回答
  • ChatGP和kimi对比
  • Docker之路(三)docker安装nginx实现对springboot项目的负载均衡
  • Java 程序结构 -- Java 语言的变量、方法、运算符与注释
  • Apache Spark
  • ES6指北【2】—— 箭头函数
  • (三)从jvm层面了解线程的启动和停止
  • 0x05 Python数据分析,Anaconda八斩刀
  • 10个最佳ES6特性 ES7与ES8的特性
  • Elasticsearch 参考指南(升级前重新索引)
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SOFAMosn配置模型
  • Vue--数据传输
  • 从重复到重用
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • linux 淘宝开源监控工具tsar
  • 浅谈sql中的in与not in,exists与not exists的区别
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #QT(串口助手-界面)
  • #Z0458. 树的中心2
  • (1)bark-ml
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (阿里云万网)-域名注册购买实名流程
  • (二)pulsar安装在独立的docker中,python测试
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (六)Hibernate的二级缓存
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *1 计算机基础和操作系统基础及几大协议
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • ..回顾17,展望18
  • .Net 6.0 处理跨域的方式
  • .net core 依赖注入的基本用发
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET 给NuGet包添加Readme
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • :O)修改linux硬件时间
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ C++ ] STL---仿函数与priority_queue
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)