这件事情浪费我两天时间,期间遇到了各种坑,记录一下
工具:
python3.7.6
frida 12.8.0
mumu模拟器
adb
SqlCipher
0x00 frida
Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。frida上层接口支持js、python、c等。0x01 安装frida和frida-tools 和配置
python端 frida 和frida-tools安装
因为我的python环境是3.7的,再加上根据大家的评价 说 12.8.0比较稳定,这选择12.8.0。没有使用最新的版本(最新版本好像不支持py3.7)
python3 -m pip install frida==12.8.0python3 -m pip install frida-tools==5.3.0
frida-server 服务端版本下载
/frida/frida
同样选择 12.8.0 版本
我这里使用 是的 mumu模拟器 (记得勾选获取root权限方便后续操作)
adb连接模拟器中的android系统 查看系统架构
adb connect 127.0.0.1:7555 # 创建连接adb shell# 进入系统 shellgetprop ro.product.cpu.abi#查看系统架构
注意:7555是 Mumu模拟器内安卓系统 默认端口
下载 frida-server-12.8.0-android-x86_64.xz 版本
解压上传
# 创建frida-server至 安卓系统上adb push frida-server-12.8.0-android-x86_64 /data/local/tmp # 赋予执行权限 并执行chmod +x frida-server-12.8.0-android-x86_64./frida-server-12.8.0-android-x86_64# 端口转发adb forward tcp:27042 tcp:27042adb forward tcp:27043 tcp:27043
测试枚举模拟器系统的 进程
frida-ps -U
0x02 使用frida获取 微信EnMicroMsg.db 数据库密码
源码分析参考连接:/lxh2cwl/p/14842537.html
hook.js
import frida import sys jscode = """Java.perform(function(){ var utils = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); // 类的加载路径utils.openDatabase.overload('java.lang.String', '[B', 'com.tencent.wcdb.database.SQLiteCipherSpec', 'com.tencent.wcdb.database.SQLiteDatabase$CursorFactory', 'int', 'com.tencent.wcdb.DatabaseErrorHandler', 'int').implementation = function(a,b,c,d,e,f,g){ console.log("Hook start......");var JavaString = Java.use("java.lang.String");var database = this.openDatabase(a,b,c,d,e,f,g);send(a);console.log(JavaString.$new(b));send("Hook ending......");return database;};});"""def on_message(message,data): #js中执行send函数后要回调的函数if message["type"] == "send":print("[*] {0}".format(message["payload"]))else:print(message)process = frida.get_remote_device()pid = process.spawn(['com.tencent.mm']) #spawn函数:进程启动的瞬间就会调用该函数session = process.attach(pid) # 加载进程号script = session.create_script(jscode) #创建js脚本script.on('message',on_message) #加载回调函数,也就是js中执行send函数规定要执行的python函数script.load() #加载脚本process.resume(pid) # 重启appsys.stdin.read()
获取数据库密码成功
将EnMicroMsg.db文件从模拟器(手机)复制到电脑上(手机或者模拟器要登陆微信)
adb pull /data/data/com.tencent.mm/MicroMsg/xxxxxxxxxxxxx/EnMicroMsg.db EnMicroMsg.db
使用 SqlCipher 工具打开EnMicroMsg.db