本文最后更新于 939 天前,其中的信息可能已经有所发展或是发生改变。
hook 方式有俩种,我们需要结合需求来使用
运行时 hook
顾名思义,就是在 应用运行的时候 通过 frida-server 对 app 进程进行干预
命令如下:
frida -U {package_name}
我的手机很神奇,package_name 会告诉我找不到进程,反而 应用名可以。所以主要还是 先用
frida-ps -U
确认一下frida在手机中 对应进程pid的是 package_name 还是 app_name
hook 某个函数
当用上面的命令 attach 成功之后,会进入命令行,可以在命令行在 写 js 代码执行
比如我们想 hook 一个 java 层的函数
我们工程 MainActivity 里的 frida_1 和 frida_static_1 ,下面的就是 执行 hook 的 js 脚本
Java.perform(function(){
const Activity = Java.use('android.app.Activity');
Activity.onResume.implementation = function () {
send('onResume() got called! Let\'s call the original implementation');
this.onResume();
};
const mac = Java.use('com.jiatu.frida_test.MainActivity');
mac.frida_static_1.implementation = function (context,text) {
console.log('frida_static_1 hook')
this.frida_static_1(context,"ccc");
};
mac.frida_1.implementation = function (text) {
console.log('frida_1 hook')
this.frida_1("cccbb1");
};
});
hook 某个成员变量
Java.perform(function(){
Java.choose("com.jiatu.frida_test.MainActivity", {
onMatch: function (instance) {
console.log(instance.s.value);
instance.s.value= '110'
}, onComplete: function () {
}
});
});
hook 静态变量
Java.perform(function(){
const mac = Java.use('com.jiatu.frida_test.MainActivity');
mac.static_c.value = 'hookx'
});
启动时hook
frida -U -f {package_name}
本章对应的 android 工程代码如下
public class MainActivity extends AppCompatActivity {
String s = "key";
static String static_c = "xxkey";
int s1 = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.frida_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
frida_1(static_c);
}
});
findViewById(R.id.frida_static_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
frida_static_1(MainActivity.this, "xxx2");
}
});
}
public void xx1() {
Toast.makeText(this, "xx1", Toast.LENGTH_SHORT).show();
}
private void frida_1(String test) {
Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
private static void frida_static_1(Context context, String test) {
Toast.makeText(context, test, Toast.LENGTH_SHORT).show();
}
}