🌟 ❤️
作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:1696
阅读时间: 30min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
windows端微信
-
Android 端微信
-
总结
0x01 前言
最近学一些app安全的理论觉得有些枯燥了,想动手实操,刚好看到最近网上有微信防护撤回功能的hook,追踪溯源就来学一学
0x02 windows端微信实验
基本上微信的所有核心功能都在wechatwin.dll该动态链接库中
用ida打开该文件
打开需要耗时一定的时间
shift+f12 搜索.*data存放的字符串
此时我们就需要找寻微信撤回功能的入口点了
搜索关键字,revoke
看到这些不少都像是微信撤回功能的入口点的,如何确定是哪个函数呢?
就需要对相关函数进行注入调试,需要用到frida
dll中的初始header地址 16进制 0x180000000
进行虚拟地址转换
function getRealAddr(addr) {
const idaBase = ptr('0x180000000');
const offset = ptr(addr).sub(idaBase);
const result = ptr(baseAddr).add(offset);
return result;
}
代码全部如下
import frida
import sys
def inject_func(process):
session = frida.attach(process)
# 创建脚本
jscode = """
// 加载dll文件
const baseAddr=Module.findBaseAddress('WeChatWin.dll');
console.log("baseAddr: "+ baseAddr);
// 准备就绪后只有这个地址需要变换
const revokeMsgFuncAddr = convertAddr('0x181CDE330');
Interceptor.attach(revokeMsgFuncAddr, {
onEnter(args) {
console.log("test successfully");
}
});
// dll地址加上偏移地址,从虚拟内存地址转换到实际内存地址
function convertAddr(addr) {
const idaBase = ptr('0x180000000');
const offset = ptr(addr).sub(idaBase);
const result = ptr(baseAddr).add(offset);
return result;
}
"""
script = session.create_script(jscode)
script.load()
print("Process attached successfully")
# 程序一直执行,不会退出
sys.stdin.read()
if __name__ == '__main__':
target_process = 'WeChat.exe'
inject_func(target_process)
工作准备就绪,我们先来尝试几个看着比较像撤回功能的函数,比如说这个
将这个地址填入对应函数区域,进行消息撤回
发现没有输出调试信息,找下一个
(就在这样找了一个又一个后,终于发现了对应功能函数)
调试成功,下一步即阻止调用该函数
进入该函数,f5进行反汇编
可以大致看到一个if else逻辑结构
发现存在太多逻辑结构,不好判断,于是我们看看有什么函数调用了该函数
进入1823E59A0该函数
可以看到也是一个判断逻辑才决定是否进行该函数调用
发现这里确实是初始函数入口,那防撤回就很简单了,仅需要把edi寄存器的值变成不是4即可
那就直接让它为0即可
我们再来进行撤回
成功实现,如果要实现持久化防撤回的话,就需要修改dll文件
把其全部变成空转指令
0x9090 x86 空转机器周期,不执行任何代码
修改后反汇编成dll文件替换即可
0x03 安卓端微信实验
将apk直接拖入jadx,等待反汇编完成,腾讯乐固加固并没有在微信中有明显的特征,我估计是会影响程序的使用性能,毕竟那么多人都在用(bushi)
我这里的微信版本是8.0.49版本的(目前好像是最新)
加载一会儿,搜索关键词revokemsg
根据英文,不出意外的话是这个revokemsgevent
继承IEvent类,这里的代码并没有太多的东西,我们直接找其引用
但确实电脑太卡了,无奈只好直接写frida查看其调用方法
这里的调用堆栈方法参考的是
https://bbs.kanxue.com/user-home-984774.htm
jscode = """
Java.perform(function () {
var revokemsg = Java.use('com.tencent.mm.autogen.events.RevokeMsgEvent');
var activity = Java.use('android.app.Activity')
// 实例化一下
// hook 普通方法
console.log("[****] Hook succesfully.... [****]");
revokemsg["$init"].implementation = function() {
console.log("revoke类被调用");
showStacks()
this.$init();
}
function showStacks(){
console.log(
Java.use("android.util.Log") //首先找到log类
.getStackTraceString( //调用log类的该方法
Java.use("java.lang.Throwable").$new() //new一个对象
)
)
}
});
"""
发现初次调用在这里
那接下来就很简单了,把该方法置空即可
jscode = """
Java.perform(function () {
var revokemsg = Java.use('com.tencent.mm.autogen.events.RevokeMsgEvent');
var activity = Java.use('ik0.t');
// 实例化一下
// hook 普通方法
console.log("[****] Hook succesfully.... [****]");
activity.k.implementation = function() {
console.log("撤回不了我吧!!");
}
});
"""
展示如下
0x04 总结
这次算是通过学习将一些理论上学到的知识进行融会贯通了。
hook的关键还是找到关键代码,像这次我就学会了打印堆栈(耗时确实太久,以及windows一些偏移地址的重新复习,有空还是下来好好看看反汇编代码
后续将熟悉熟悉编写xposed框架进行安卓持久化防撤回
参考链接
https://bbs.kanxue.com/user-home-984774.htm
原文始发于微信公众号(剑客古月的安全屋):逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论