前言:
本文主要是对frida框架进行一个简单介绍,以及通过官网的例子,初步演示frida的用法,参考链接https://frida.re/docs/home/
一、介绍
Firda 是一款易用的跨平 Hook 工具, Java 层到 Native 层的 Hook 无所不能,是一种 动态 的插桩工具,可以插入代码到原生 App 的内存空间中,动态的去监视和修改行为,原生平台包括 Win、Mac、Linux、Android、iOS 全平台。
Frida 优点
frida的优点在于,配置环境简单,操作简洁,对于初期刚接触的破解者还是很友好的,而且可以动态调试, 不需要重启,上手比较快。
二、Frida 安装与启动
Frida分为客户端和服务端
客户端:PC
Python3x
pip install frida-tools
安装完成后查看版本(比较重要)
C:\Users\Administrator>frida --version
15.1.17
服务端:手机设备(需要root)
1、查看CPU架构
C:\Users\Administrator>adb shell
root@x86_64:/ # getprop ro.product.cpu.abi
x86_64
2、根据CPU架构找到对应的frida-server,地址:
https://github.com/frida/frida/releases
这里有个地方需要注意, frida-server的版本要与上述的客户端版本一致
3、将下载好的文件解压,adb push 文件到指定的目录 、data/local/tmp
4、给文件赋权, chmod 777 frida-server
5、启动服务:./frida-server

三、Frida 使用
以官方文档的app为例
“This tool is based on the SECCON Quals CTF 2015 APK1 example, download the APK here."
https://frida.re/docs/examples/android/
下载安装app,这是一个简单的石头剪刀布的游戏,赢了得分+1,得分=1000的时候获得flag,启动后界面是这个样子

源代码分析,主要代码如下:
`package com.example.seccon2015.rock_paper_scissors;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends Activity implements View.OnClickListener {
Button P;
Button S;
int cnt = 0;
int flag;
private final Handler handler = new Handler();
int m;
int n;
Button r;
private final Runnable showMessageTask = new Runnable() {
public void run() {
TextView tv3 = (TextView) MainActivity.this.findViewById(R.id.textView3);
if (MainActivity.this.n - MainActivity.this.m == 1) {
MainActivity.this.cnt++;
tv3.setText("WIN! +" + String.valueOf(MainActivity.this.cnt));
} else if (MainActivity.this.m - MainActivity.this.n == 1) {
MainActivity.this.cnt = 0;
tv3.setText("LOSE +0");
} else if (MainActivity.this.m == MainActivity.this.n) {
tv3.setText("DRAW +" + String.valueOf(MainActivity.this.cnt));
} else if (MainActivity.this.m < MainActivity.this.n) {
MainActivity.this.cnt = 0;
tv3.setText("LOSE +0");
} else {
MainActivity.this.cnt++;
tv3.setText("WIN! +" + String.valueOf(MainActivity.this.cnt));
}
if (1000 == MainActivity.this.cnt) {
tv3.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
}
MainActivity.this.flag = 0;
}
};
public native int calc();
static {
System.loadLibrary("calc");
}
/* access modifiers changed from: protected */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.P = (Button) findViewById(R.id.button);
this.S = (Button) findViewById(R.id.button3);
this.r = (Button) findViewById(R.id.buttonR);
this.P.setOnClickListener(this);
this.r.setOnClickListener(this);
this.S.setOnClickListener(this);
this.flag = 0;
}
public void onClick(View v) {
if (this.flag != 1) {
this.flag = 1;
((TextView) findViewById(R.id.textView3)).setText("");
TextView tv = (TextView) findViewById(R.id.textView);
this.m = 0;
this.n = new Random().nextInt(3);
((TextView) findViewById(R.id.textView2)).setText(new String[]{"CPU: Paper", "CPU: Rock", "CPU: Scissors"}[this.n]);
if (v == this.P) {
tv.setText("YOU: Paper");
this.m = 0;
}
if (v == this.r) {
tv.setText("YOU: Rock");
this.m = 1;
}
if (v == this.S) {
tv.setText("YOU: Scissors");
this.m = 2;
}
this.handler.postDelayed(this.showMessageTask, 1000);
}
}
}`
通过对源码的分析发现:该题获取flag需要的条件,总结有3个办法,
1、分析calc()方法能算出答案,但这个方法在so中,得分析汇编代码才行,当然可以尝试使用ida pro,F5查看C代码分析,前提是算法不难。
2、获取calc函数的返回值,从而计算答案。
3、还有一个方法就是,直接将MainActivity.this.cnt的值构造成1000。
以下以第三个方法为例,构造代码hook。
通过源码分析可知, 当MainActivity.this.cnt==1000的时候,就能显示flag了,所以我们可以直接修改cnt ==1000,然后下次游戏是控制双方平局,就可以得到想要的值了
JavaScript代码构造
jscode = """
Java.perform(function () {
//定义变量MainActivity,Java.use指定要使用的类
var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
MainActivity.onClick.implementation = function (v) {
send("Hook Start...");
this.onClick(v);
//修改参数,控制为平局
this.n.value = 1;
this.m.value = 1;
this.cnt.value = 1000;
send("Success!")
}
});
"""
通过python运行,

四、附件:包含实例apk 与完整.py