Frida,动态插桩工具。
1.安装&基础使用:
可以参考文章:安卓模拟器Frida环境搭建 (mumu+adb+frida)_mumu adb-CSDN博客
需要注意的是:
1.frida版本问题需要结合自身情况选择
2.如果遇到adb.exe: more than one device/emulator情况可以使用-s解决(参考下文)
3.若在执行frida-ps.exe等命令时提示‘命令未找到’,需要将Python的Scripts目录(通常包含frida-ps.exe)以及adb工具所在的目录添加到系统的PATH环境变量中。
本人使用:Mumu模拟器v5.24.0, frida-server-17.9.1-android-x86_64,frida version:17.9.1
先跟文章走一遍后再继续以下内容
使用:
我总结了实操部分(即彻底安装完成后Frida一般流程)
打开Mumu模拟器,运行你要hook的安卓应用。
打开你的 第一个 命令行,如下,运行命令后不要关闭
1 2 3 4 5 6 7 8
| adb connect 127.0.0.1:16384 adb -s 127.0.0.1:16384 shell
su cd /data/local/tmp/ //可以使用 ls 查看文件夹内容 chmod 777 frida-server-17.9.1-android-x86_64 //更换成你的版本喵 ./frida-server-17.9.1-android-x86_64
|
打开你的第二个命令行:
1
| adb -s 127.0.0.1:16384 forward tcp:27043 tcp:27043
|
第三个命令行:
1 2
| frida-ps.exe -U -a //获取目标程序Identifier frida.exe -U -f com.example.challengemobile(你获取的Identifier) -l hook.js//HOOOOOOK!!!!
|
2.初级练手!
参考博客:动态钩子工具Frida的入门学习 - X’s blog
此博客提供了一道安卓CTF题;Jadx打开可以看到重要的get_flag函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package com.ctf.test.ctf_100;
import android.os.Bundle; import android.os.Debug; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Random;
public class MainActivity extends AppCompatActivity { public int has_gone_int; public int to_reach_int;
public native String get_flag(int i);
public void btn2_onclick(View v) { TextView tv_result = (TextView) findViewById(R.id.tvResult); tv_result.setText("{Flag:" + get_flag(this.to_reach_int) + "}"); }
static { if (!Debug.isDebuggerConnected()) { System.loadLibrary("ctf"); } } }
|
编辑如下hook.js;
1 2 3 4 5 6 7 8 9 10 11 12
| Java.perform(function x() { setTimeout(function x(){ Java.choose('com.ctf.test.ctf_100.MainActivity', { onMatch: function (instance) { console.log(instance.get_flag(0)); }, onComplete: function () { console.log('Done'); } }); },1000); });
|

成功获取Flag;
当然,这题还有不同解法,frida的功能除了调用函数外还有直接修改变量,达到类似IDA调试的效果
使用instance.findViewById(0x7f0c0056).setClickable(true);可以直接将题目中获取flag按钮改为可点击;
instance.to_reach_int.value = 10;则是直接将题目中的目标值调小,轻松获取flag;
这是因为 Frida 在访问 Java 字段时,返回的是一个 包装对象,而不是原始值。通过 .value属性来实际读写这个字段值。