frida hook微信防撤回(PC端)

2024-06-11 03:52
文章标签 pc hook frida 撤回 微信防

本文主要是介绍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

这篇关于frida hook微信防撤回(PC端)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050125

相关文章

编程应该用 Mac 还是 PC ?

『有人的地方,就有江湖』—徐克。笑傲江湖。     序     一个竞争的市场,就会有对立的产生,这世界存在著很多不同的领域,领域好比是个江湖的缩影,因此就有许多门派的纷争,例如说浏览器领域有著最大宗的IE派,门派成长速度飞快,武功版号跳的跟台湾物价指数一样快的Chrome门,不断被模仿,一直被超越的Opera派;韧性极强,一直对抗几大势力的Firefox派等等,程序语言也有自己的领域

PC与android平板通过浏览器监控Verybot的视频

下面这个视频是PC与android平板通过浏览器监控Verybot的视频:           http://v.youku.com/v_show/id_XNjYzNzYyMTIw.html

frida检测绕过-libmsaoaidsec.so

libmsaoaidsec.so 部分检测手段 检测机制在native层实现一般在init_proc()函数中触发使用 pthread_create 创建2个检测线程 绕过: nop pthread_create 的调用 eg: 在 bilibil1 - v7.26.1版本中, 在got表导入了pthread_create 绕过: 替换dlsym(xx, "pthread_create ")的返

【hdu】Just a Hook(线段树区间修改)

线段树模板题,练的是懒惰标记。 懒惰标记,就是更新一段区间的时候,如果小区间被包含在了所需要更新的区间里面,那么直接对代表这个区间的数组元素赋值,之后做一个标记(表示这个区间的子区间都需要更新)但是不继续递归(这样可以节省很多的时候)。 116571152014-09-15 14:17:26Accepted1698796MS2380K1750 BG++KinderRiven #

PC/MCU/SoC使用的计算机架构(Architecture)

1. 冯·诺依曼结构 冯·诺依曼结构(Von Neumann Architecture)是计算机系统的经典架构,由数学家约翰·冯·诺依曼在1945年提出。它的核心思想是程序存储器和数据存储器共享同一存储设备,程序和数据以相同的方式存储和访问。冯·诺依曼架构的主要特点包括: 单一存储器:存储程序指令和数据在同一个存储器中。控制单元:通过程序计数器顺序执行指令。数据路径:通过一个共享的总线,将数据

wx.chooseMessageFile在pc端微信小程序失效解决方法

项目场景: 在uniapp上驱动微信开发者工具(下图) 在手机上和微信开发者工具中(图1)都可以上传成功, 打开pc端的微信小程序 在pc端打开小程序时点击上传没反应 问题描述 提示:这里描述项目中遇到的问题: 在pc端打开小程序上传的时候发现点击上传没有反应,通过(    console.log("打印====111")    )打印步骤发现wx.chooseM

鸿蒙-PC三栏布局

参考链接: 文档中心 // MainAbility.ts import { window, display } from '@kit.ArkUI' import { Ability } from '@kit.AbilityKit' export default class MainAbility extends Ability {   private windowObj?: window

vant swipe 组件在pc端不能手动滑动

1.引入包 npm i @vant/touch-emulator --save 2.页面引用 import "@vant/touch-emulator" 3.van-swipe-item 添加 @dragstart.prevent 禁止与图片的交互操作

react、vue 提供的 hook 函数对比

文章目录 useMemo vs computeduseEffect vs watch useMemo vs computed React 的useMemo 和 Vue3 的computed 分别用于优化性能和避免不必要的计算的两个概念。它们的目标相似,但实现方式和使用场景有所不同。它们都用于优化那些依赖于其他状态或属性,并且计算成本较高的表达式。以下是它们的主要区别: Rea

Android客户端与PC服务器通过socket进行交互实例

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android socket通信有点了解了。 下面是具体的代码,说明都在注释中了。需要注意的是,只有客户端发送了信息给服务器后,服务器才能响应客户端的输入,然后返回信息给客户端,这是客户端才能读取服务器返回的信息。如果客户端和服务器都处于等待对方的信息,那样就会造成阻塞,导致ANR了。 1.