frida 真的是 app 逆向的神器,当你遇上他的时候,就会爱上他。这篇文章主要是通过自己写个 app 的 demo,然后一步步的 hook 它。之后会有系列的文章介绍 frida 对其他 app 的应用。
知识准备frida 基础知识android 知识环境android studio android 开发工具已 root 的安卓手机android 和 python 的 frida 环境描述之前在如何让 app 不走代理的文章中写了一个小的 app 的 demo。现在我准备一步一步的 hook 这个 demo。以便能加深对 frida 的理解。
源码以下是 demo APP 的源码
public void onClick(View view) throws IOException { new Thread(this).start(); } @Override public void run() { Looper.prepare(); OkHttpClient okHttpClient = new OkHttpClient.Builder(). proxy(Proxy.NO_PROXY). build(); Request request = new Request.Builder() .url("http://www.baidu.com") .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); Toast.makeText(this, Objects.requireNonNull(response.body()).string(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { Log.e("ioerror",e.getMessage()); } Looper.loop(); }一:hook 掉 onClick 方法第一步:hook 掉 onClick 方法,代码如下
Java.perform( function () { // 通过反射获得MainActivity var mainActivity = Java.use('com.example.myapplication.MainActivity'); // 获得onClick钩子 var onClick = mainActivity.onClick; // 重写 onClick.implementation=function (view) { //事前 console.log(view) // 事中 var result = onClick.call(this,view) // 事后 return result; } } )结果如下:
二:hook 掉 Toast 的 makeText 方法目的是让让 toast 出我们自己定义的内容,代码如下:
Java.perform( function () { // 获得Toast组件 var Toast = Java.use('android.widget.Toast') var makeText = Toast.makeText var String = Java.use('java.lang.String') makeText.overload('android.content.Context', 'java.lang.CharSequence', 'int').implementation=function (context,content,time) { var hookContent = String.$new('hook掉了') return this.makeText(context,hookContent,time) } } )hook 结果
三:hook 掉 OkHttp 中的 Responsehook 掉 OkHttp 的 Response 构造方法,并打印出请求的 url 和响应码。
Java.perform( function () { var Response = Java.use("okhttp3.Response"); var init = Response.$init; init.implementation=function (request,protocol,message,code,Handshake,Headers,ResponseBody, Response1, Response2, Response3, long1,long2, Exchange) { if(ResponseBody){ console.log(request.url()+'-----'+code) } return this.$init(request,protocol,message,code,Handshake,Headers,ResponseBody, Response1, Response2, Response3, long1,long2, Exchange) } } )最终结果:
总结通过步骤 1 学会了使用 frida 如何进行 hook 操作通过步骤 2 学会了如何调用构造方法通过步骤 2 学会了如何 hook 存在方法重载的函数通过步骤 3 hook 了 okhttp 的 Response 构造方法,获得了请求 url 和响应码除了讲解了常用语法之外,步骤 3 也为我们 hook 其他东西打开了空间。
作者:阳光下的小树
---来自腾讯云社区的---Python编程与实战
微信扫一扫打赏
支付宝扫一扫打赏