3.frida向微信插入脚本

一、问题描述

在搭建好Frida环境后,实现一次使用代码将js脚本插入到目标安卓程序中执行,新手很容易出现各种问题,所以这里记录一下。

本次测试的是微信程序,主要目的是尝试使用Frida向其中插入脚本,然后打印出微信所有调用的模块。

Frida如何搭建环境,可以参考这篇文章:软件安装-13.Frida环境搭建-酷编程 (kucoding.com)

二、步骤

首先第一步,一定要确保安卓手机或模拟器启动了Frida服务器端:

image-20231027202857563

当然,这里的前提肯定是adb已经连接上了安卓手机。

具体操作方法我在环境搭建文章中已经给出,这里不再赘述。

然后我们就可以写一段python脚本:

import frida

def on_message(message, data):
    print("[on_message] message:", message, "data:", data)

session=frida.get_usb_device(0).attach(9789)

script = session.create_script("""'use strict';
rpc.exports.enumerateModules = function () {
send(23456);
return Process.enumerateModulesSync();
};
""")

script.on("message", on_message)
script.load()

print([m["name"] for m in script.exports.enumerate_modules()])

代码量并不多,但如果是第一次接触可能会有点迷糊,这里挨个解释一下。

首先导入Frida库是肯定要的:

import frida

然后定义了一个回调函数:

def on_message(message, data):
    print("[on_message] message:", message, "data:", data)

它在后面会用到,这里先不提。

然后是代码:

session=frida.get_usb_device(0).attach(9789)

这里是通过frida库的get_usb_device函数来获取我们连接到的安卓程序实例,然后通过这个实例,调用attach方法,就能实现监控。

get_usb_device的参数可以不填,其默认就是获取第一个设备,而我这里也只有一个。

attach函数的参数,就是你想要连接哪个应用程序,可以填名字,也可以填进程id。

这可以使用命令frida-ps -Ua获取:

image-20231027203757840

我这里是由于使用后面的标识总报错,所以就直接使用了前面的PID

所以此操作的前提是,你得先打开微信,这里才能看到它的信息。

连接成功之后,我们就可以用它来创建脚本:

script = session.create_script("""'use strict';
rpc.exports.enumerateModules = function () {
send(23456);
return Process.enumerateModulesSync();
};
""")

使用的create_script函数来创建,里面的脚本内容是js代码。

代码大概的意思就是调用函数send发送一个23456的消息数据,然后再返回当前进程的所有模块Process.enumerateModulesSync()

然后我们再让这个脚本监听消息message消息,一旦有这个消息,就让其调用on_message函数:

script.on("message", on_message)
script.load()

load函数则是加载的意思,即把上面这些脚本内容全部加载到目标进程中去。

这里注意:上面的js脚本代码中,send函数就会触发这个message消息,所以send函数发送的数据,最终也会交到这个on_message函数中来。

最后,打印一下所有模块:

print([m["name"] for m in script.exports.enumerate_modules()])

此时新开一个命令行,用python来执行这个脚本文件:

image-20231027204613170

可以看到,on_message这个回调函数成功触发,并接收到了send函数发送来的数据23456

并且也成功打印出了微信所有调用的模块。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux