使用frida发送微信消息给好友
前言
之前说过怎么用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
翻译上面的汇编:
push edi
// putPushReg是push一个寄存器
asm.putPushReg('edi')
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 );
push 0x1
asm.putPushU32(0x1);
mov edi, dword ptr ds:[pWxmsg]
pWxmsg是个结构体,后面再看怎么赋值
asm.putMovRegAddress("edi", pWxmsg);
push edi
asm.putPushReg('edi');
lea edx, dword ptr ds:[wxWxid]
正常也是应该赋值给一个指针再mov,也是报错,直接mov就没问题。可能是我理解的有问题,算了,能跑就行了
asm.putMovRegAddress('edx', wxWxid);
lea ecx, dword ptr ds:[buffer]
let buffer = Memory.alloc(0x3B0);
asm.putMovRegAddress('ecx', buffer);
call address
版本还是用的上一篇python发消息里的版本。其他版本的偏移自己找下吧
let ModAddress = Process.getModuleByName('wechatwin.dll');
let callAddress = ModAddress.base.add('0x521D30');
asm.putCallAddress(callAddress);
最后三个
asm.putAddRegImm("esp", 0xC);
asm.putPopReg("edi");
asm.putRet();
- 写入内存
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。这些都和安卓是一样的,就不重复说了
使用frida发送微信消息给好友相关推荐
- 全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)...
不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...
- python 发送微信语音消息_全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)...
不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...
- Python发送微信消息(文字、图片、文件)给指定好友和微信群,零基础可看懂(附源码和教程)
前言 本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于 ...
- Python发送微信消息(文字、图片、文件)给指定好友和微信群(调用Win32 API模拟人的手动操作来发送消息)
本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于程序找 ...
- python自动发送微信-Python自动定时发送微信消息
如今微信已成为我们日常生活的主要交流工具,利用itchat库,我们可以发送微信消息,如果需要定时自动发送,则需要借助apscheduler库,关于apscheduler库,前一篇转载文章有专门的介绍. ...
- 用python实现自动化办公------定时发送微信消息
python自动化办公------定时发送微信消息 身边的一位朋友的真实事迹分享给大家,就暂称他C吧.C是一个英俊潇洒的健身男,经常沾花惹草,桃花运不断,听C说他的微信好友就有5000+,平时回消息都 ...
- 使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了
使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了 此程序在手再也不怕女朋友跟你闹了!!!!自从有了女朋友比如:早安.晚安之类的问候语可不能断,但是也难免有时候会忘记那么该咋么办呢 ...
- Python自动定时发送微信消息
如今微信已成为我们日常生活的主要交流工具,利用itchat库,我们可以发送微信消息,如果需要定时自动发送,则需要借助apscheduler库,关于apscheduler库,前一篇转载文章有专门的介绍. ...
- 利用Python发送微信消息的方法
微信是支持用快捷键打开主界面的,这个可以在微信的设置里看到,如下图所示 我们就可以利用这一特性,用Python模拟按快捷键的操作,用来打开微信主界面. 打开主界面之后,使用Ctrl+F,定位到微信的搜 ...
最新文章
- 第三十五课.基于贝叶斯的深度学习
- PR详解及二分类的PR曲线绘制
- git.exe在哪里?
- Matlab GUI 设计(3):edit、slider、table数据同步
- OOnbsp;ALV常用功能完整简例(热键单击…
- ElasticSearch学习笔记(二)—结构了解和索引文档增删改
- java str.split(quot;cquot;),你真的完全理解了String的split方法?之二
- 动画演示 Delphi 2007 IDE 功能[3] - 修改属性
- android键盘弹出,聊天背景不变形
- 企业管理软件随想-透视-包容,无形思想-有形方便
- 拉取ftp服务器上的文件_无公网IP环境下搭建外部访问FTP文件共享服务器
- windows清除记住的密码
- cost of path 的计算
- android 删除开机动画,Android开机logo和开机动画的修改
- 学到一招!三行 Python 代码轻松提取 PDF 表格数据!
- no ip domain-lookup 是什么意思?
- 网络广告计费方式CPM、CPA、CPS、CPT、CPC及比较分析
- 二元最佳前缀码_信息与编码系列(二)最优码——Huffman码
- sql语句左连接时的ON AND用法
- 小清新版js扫雷(使用原生js)
热门文章
- python OpenCV 入门教程等你来取
- linux shell编程与编辑器使用详解_使用 Mu 编辑器教授 Python | Linux 中国
- 荣耀Earbuds 3 Pro携三大全球首发强势破局旗舰耳机市场
- 阿里AI设计师一秒出图,小撒连连惊呼,真相是...
- 进程、内存、服务和硬盘容量相关的命令及查看帮助和命令行中各种文件颜色的含义
- OCR - 微软windows 11系统自带的Windows OCR功能初体验
- ISME|不同饮食选择驱动反刍动物瘤胃微生物氢代谢
- 最高一日三送,苏宁易购把握到家业务爆发期
- 彩色荧光ps微球-含有彩色染料的聚苯乙烯(DyedPolystyrene)
- C语言是终极王者,【独家】数竞决赛大比拼,谁才是终极王者?