使用frida发送微信消息给好友

news2025/1/17 14:10:37

前言

之前说过怎么用python来发送微信文本消息,原理大概就是构造内存机器码。其实frida也可以做类似操作,构造数据和机器码,然后调用。我就不重复操作了,这里说下另一种方法。

想使用frida来发送消息这个想法很早之前就有了,只是搜了很久,一直没有frida在Windows端的操作,教程基本都是针对安卓的。

最早是在吾爱看到一篇使用frida来hook接收消息的函数,帖子看这里

我还在下面评论了下怎么用frida来发送消息,可惜没有回应,直到最近我看到一个教程(赵庆明老师的Frida快速入门/OD/CE/IDA/Python/TS/JS),链接就不放了,避免做广告的嫌疑,有兴趣的自己百度
在这里插入图片描述

准备工作

我假设你已经熟悉了frida的开发环境和使用,只讲一些关键思路

调用安卓的so函数,可以使用NativeFunction调用地址。但是 ,Windows相对于安卓而言,x86函数有多种调用约定,无法自动处理。我没有找到frida如何处理调用约定,再加上微信逆出来的函数,有些还不是标准的调用约定,也就是说很难在外部直接调用call,只能用汇编的形式来调用

那只能换一种思路来搜了,如何使用frida来写汇编,在x86平台用的是 x86writer

写汇编

比如用frida翻译一下发消息的函数
在这里插入图片描述
先分配一块内存地址,用来写汇编:

let m2 = Memory.alloc(Process.pageSize);

开始往内存地址里写入内容:

Memory.patchCode(m2, Process.pageSize, (code) => {
    console.log("code", code); 
    let asm = new X86Writer(code);
});

Memory.patchCode就是往地址里写入汇编代码的,第一个参数是内存地址,第二个参数是内存大小,第三个则是写入的函数 参数code就是m2

翻译上面的汇编:

  1. push edi
// putPushReg是push一个寄存器
asm.putPushReg('edi')
  1. lea eax, dword ptr ds:[wxNull]
    因为frida内置的lea只能将一个寄存器赋值给另一个寄存器,而这里是对地址操作,所以我这里用mov来赋值。按我的理解来看,这里应该需要先构造个指针,然后在mov给eax。但是测试发现这样操作居然报错了,直接将wxNull赋值给eax就没问题。
// let wxNull = Memory.alloc(0x100);
// let wxNullPointer = Memory.alloc(Process.pointerSize);
// wxNullPointer.writePointer(wxNull);
// asm.putMovRegAddress("eax", wxNullPointer);

let wxNull = Memory.alloc(0x100);
asm.putMovRegAddress("eax", wxNull );
  1. push 0x1
asm.putPushU32(0x1);
  1. mov edi, dword ptr ds:[pWxmsg]
    pWxmsg是个结构体,后面再看怎么赋值
asm.putMovRegAddress("edi", pWxmsg);
  1. push edi
asm.putPushReg('edi');
  1. lea edx, dword ptr ds:[wxWxid]
    正常也是应该赋值给一个指针再mov,也是报错,直接mov就没问题。可能是我理解的有问题,算了,能跑就行了
asm.putMovRegAddress('edx', wxWxid);
  1. lea ecx, dword ptr ds:[buffer]
let buffer = Memory.alloc(0x3B0);
asm.putMovRegAddress('ecx', buffer);
  1. call address
    版本还是用的上一篇python发消息里的版本。其他版本的偏移自己找下吧
let ModAddress = Process.getModuleByName('wechatwin.dll');
let callAddress = ModAddress.base.add('0x521D30');
asm.putCallAddress(callAddress);
  1. 最后三个
asm.putAddRegImm("esp", 0xC);
asm.putPopReg("edi");
asm.putRet();
  1. 写入内存
asm.flush();

构造结构体

wxWxid和pWxmsg都需要是结构体的形式,所以得构造出一个结构体,这个和python是一样操作的。分配内存,如何写地址进去

function build_struct(content) {
    let struct_address = Memory.alloc(20);
    let length = content.readUtf16String().length;
    struct_address.writePointer(content);
    struct_address.add(0x4).writeU32(length);
    struct_address.add(0x8).writeU32(length * 2);
    struct_address.add(0xC).writeU32(0);
    struct_address.add(0x10).writeU32(0);
    // console.log(hexdump(struct_address));
    return struct_address;
}
let U16Wxid = Memory.allocUtf16String(wxid);
let wxWxid = build_struct(U16Wxid);

完整代码:

效果图:
在这里插入图片描述

// 打印汇编代码, 直接抄的课程代码
function show_asm(start, length = 50) {
    for (let index = 0; index < length; index++) {
        let inst = Instruction.parse(start);
        // console.log(JSON.stringify(inst));
        let byteArray = start.readByteArray(inst.size);
        let byteCode = Array.prototype.slice.call(new Uint8Array(byteArray));
        let mCode = byteCode.map(x => x.toString(16).padStart(2, "0")).join(" ").toUpperCase();
        console.log(inst.address.toString().toUpperCase().replace("0X", "0x"), mCode.padEnd(14, " "), "\t", inst.toString().toUpperCase().replace("0X", "0x"));
        start = inst.next;
        if (start.readU32() == 0)
            break;
    }
}

// 构造微信通用结构体
function build_struct(content, length) {
    let struct_address = Memory.alloc(20);
    struct_address.writePointer(content);
    struct_address.add(0x4).writeU32(length);
    struct_address.add(0x8).writeU32(length * 2);
    struct_address.add(0xC).writeU32(0);
    struct_address.add(0x10).writeU32(0);
    // console.log(hexdump(struct_address));
    return struct_address;
}


function build_function_sendmsg() {
    let wxNull = Memory.alloc(0x100);
    let buffer = Memory.alloc(0x3B0);
    // 构建wxid结构体
    let wxid = "filehelper";
    let U16Wxid = Memory.allocUtf16String(wxid);
    let wxid_struct_address = build_struct(U16Wxid, wxid.length);
    // 构造消息结构体
    let msg = (new Date()).toJSON();
    console.log("当前发送消息内容: ", msg);
    let U16Msg = Memory.allocUtf16String(msg);
    let msg_struct_address = build_struct(U16Msg, msg.length);
    // 计算函数地址
    let ModAddress = Process.getModuleByName('wechatwin.dll');
    let callAddress = ModAddress.base.add('0x521D30');
    // 写入汇编
    let m2 = Memory.alloc(Process.pageSize);
    Memory.patchCode(m2, Process.pageSize, (code) => {
        // console.log("code", code);
        let asm = new X86Writer(code);
        asm.putPushReg('edi');
        asm.putMovRegAddress("eax", wxNull);
        asm.putPushU32(0x1);
        asm.putPushReg('eax');
        asm.putMovRegAddress("edi", msg_struct_address);
        asm.putPushReg('edi');
        asm.putMovRegAddress('edx', wxid_struct_address);
        asm.putMovRegAddress('ecx', buffer);
        asm.putCallAddress(callAddress);
        asm.putAddRegImm("esp", 0xC);
        asm.putPopReg("edi");
        asm.putRet();
        asm.flush();
    });
    show_asm(m2);
    // 调用函数, 第一个是地址,第二个是返回值类型,第三个是参数列表
    let sendmsg_call = new NativeFunction(m2, "void", []);
    sendmsg_call();
}

// build_function_sendmsg();

如果想更新最新版本,一般情况下只需要更改callAddress 后面的偏移,发文本消息一般不会怎么变

如果想再python端调用,只需要用rpc.exports导出build_function_sendmsg给python。这些都和安卓是一样的,就不重复说了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLlite

SQLlite ​ SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 一、什么是 SQLite ​ SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&…

Webpack 5 超详细解读(三)

21.babel-loader 使用 使用babel-loader对js文件进行处理&#xff0c;在lg.Webpack.js配置文件中配置js文件规则。 使用单独的插件进行转换 使用预设进行转换 使用babel.config.js配置文件进行babel配置 const path require(path) const CopyWebpackPlugin require(copy-W…

解决哈希冲突的方案

什么是哈希表 一种实现关联数组抽象数据类型的数据结构&#xff0c;这种结构可以将关键码映射到给定值。简单来说哈希表&#xff08;key-value&#xff09;之间存在一个映射关系&#xff0c;是键值对的关系&#xff0c;一个键对应一个值。 什么是哈希冲突 当两个不同的数经过…

基于 Text-CNN 的情感分析(文本分类)----概念与应用

文章目录基于Text-CNN情感分析卷积的基本概念Text-CNN的核心思想实现数据预处理批量处理操作--填充与截断拆分训练集与测试集定义Text-CNN模型设计模型定义与训练参数训练并评估模型结语基于Text-CNN情感分析 大家都知道&#xff0c;CNN(Convolutional Neural Network) 是深度…

非近轴衍射分束器的设计与严格分析

摘要 直接设计非近轴衍射分束器仍然是很困难的。由于有相对较大的分束角&#xff0c;元件的特征尺寸一般等于或小于工作波长。因此&#xff0c;它通常超出近轴建模方法的范围。在此示例中&#xff0c;将迭代傅里叶变换算法&#xff08;IFTA&#xff09;和薄元件近似&#xff08…

在线的MySQL数据库表结构对比工具

在项目部署上线前&#xff0c;测试版和正式版的数据库表结构做过哪些变更&#xff0c;如果没有做好实时记录&#xff0c;那么就需要对比找出差异&#xff0c;否则代码部分更新后&#xff0c;可能导致功能异常。 数据库表结构对比的工具很多&#xff0c;但是为了方便部署同步的…

Python 算法:线性回归及相关公式推导

0 前言 本文以一个小小的案例展开&#xff0c;主要讲解了线性回归的步骤、常用的两种求最优解的方法&#xff08;最小二乘法和sklearn回归算法及算法原理&#xff09;及相关函数、公式的过程推导。 相关环境&#xff1a;Windows 64位 Python3.9 scikit-learn1.0.2pandas1.4.2…

怎么在VMware上安装Linux?

推荐教程&#xff1a;Linux零基础快速入门到精通 下载CentOS操作系统 首先&#xff0c;我们需要下载操作系统的安装文件&#xff0c;本次使用CentOS7.6版本进行学习&#xff1a; https://vault.centos.org/7.6.1810/isos/x86_64/ (最后的/不要漏掉&#xff09; •或者直接…

02、Spring中的Bean实例化、作用域、生命周期及装配方式介绍

简介&#xff1a;本笔记主要介绍以下几点 1、Bean的常见属性及其子元素 2、实例化Bean的三种方式 3、Bean的生命周期和作用域 4、Bean的三种装配方式 1、Bean的配置 Spring简单来说就是一个大工厂&#xff0c;这个工厂负责创建和管理Spring容器中的Bean对象&#xff0c;如果要使…

基于深度学习的人脸表情识别的AR川剧变脸(一)

1、摘要 本项目分为两部分&#xff0c;第一个部分是人脸表情识别任务&#xff0c;第二部分是根据表情变化不同AR脸谱效果。 本文将第一部分&#xff0c;如何使用Keras训练一个人脸表情识别的卷积神经网络。 2、数据集处理 数据集我们使用FER2013PLUS人脸表情识别数据集&…

Spring Boot如何进行监控项目/SpringBoot Admin监控程序怎么用/监控程序可以监控到哪些信息

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.6 监控 3.6.1 意义 监控服务是否宕机监控服务运…

Hive数据定义语言-DDL-入门基础(含四个实践案例)

1. 概述 数据定义语言DDL&#xff0c;是SQL语言集中对数据库内部的对象结构进行创建、删除、修改等的操作语言&#xff0c;这些数据库对象包括database、table、view、index等。DDL核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作。在某些上下文中&…

Docker ENV 与 ARG 详解

Docker Env 与 ARG 详解 Env 与ARG 差异可以用下面一张图来表示 ENV 使用说明 ENV 变量只能在容器运行时&#xff0c;生效 如果想在执行命令的时候&#xff0c;使用ENV变量需要在shell 模式下采用生效&#xff0c;比如我们运行spring boot 应用, 其中JAVA_OPTS 变量通过doc…

德国跨国汽车巨头大陆集团遭LockBit勒索软件组织攻击

据BleepingCompuer11月3日消息&#xff0c;知名勒索软件组织LockBit宣布他们对德国跨国汽车集团大陆集团&#xff08; Continental&#xff09; 发动了网络攻击。 LockBit声称&#xff0c;他们窃取了大陆集团系统中的一些数据&#xff0c;如果不能在11 月 4 日 15:45:36&#x…

Docker基本管理

一、Docker概述 1.什么是Docker 是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源&#xff1b; 是在Linux容器里运行应用的开源工具&#xff1b; 是一种轻量级的“虚拟机”&#xff1b; Docker的容器技术可以在一台主机上轻松为任何应用创建一个…

GC暂停时间过长——排查分析

告警 本次GC日志分析 2022-11-17T17:58:50.5180800: 1217960.132: [GC (Allocation Failure) 2022-11-17T17:58:50.5180800: 1217960.132: [ParNew: 1382400K->153600K(1382400K), 0. 5626158 secs] 3419277K->2410488K(4040704K), 0.5628652 secs] [Times: user1.07 sy…

vue3【toRef和toRefs--详】

通过下面的代码例子分析这两个作用及其用法&#xff1a; <template><h1>姓名&#xff1a;{{person.name}}</h1><h1>年龄&#xff1a;{{person.age}}</h1><h1>薪资&#xff1a;{{person.job.job1.salary}}w</h1><button click&qu…

springboot+vue网上零食购物商城网站java

零食商店管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;springboot框架和idea开发工具开发&#xff0c;本系统主要分为用户和管理员两个角色&#xff0c;用户可以注册登陆查看零食资讯&#xff0c;零食分类&#xff0c;零食详情&#xff0c;收藏零食&#xff…

SwiftUI之iOS16中的三种SF字体的样式和使用

一、前言 在 iOS 16 中&#xff0c;Apple 引入了三种新的宽度样式字体到 SF 字体库&#xff1a;Compressed、Condensed、Expend&#xff0c;展示效果如下&#xff1a; 二、UIFont.Width Apple 引入了新的结构体 UIFont.Width&#xff0c;这代表了一种新的宽度样式。目前已有的…

纯前端 excel 导出

前端 excel 表格导出 我们习惯了后端去处理表格&#xff0c;直接接口返回 &#xff0c;那前端如何轻松的导出表格呢&#xff1f; 文章目录前端 excel 表格导出Ⅰ. 通过 js-xlsx ⭐⭐⭐⭐⭐安装① vue2 中使用② vue3 中使用③ react 中使用Ⅲ. 通过 vue-json-excel ⭐⭐安装使…