本文是 Piasy 原创,发表于 https://blog.piasy.com,请阅读原文支持原创 https://blog.piasy.com/2017/06/01/frida-android-hook/
最近的工作需要通过 hook 研究一些目标 APP 的系统 API 调用,很早就了解到了 Frida,这次终于可以体验一把了。花了一整天的时间,才终于把环境搭好,主要是准备手机系统花了时间。示例代码可以在 GitHub 获取。
【2017.6.4 更新】:自动生成 Javascript hook 脚本的工具有了一个可用的版本,check it out :)。
环境准备
最终成功的环境:
macOS 10.12.5 (16F73)
python 3.6.1
Frida 10.0.9
Nexus 5X
之前失败的手机系统:
Nexus 5X,自己编译的 AOSP,7.1.1_r24,由于是工程镜像,所以自带 root,SELinux 可以设置为 Permissive mode;在手机上运行 frida-server 之后,电脑上的所有指令都提示 connection refused;
三星 note 3,KingRoot,SELinux 无法设置为 Permissive mode;在手机上运行 frida-server 之后,电脑上可以执行 frida-ps,但 frida-trace 提示 Failed to attach: failed to execute child process “/data/local/tmp/re.frida.server/frida-helper-32” (Permission denied);
【2017.6.2 更新】:运行得好好的 Frida,今天下午突然又不行了,提示 connection refused,折腾半天发现是电脑不仅连接了 Nexus 5X,还连上了一台 iPhone,拔掉 iPhone 就好了,希望大家不会遇见这样的窘境。
hook 需求
MainActivity 的代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.mBtnTest).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
private_func();
private_func(123);
private_func("str");
private_func("str", true);
System.out.println("func_with_ret(4): " + func_with_ret(4));
}
});
}
private void private_func() {