首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >APP爬虫|逆向神器 frida 初试

APP爬虫|逆向神器 frida 初试

作者头像
Python编程与实战
发布2020-04-27 19:46:21
1.8K0
发布2020-04-27 19:46:21
举报

前言

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 中的 Response

hook 掉 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 其他东西打开了空间。

作者:阳光下的小树

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python编程与实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 知识准备
  • 环境
  • 描述
  • 源码
    • 一:hook 掉 onClick 方法
      • 二:hook 掉 Toast 的 makeText 方法
        • 三:hook 掉 OkHttp 中的 Response
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档