前言
关于Android逆向,我基本一无所知,这也是此专栏开设的原因。
为什么以Frida作为专栏开篇?原因很简单:
- 笔者最近用到了Frida,学到了很多知识,迫切需要记录
- Frida本身非常优秀,几乎是逆向大佬们标配的工具
- 我一直秉持「通过练习来学习新技术」的思路,而Frida也是相对容易上手的练手工具
所以,我也在本文中加了一些Frida相关的练习,步骤很详细。
相信我,10min,读完这篇文章,让你入门Frida,带给你使用Frida的自信。
一. Frida介绍
不知道Frida是什么,就用,显然是不理智的。那么Frida是什么呢?我们看下github文档的介绍吧:
除此之外,在它的网站上,还介绍了以下四个特性
OK,我们一句话来描述:Frida就是一个「脚本化、可移植、免费且非常流行」的动态插桩工具。
对于知道插桩是什么意思的朋友来说,不必再过多解释。而如果你不知道插桩是什么意思,我可以大概介绍下,你可以理解为:将你的代码,插入到源程序的某个地方,最终一起执行,而「不必改变源程序的代码」。
不理解也没关系,忽略它,不影响后面的内容。
二. Frida环境配置
上文我们介绍了Frida是什么,顺带介绍了下插桩的意思。下面我们就直奔主题,开始Frida的使用。
首先,来配置一下环境,
关于Frida的环境,你需要知道,如果你是移动开发者,想要逆向移动app,那么,除了电脑需要安装Frida相关的工具包之外,手机上也要安装Frida的相关工具包。
下面,我们先介绍电脑的安装方式,再介绍移动手机的安装方式。
1. 电脑安装Frida
电脑安装,非常简单,三行代码搞定
pip install frida-tools # CLI tools
pip install frida # Python bindings
npm install frida # Node.js bindings
无脑都执行一遍就行,确保所有的环境没有问题。安装完后,可用
frida — version
来查看frida的版本,顺便验证是否安装成功
2. 手机安装Frida
手机安装就略显复杂。
首先,你要知道,手机不是安装Frida,而是安装frida server,这两个是不一样的。
同时,手机要求是被root之后的(当然,没root的也可以,需要借助frida-gadget,我没试过,但我建议大家都整一个root的手机,省的后面出各种麻烦)
有了一台root的手机后,开始下面的步骤
(1) 下载frida server
手机与电脑通过adb连接后,执行
adb shell getprop ro.product.cpu.abi
以查看手机型号,然后在下载列表中查找匹配的包进行下载 比如:我的手机是arm64-v8a,那么我就应该下载
注意,咱们下载的是frida-server,不要下错了。我之前就下错别的包了,导致后面出了问题,问题链接:github.com/frida/frida…
(2) 将frida server拷贝到Android手机中
下载完了之后,它的名字是:frida-server-16.2.1-android-arm64,可以重命名为:frida-server,方便输入命令。
然后,使用adb命令,将frida-server push到Android的临时文件中。比如此时frida-server就在你的桌面,那么你可以使用
adb push /Users/username/Desktop/frida-sever /data/local/tmp
将frida-server push到Android的临时文件
(3) 更改frida-server文件的权限
使用Unix命令:
chmod 755 /data/local/tmp/frida-server
改变frida-server的权限
关于此命令的解释:
chmod 是 "change mode" 的缩写,用于修改文件或目录的权限。
755 是权限设置。它分为三组数字,每组数字代表一个用户类别(所有者、组、其他用户)的权限。每组数字是三个二进制位的和,这三个二进制位分别代表读(4)、写(2)和执行(1)权限。因此,
7(即 4+2+1)表示拥有读、写和执行权限,5(即 4+1)表示拥有读和执行权限但没有写权限。所以,
chmod 755 /data/local/tmp/frida-server的意思是:为/data/local/tmp/frida-server文件设置权限,使得文件的所有者可以读、写和执行该文件,而文件的组用户和其他用户只能读和执行该文件,以确保frida-server在 Android 设备上有正确的执行权限,以便我们可以运行它来进行动态代码插桩和调试。
(4) 转发端口
很简单,两行命令
adb forward tcp:27042 tcp:27042
// 有的文章也加上了下面这一行,我不知道原因,也没细究。先无脑跟着做吧
adb forward tcp:27043 tcp:27043
解释:
tcp:27042通常是frida-server监听的默认端口。执行此命令以使 Frida 客户端连接到设备上的frida-server。
(5) 运行frida-server
通过 ADB 在 Android 设备上启动 frida-server,并使其在后台运行
adb shell “/data/local/tmp/frida-server &”
(6) 验证
执行
frida-ps -U
命令,能够输出当前运行在手机上的所有进程的pid以及名称,
如果正常输出了,那么就说明一切ok,前置的准备工作全部完成
3. 期间可能存在的一些问题,以及解法(随时补充):
- Failed to spawn: need Gadget to attach on jailed Android
- cannot import name 'NotRequired' from 'typing_extensions'
- Android Frida ProcessNotFoundError error when trying to attach to a process
三. 实战
让我们用一个 Android Demo,来演示如何使用Frida进行插桩。
首先,我们新建一个Android工程,代码如下
点击之后,效果为:
这个代码非常简单,我就不解释了。
此时,我们想劫持getText方法,使之返回我们想要它返回的值,应该怎么办呢?
你需要一段Python脚本,直接给代码,你一看就能看懂的
import frida #导入frida模块
import sys #导入sys模块
jscode = """
Java.perform(function() {
var homeFragment = Java.use("com.example.fridaTest.ui.home.HomeFragment")
homeFragment.getText.implementation = function() {
send('inter fun'); // 发送信息,用于回调python中的函数
return 'hook success!!!'
}
});
"""
def on_message(message,data): # js中执行send函数后要回调的函数
print(message)
package_name = "com.example.fridaTest"
device = frida.get_usb_device()
pid = None
for a in device.enumerate_applications():
# print(a) 如果不知道应用包名,也可以这样打印出来
if a.identifier == package_name:
pid = a.pid
break
# process = frida.get_remote_device().attach('com.example.fridaTest') # 这个方法获取process也可以
process = device.attach(pid)
script = process.create_script(jscode) # 创建js脚本
script.on('message',on_message) # 加载回调函数
script.load() #加载脚本
sys.stdin.read(
解释:
写好后,保存,然后打开要hook的App。然后,执行python代码
python /Users/username/Desktop/fridaTester.py
执行后,点击App按钮,在终端打印了
同时App按钮的文案,也变成了我们hook插入的文案
这样,就跑通了。
加餐:jadx
有时,我们想要hook一个应用,但我们不知道这个应用里面都有什么类,这时我们应该怎么办呢?
答:jadx工具
jadx是什么
官方文档中,介绍说:jadx是Dex到Java的反编译器,它可以通过命令行执行,也可以通过UI界面执行,用于从Android的Dex和Apk文件生成Java源代码。
什么意思呢?
就是:你给这个工具一个apk包,它可以直接给你反编译成源码。
举个例子,像我刚刚的程序,没有做任何混淆。我直接将base.apk丢进jadx,结果如图
所以这个工具,可以解决本节开始提出的问题。但这个工具的安装以及使用,我就不在这详细介绍了
参考文章
- frida入门总结 很详细,推荐学习
- Frida 安装和使用
- Getting Started with Frida
- Android Penetration Testing with Frida: A Comprehensive Guide with Examples
- Frida基础使用教程
总结
本文主要介绍了Frida的环境搭建以及基本使用,没有复杂,进阶的技巧,但相信已经足够你入门Frida了
感谢你的阅读 !