安卓逆向 - Frida Hook(抓包实践)

news/2024/7/19 10:10:08 标签: android, 爬虫, 网络爬虫, Frida, Hook

一、引言

上篇文章:安卓逆向 - 基础入门教程_小馒头yy的博客-CSDN博客  介绍了Frida的安装、基本使用,今天我们来看看Frida常用Hook和基于Frida抓包实践。

二、Frida常用 Hook脚本

1、hook java.net.URL

function hook1() {
    var URL = Java.use('java.net.URL');
    URL.$init.overload('java.lang.String').implementation = function (a) {
        console.log('加密前:' + a)
        showStacks()
        this.$init(a)
    }
}

2、hook okhttp3 HttpUrl

function hookOkhttp3() {
    var Builder = Java.use('okhttp3.Request$Builder');
    Builder.url.overload('okhttp3.HttpUrl').implementation = function (a) {
        console.log('a: ' + a)
        var res = this.url(a);
        showStacks()
        console.log("res: " + res)
        return res;
    }
}

3、hook okhttp3 addHeader

function hook() {
    var Builder = Java.use("okhttp3.Request$Builder");
    Builder["addHeader"].implementation = function (str, str2) {
        console.log("key: " + str)
        console.log("val: " + str2)
        showStacks()
        var result = this["addHeader"](str, str2);
        console.log("result: " + result);
        return result;
    };
}

4、打印堆栈

function showStacks() {
    Java.perform(function () {
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
    });
}

5、hook Base64 

function hookBase() {
    // Base64
    var Base64Class = Java.use("android.util.Base64");
    Base64Class.encodeToString.overload("[B", "int").implementation = function (a, b) {
        var rc = this.encodeToString(a, b);
        console.log(">>> Base64 " + rc);
        return rc;
    }
}

6、hook HashMap

function hookMap() {
    var Build = Java.use("java.util.HashMap");
    Build["put"].implementation = function (key, val) {
        console.log("key : " + key)
        console.log("val : " + val)
        return this.put(key, val)
    }
}

三、某麦网抓包实践

本篇以某麦网帖子详情接口,演示如何基于Frida hook抓包

1、安装某麦网8.*.*.apk

2、搭建Frida hook 环境,注入 hook java.net.URL脚本

3、点进帖子详情打印出如下堆栈,我们可以根据打印出的信息,跟栈分析该接口的请求头。

https://acs.m.taobao.com/gw/mtop.damai.wireless.discovery.detail.get/1.4/?source=10101&version=6000168&type=originaljson&data=%7B%22contentId%22%3A%2211088650%22%2C%22appType%22%3A%221%22%2C%22source%22%3A%2210101%22%2C%22osType%22%3A%222%22%2C%22pageSize%22%3A%2230%22%2C%22pageIndex%22%3A%221%22%2C%22version%22%3A%226000168%22%2C%22channel_from%22%3A%22damai_market%22%7D&appType=1&osType=2&channel_from=damai_market
java.lang.Exception
        at java.net.URL.<init>(Native Method)
        at tb.yy0.m(Taobao:1)
        at anet.channel.request.a.p(Taobao:2)
        at anet.channel.session.TnetSpdySession.w(Taobao:18)
        at anetwork.channel.unified.NetworkTask.sendRequest(Taobao:6)
        at anetwork.channel.unified.NetworkTask.run(Taobao:44)
        at anetwork.channel.unified.UnifiedRequestTask$a.proceed(Taobao:15)
        at com.taobao.orange.sync.NetworkInterceptor.intercept(Taobao:30)
        at anetwork.channel.unified.UnifiedRequestTask$a.proceed(Taobao:7)
        at anetwork.channel.unified.UnifiedRequestTask$3.run(Taobao:2)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:761)

4、使用Jadx打开某麦网apk

从at tb.yy0.m(Taobao:1)跟栈分析

 根据调用栈往上走,定位到如下位置,注意这行代码:

ALog.f("awcn.TnetSpdySession", "", aVar.n(), "request headers", aVar.g());

 代码注释很清楚了 request headers,我们跟进 hook aVar.g() 这个方法

public Map<String, String> g() {
        return Collections.unmodifiableMap(this.f);
    }

hook之,对象输出可以使用 JSONObject转一下

 var JSONObject = Java.use("com.alibaba.fastjson.JSONObject");
function hook6() {
    var JSONObject = Java.use("com.alibaba.fastjson.JSONObject");
    var a = Java.use("anet.channel.request.a");
    a["g"].implementation = function () {
        var result = this["g"]();
        console.log("result : " + JSONObject.toJSON(result).toString());
        return result;
    };
}

打印出如下内容:

 请求 URL、 请求方法这边都写得很清楚啦。

 收工!


http://www.niftyadmin.cn/n/4937482.html

相关文章

8月12日上课内容 综合配置详解 四层+七层代理

后续内容概述&#xff1a; Ivs集群: keepalive:vip实现代理高可用 NAT VPN DR (DR最常用) 数据库:增制改查 备份 高可用 主从复制 读写分离 DBA 市场量小&#xff0c;从业者不多&#xff0c;工资一般般。 中间件: redis.* 分布式存储: ELK日志分析。kafka消息队列 监控zabb…

IDEA项目实践——JavaWeb简介以及Servlet编程实战

系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——Spring当…

CA/TA开发编程实战-视频课程

Hello大家好&#xff0c;上架一门新的视频课程&#xff0c;课程主要包含两大部分&#xff0c;第一部分搭建环境&#xff0c;第二部分从无到有的编写代码。带领大家"手把手"编写。 具体大纲如下&#xff1a; qemu v8环境搭建 搭建一个qemu_v8的环境&#xff0c;用于…

微信开发之一键退出群聊的技术实现

简要描述&#xff1a; 退出群聊 请求URL&#xff1a; http://域名地址/quitChatRoom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wI…

笔记,ubuntu22安装header问题

描述&#xff1a; 需要/lib/modules/5.15.0-53-generic 安装linux-headers-5.15.0-53-generic_5.15.0-53.59_20.04.1_amd64.deb提示 Package libssl1.1 is not installed.&#xff0c;机器上只有libssl3.0&#xff0c;最后强制安装&#xff0c;并且打了快照&#xff0c;防止重…

【从零学习python 】21.Python中的元组与字典

文章目录 元组一、访问元组二、修改元组三、count, index四、定义只有一个数据的元组五、交换两个变量的值 字典介绍一、列表的缺点二、字典的使用进阶案例 元组 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使用小括号&#xff0c;列表使用方括号…

关于MYSQL日期相减问题

错误写法&#xff1a; SELECT DATE_FORMAT(STR_TO_DATE(20230701,%Y%m%d) -60,%Y%m%d); 但是这种格式有个问题&#xff0c;则会输出空。 正确写法&#xff1a; SELECT DATE_FORMAT(DATE_SUB(20230701,INTERVAL 60 DAY),%Y%m%d);

如何在vue3中加入markdown语法

1、首先需要安装 md-editor-v3 yarn add md-editor-v3 或者是在vue图形化界面中直接搜索 md-editor-v3 进行安装。 2、引入该编辑页 引入可以参考这个&#xff0c;根据自己的需求进行修改和添加。 <template><md-editor v-model"text"/> </templat…