由于工作一直会遇到frida来执行各种Hook,现在梳理整个frida的相关使用场景。由于安装的资料以及文档网上已经特别多了,本系列教程忽略相关安装步骤。
编写Java程序
package com.examle.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView1;
private TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = findViewById(R.id.tv1);
textView2 = findViewById(R.id.tv2);
test1("test1");
textView2.setText(test2());
}
private void test1(String param) {
textView1.setText(param);
}
private String test2() {
return "test2";
}
}
展示效果如下。
明确Hook目标
- hook test1:需要打印方法参数
- hook test1:修改修改方法参数
- hook test2:需要打印方法返回值
- hook test2:需要修改方法返回值
编写JS代码
Java.perform(function () {
var mainActivity=Java.use("com.examle.myapplication.MainActivity");
//hook test1
mainActivity.test1.overload("java.lang.String").implementation = function(str){
//step1:打印传参
console.log(str);
//step2:修改传参
var newValue="new test1";
this.test1(newValue);
}
//hook test2
mainActivity.test2.implementation = function(){
//step3:打印返回值
console.log(this.test2());
//step4:修改返回值
return "new test2";
}
});
通过代码可以看到,我们重新构造了需要显示的字符串。
frida调用
启动frida进行hook。
界面显示如下:
现在可以直观的看到frida调用Java方法调用成功。