一、问题描述
在搭建好Frida环境后,实现一次使用代码将js脚本插入到目标安卓程序中执行,新手很容易出现各种问题,所以这里记录一下。
本次测试的是微信程序,主要目的是尝试使用Frida向其中插入脚本,然后打印出微信所有调用的模块。
Frida如何搭建环境,可以参考这篇文章:软件安装-13.Frida环境搭建-酷编程 (kucoding.com)。
二、步骤
首先第一步,一定要确保安卓手机或模拟器启动了Frida服务器端:
当然,这里的前提肯定是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
获取:
我这里是由于使用后面的标识总报错,所以就直接使用了前面的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
来执行这个脚本文件:
可以看到,on_message
这个回调函数成功触发,并接收到了send
函数发送来的数据23456
。
并且也成功打印出了微信所有调用的模块。