0X01 Frida框架安装详解
1.简述:
Frida是以Python为载体,注入Javascript作为Android中执行代码的一款Hook框架,可用Android、ios、linux、win等平台。
2.安装客户端:
在已有python和pip环境的系统下安装frida,如windows则使用pip install frida-tools命令安装frida包。
使用frida命令查看版本(成功查看到frida版本表示安装成功)。
2. 安装服务端:
首先到github上下载frida-server,网址为https://github.com/frida/frida/releases
下载与客户端相同版相同的frida-server(注意位数)。
在客户端(windows)上使用adb push命令将frida-servser传到Android设备目录中。
修改frida-servser权限,让frida-servse拥有可执行权限。
运行frida服务器。
在客户端开启端口转发。
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
使用frida-ps -U或者frida-ps -R命令查看手机端进程(成功查看到进程表示Frida环境搭建成功)。
0X02 Frida框架的初步使用
将frida服务器运行起来后,客户端就可以利用frida API对Android设备中的进程以及APP应用进行操作。
例一:
使用Frida获取android手机当前最前端Activity所在的进程。
例二:
查看手机所有已安装的android APP应用。
例三:
frida自带的Messages机制与进程交互模板。
0X03 Frida框架解题技巧
Frida可以用来解决CTF中移动安全题,如Frida官网的一个APP例子,就是一道CTF题。以如下的CTF题为例,通过解题过程深入了解Frida的使用。
1. 题目描述:
寻一名可以拿到20000分的高手,在线等很急!
2. 寻找hook点:
MainActivity部分代码如下:
静态分析得到getScore()方法是记录分数的关键。
public final void invoke(@NotNull Score arg6) {
Intrinsics.checkParameterIsNotNull(arg6, "$receiver");
if(arg6.getScore() > 20000) {
Game.access$getView$p(Game.this).setScore(0xFFFFFFFF);
}
else {
Game.access$getView$p(Game.this).setScore(arg6.getScore());
}
if(Game.access$getView$p(Game.this).getLevel() < arg6.getLevel() && Game.access$getView$p(Game.this).getLevel() != 0 && (Game.this.getSoundEnabled())) {
DefaultImpls.play$default(Game.access$getSoundtrack$p(Game.this), Sound.LEVEL_UP, 0, 2, null);
}
Game.access$getView$p(Game.this).setLevel(arg6.getLevel());
}
Hook点:setScore方法值置为-1,程序将就会自动为我们解密flag。
3. 解题过程:
静态分析完应用逻辑后可知只要将 MainActivity 中的 setScore方法参数值设为-1,程序就会自动为我们解密flag,所以可以通过Frida框架重写setScore方法将值直接设为-1。
用frida-ps -R发现应用进程。
Javascript脚本如下:
运行服务器frida-server,客户端使用Frida运行以下命令:
点击游戏开始,程序会解密并弹窗。
完整的python代码如下: