frida hook微信防撤回(PC端)

PC端:

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

直接进IDA分析

都没有符号表

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

也是有非常多的字符串

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

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

#wecaht_hook
import frida
import sys

def 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 #pid
    main(target_process)
'''
WeChatWin.dll baseAddr: 0x7ffb6d8e0000
Process attatched successfully!
'''

任务管理器可以查看pid

成功回显

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

这是IDA中的基地址0x180000000

#wecaht_hook
import frida
import sys

def 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 = 15964
    main(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 sys

def 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 = 15964
    main(target_process)

撤回的消息就被固定了!

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

这部分指令NOP掉也行

参考:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/696446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识volatile

volatile:可见性、不能保证原子性(数据不安全)、禁止指令重排 可见性:多线程修改共享内存的变量的时候,修改后会通知其他线程修改后的值,此时其他线程可以读取到修改后变量的值。 指令重排:源代码的代码顺序与编译后字…

【学习】DCMM认证提升企业竞争优势的表现

DCMM认证是企业提升数据管理能力的重要途径。它不仅可以帮助企业评估自身的数据管理水平,还可以为企业提供改进的方向和目标。在数字化时代,拥有强大的数据管理能力是企业成功的关键。因此,通过DCMM认证,企业可以更好地适应数字化…

ARM交叉编译

目录 一、介绍 1、本地编译 2、交叉编译 二、交叉工具链 1、概念 2、工具 3、获取方法 三、交叉编译运行程序 1、pc机操作(x86_64) ​2、开发板操作(ARM) 一、介绍 1、本地编译 本地编译是在与目标运行环境相同的机器上…

大模型训练的艺术:从预训练到增强学习的四阶段之旅

文章目录 大模型训练的艺术:从预训练到增强学习的四阶段之旅1. 预训练阶段(Pretraining)2. 监督微调阶段(Supervised Finetuning, SFT)3. 奖励模型训练阶段(Reward Modeling)4. 增强学习微调阶段…

FreeRTOS消息队列

消息队列简介 队列是为了任务与任务、 任务与中断之间的通信而准备的, 可以在任务与任务、 任务与中断之间传递消息, 队列中可以存储有限的、 大小固定的数据项目。任务与任务、 任务与中断之间要交流的数据保存在队列中, 叫做队列项目。 队…

【博士每天一篇文献-综述】Modularity in Deep Learning A Survey

阅读时间:2023-12-8 1 介绍 年份:2023 作者:孙浩哲,布朗克斯医疗卫生系统 会议: Science and Information Conference 引用量:4 论文主要探讨了深度学习中的模块化(modularity)概念…

ROS学习记录:C++节点发布自定义地图

前言 ROS栅格地图格式 在了解了ROS地图消息包的数据结构后(链接在上),本文将编写一个节点,发布地图消息包,看看在RViz中显示是什么效果。 一、准备 1、为了简单起见,发布一个两行四列的地图 2、为了便于观测,只对地…

沐风老师3DMAX一键多孔结构建模插件Porous使用方法

​3DMAX一键多孔结构建模插件Porous使用教程 3dMax是大家熟知的3D建模软件之一,其功能非常的强大,在科研绘图领域有着非常广泛的应用,但是由于科研绘图的图形(模型)一般都属于异形结构,手工绘制建模&#x…

Seq2seq、编码器解码器神经网络

目录 一、Seq2seq 简介二、编码器三、解码器四、编码器-解码器的训练 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 需掌握的前提知识: LSTM、词嵌入 本文参考:【官方双语】编码、解码神经网…

人类记忆优化算法:针对全局优化问题的记忆启发优化器

Human memory optimization algorithm: A memory-inspired optimizer for global optimization problems 24年 Expert Systems With Applications sci一区 原文链接: https://doi.org/10.1016/j.eswa.2023.121597 Zhu D, Wang S, Zhou C, et al. Human memory optimization alg…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

🚀时空传送门 🔍引言📕GPT-4概述🌹机器学习在GPT-4中的应用🚆文本生成与摘要🎈文献综述与知识图谱构建🚲情感分析与文本分类🚀搜索引擎优化💴智能客服与虚拟助手&#x1…

Web--CSS基础

文章目录 定义方式选择器文本字体背景边框元素展示格式内边距与外边距盒子模型位置浮动flex布局响应式布局 定义方式 行内样式表 直接定义在style属性中&#xff0c;作用于当前标签 <img src "/imges/logo.jpg" alt "" style "width 400"…

时钟影响ADC性能不仅仅是抖动

时钟影响ADC性能除了抖动&#xff0c;还有占空比。 在高速AD采样中&#xff0c;时钟占空比是非常重要的一个参数。时钟信号的上升沿控制ADC的采样&#xff0c;而下降沿控制着信号的保持&#xff0c;在一个周期内才可以完成量化输出&#xff0c;所以必须保持时钟的占空比为50%&…

自动化决策和业务流程类控制的系统前端UI设计开发

自动化决策和业务流程类控制的系统前端UI设计开发

NLP——电影评论情感分析

python-tensorflow2.0 numpy 1.19.1 tensorflow 2.0.0 导入库 数据加载 数据处理 构建模型 训练 评估 预测 1.基于2层dropout神经网络 2.基于LSTM的网络 #导入需要用到的库 import os import tarfile import urllib. request import tensorflow as tf import numpy a…

使用Python批量处理Excel的内容

正文共&#xff1a;1500 字 10 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在前面的文章中&#xff08;如何使用Python提取Excel中固定单元格的内容&#xff09;&#xff0c;我们介绍了如何安装Python环境和PyCharm工具&#xff0c;还利用搭好的环境简单测试了一下ChatGPT提…

小程序名片怎么生成?AI名片生成器源码系统 为企业店铺创建自己的数字名片

在数字化时代&#xff0c;小程序名片已经成为企业店铺展示自身形象、推广产品和服务的重要工具。分享一个AI名片生成器源码系统春哥AI雷达智能名片小程序系统企业商业运营版&#xff0c;含完整代码包和详细的图文安装部署搭建教程&#xff0c;新手也能轻松使用&#xff0c;源码…

MySQL: 索引与事务

文章目录 1. 索引 (Index)1.1 概念1.2 作用1.3 使用场景1.4 索引的使用1.5 索引的使用案例 (不要轻易尝试)1.6 索引背后的数据结构1.7 重点总结 2.事务2.1 为什么要使用事务2.2 事务的概念2.3 事务的使用2.4 对事务的理解2.5 事务的基本特性 1. 索引 (Index) 1.1 概念 索引是…

Python Requests库详解

大家好&#xff0c;在现代网络开发中&#xff0c;与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言&#xff0c;提供了各种工具和库来简化这一过程。其中&#xff0c;Requests库作为Python中最受欢迎的HTTP库之一&#xff0c;为开发人员提供了简单而…

12-Gateway网关-网关作用介绍

12-Gateway网关-网关作用介绍 1.为什么需要网关&#xff1a; 网关功能&#xff1a; ​ 1.身份认证和权限校验 ​ 2.服务路由、负载均衡 ​ 3.请求限流 2.网关的技术实现&#xff1a; 在SpringCloud中网关的实现包括两种“ ​ gateway ​ zuul Zuul是基于Servlet的实…