精品连载丨安卓 App 逆向课程之三 frida 注入 Okhttp 抓包上篇

阅读本文大概需要 3 分钟。

前言

抓包常常是Android协议分析的第一步,抓不到包困扰着众多爬虫工程师,因此很有必要抽丝剥茧,了解和学习Android的网络通信相关知识,并且打算写一些爬虫er学习安卓网络库的系列文章。

这几篇文章的主体思路的通过FridaHook网络框架Okhttp注入拦截器的方式抓包打印网络传输数据,相较于CharlesHttpcanary等抓包工具需设置复杂的环境,Hook网络框架进行抓包则直接输出安卓app网络层传输的内容,比较方便。

当然,同时也意味着此篇也是稍微高阶一些,算是想到哪儿写到哪儿吧,先写些难的,告诉大家结果,再写简单的内容,教大家如何使用Frida等等,帮助大家入门。

本篇文章过程会穿插介绍Okhttp3FridaXposedObjection等工具以及Android混淆等内容,本项目的工程代码已经放在我的星球中,我的星球非常便宜(只要50元),并且特地为崔大大生成了半价券,现在只要一杯咖啡就成,欢迎大家加入向我提问、共同交流:

(进入星球内搜索“肉丝姐教你”)

本系列文章的目录最终会放在我的Github,欢迎大家点赞,蟹蟹大家:https://github.com/r0ysue/AndroidSecurityStudy

话不多说,我们进入正题。

1 Android网络通信框架介绍

我们在这里只讨论原生Android App的网络通信框架。

以Python类比,Python3有urllib和urllib3这样的原生网络请求库,也有requests库这样封装良好的第三方库,更加方便和优雅。Android网络通信领域也一样,我们按照远近亲疏,也罗列一下Android中常用的网络通信框架。

1.1 网络通信库概览
1.1.1 原生网络通信库

HttpURLConnectionHttpClient

这部分不用说太多,陈芝麻烂谷子的事儿了。从Android 5(2014年)开始,Android官方不再推荐使用HttpClient, Android 6.0的SDK中去掉了HttpCient,Android 9后,Android更是彻底取消了对Apache HTTPClient的支持,Android开发官方推荐用HttpUrlConnection。

在Python中urllib2已经可以很好的完成网络通信的相关工作,但耐不住requests更为优雅和简介。Android世界也一样,一般实际开发并不会用HttpURLConnection和HttpClient,而是使用经过时间和大量开发者验证的、封装良好的第三方网络请求框架,因为网络操作涉及异步、多线程以及效率的问题,自己搞吃力不讨好,因此我们直接看第三方网络请求框架吧。

1.1.2 Okhttp3

OkHttp是大名鼎鼎的Square公司的开源网络请求框架,Okhttp有2、3、4这几个大版本,目前主流使用Okhttp3,因此我们讨论Okhttp3。Okhttp本想做面向整个Java世界的网络框架,但从OKhttp3开始,似乎开始专注于Android领域,较新的版本都是用Kotlin编写和构建。Okhttp3相比HttpUrlConnection,更加优雅和高效,大部分其他Android App 的网络框架,都是基于Okhttp3的再封装。因此Okhttp3是本篇文章的重点和轴心。

注:Okhttp目前分为Okhttp3和Okhttp4两个大版本,目前主流的版本是3,3和4的API有不少变动,我们这里只讨论主流的Okhttp3。除此之外,将HttpUrlConnection和Okhttp3类比,只是因为它们都“比原生库优秀和更广泛使用”,这可以帮助理解,但两者是有区别的,requests是基于urllib3的封装,但Okhttp3并非基于HttpUrlConnection或HttpClient的封装或补充,它在底层实现上完全自成一派,事实上,三个网络框架是平级关系,甚至构成竞争。从Android 4.4开始,HttpURLConnection的底层实现已被OkHttp替代,由此可见OkHttp3是时下当之无愧最热门的HTTP框架。

1.1.3 Retrofit2

Retrofit2同样出自Square公司,Retrofit2是对Okhttp的封装。

1.1.4 Android-Async-Http

Android-Async-Http是基于HttpClient封装的异步网络请求处理库,现在已经不怎么用了。一是因为HttpClient被Android弃用,二是因为框架作者已停止维护,这个库知道即可。

1.1.5 Volley

Volley在2013年的Google I/O大会上被推出,这是一款异步网络请求框架和图片加载框架。它特别适合数据量小,通信频繁的网络操作。它基于HttpUrlConnection,目前也有一定的使用量。后续也会有关于这个框架的分析和实例讲解,这篇中不会做相应介绍。

综上所述,Okhttp3是今天的重点。

1.2 Okhttp3 DEMO App

使用Okhttp3简单写一个DEMO APP,使用Android Studio创建应用。

1.2.1 编写DEMO App

STEP1 设置简单的点击按钮,点击一次反应一次。

activity_main.xml



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center|center_horizontal|center_vertical"
tools:context=".MainActivity">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center|center_horizontal|center_vertical"
        android:id="@+id/mybtn"
        android:text="发送请求"
        android:textSize="45sp">
    </Button>


</LinearLayout>


MainActivity.java



package com.r0ysue.learnokhttp;


import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;


public class MainActivity extends AppCompatActivity {


    private static String TAG = "learnokhttp";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // 定位发送请求按钮
        Button btn = findViewById(R.id.mybtn);


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "点击");
            }
        });
    }


}


运行后尝试点击,运行正常。

STEP2 配置Okhttp所需环境

在app级的gradle中增加对okhttp3的引用,修改后点击右上角Sync Now进行同步。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    // 增加对Okhttp3的依赖
    implementation("com.squareup.okhttp3:okhttp:3.12.0")
}

在manifests注册表中申请网络请求权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.learnmyokhttp">


    <!-- 申请网络请求权限 -->
    <uses-permission android:name="android.permission.INTERNET" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>

STEP3 这才开始真正的工作,原本的逻辑是每次点击按钮时打印一条日志,修改成每次使用Okhttp3发出请求,访问百度首页。

新建类,example类中包含了发起请求所需的最简代码

package com.r0ysue.learnokhttp;


import android.os.Build;
import android.util.Log;


import androidx.annotation.RequiresApi;


import java.io.IOException;


import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class example {


    // TAG即为日志打印时的标签
    private static String TAG = "learnokhttp";


    // 新建一个Okhttp客户端
    OkHttpClient client = new OkHttpClient();


    void run(String url) throws IOException {
        // 构造request
        Request request = new Request.Builder()
                .url(url)
                .build();


        // 发起异步请求
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }


            @Override
            public void onResponse(Call call, Response response) throws IOException {


                //打印输出
                Log.d(TAG,  response.body().string());


            }
        }
        );
    }
}


同时修改MainActivity.java如下

package com.r0ysue.learnokhttp;


import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;


import java.io.IOException;


public class MainActivity extends AppCompatActivity {


    private static String TAG = "learnokhttp";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // 定位发送请求按钮
        Button btn = findViewById(R.id.mybtn);


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 访问百度首页
                String requestUrl = "https://www.baidu.com/";
                example myexample = new example();
                try {
                    myexample.run(requestUrl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }


}


运行后点击“发送请求”按钮,日志中显示Response正常。

在真实场景中,我们的抓包返回结果往往是JSON数据,因此替换访问URL为"http://www.kuaidi100.com/query?type=yuantong&postid=11111111111",每次返回随机的物流信息(查询结果可能为空)。

一个DEMO App完成了,同时我们看一下Fiddler抓包得到的请求和相应,从抓包结果可以看出,Okhttp为我们默认配置了Http协议版本、部分Headers信息,这些内容也可以自定义添加。

1.3 DEMO 流程分析

基于DEMO,在这部分介绍一些Okhttp3的知识点。

1.3.1 OkhttpClient对象

在example类中,首先创建了一个OkHttpClient对象

OkHttpClient client = new OkHttpClient();

OkhttpClient主要用来配置Okhttp框架的各种设置。你可能会怀疑emmm,我们似乎并没有做什么设置,一个参数都没写,其实在构造函数中默认诸多配置,比如超时等待时间,是否设置代理,SSL验证,协议版本等等,我们也可以自定义配置如下,在此处先不详细展开。

OkHttpClient mHttpClient = new OkHttpClient.Builder()
        .readTimeout(5, TimeUnit.SECONDS)//设置读超时
        .writeTimeout(5,TimeUnit.SECONDS)////设置写超时
        .connectTimeout(15,TimeUnit.SECONDS)//设置连接超时
        .retryOnConnectionFailure(true)//是否自动重连
        .build();
1.3.2 Request对象
// 构造request
Request request = new Request.Builder()
        .url(url)
        .build();

接下来把目光转到我们自定义的run方法内,如果说OkhttpClient是在搭建生产车间,那Request即意味着每一个产品线,Request使用建造者模式构建,可以在此环节添加headers参数等。

// 构造request
Request request = new Request.Builder()
    .url(url)
    .header(key, value)
    .header(key, value)
    ...
    .build();
1.3.3 发起异步请求
// 发起异步请求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        call.cancel();
    }


    @Override
    public void onResponse(Call call, Response response) throws IOException {


        //打印输出
        Log.d(TAG,  response.body().string());


    }
}

在将Request对象封装成Call对象后,每次enqueue都会产生一次真实的网络请求。(网络请求可分为同步和异步方式,Android中主要使用异步方式,因此我们这里直接不讲同步请求,除此之外,GET和POST是两种常用的请求,这里先演示GET方式)。

本文先到这里,下一节我们真正开始抓包实操。

怎么样?如果大家对安卓逆向感兴趣,想学到更多的知识,或者想与肉丝姐进一步交流的话,欢迎加入肉丝姐的星球来学习。

这里我跟肉丝姐还申请到了专属的半价(原价 50 元)优惠,一杯咖啡的钱大家就能学到更多关于安卓逆向的知识,感兴趣的朋友来扫码加入吧。

【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文系统介绍了基于去噪概率扩散模型(DDPM)的光伏功率场景生成方法,利用Python代码实现对光伏发电不确定性进行高保真建模与多场景生成。该模型通过模拟光伏出力的时间序列特性,充分捕捉其随机性与间歇性特征,生成具有高度统计一致性和时空相关性的多维场景集,有效支撑含高比例可再生能源的电力系统在规划、调度、风险评估等环节的决策需求。文档不仅详述了DDPM的核心架构与训练流程,还整合了大量相关科研资源,涵盖机器学习、深度学习、信号处理、路径规划、电力系统优化等多个关键技术方向,并提供了丰富的Matlab/Simulink仿真案例与开源代码链接,服务于科研复现与工程应用,突出“借力科研”的理念,强调逻辑思维与技术创新的深度融合。; 适合人群:具备一定编程基础(熟悉Python/Matlab),从事新能源发电、电力系统分析、人工智能应用等相关领域的研究生、科研人员及初级工程技术人员(建议工作年限1-3年)。; 使用场景及目标:①用于光伏功率不确定性建模,支撑微电网优化调度、储能系统配置、鲁棒/分布鲁棒优化等研究;②作为深度生成模型在能源领域落地的典型案例,掌握DDPM等前沿生成式AI模型的设计思想与实际编程实现技巧;③结合文中提供的丰富复现资源,快速构建研究原型,加速科研项目推进与学术论文撰写进程。; 阅读建议:建议读者按照目录结构系统性地浏览内容,优先聚焦与自身研究方向密切相关的模块,结合网盘提供的完整代码与仿真模型进行动手实践,注重理论推导、代码调试与结果分析的有机结合,以深入理解模型内在机制并提升实际应用能力。
本资源提供截至2026年7月全球80000余个机场空间分布数据,系统整合全球民航机场、地区性通用机场及水上飞机起降点等航空基础设施信息,包含可编辑MXD工程文件、标准Shapefile矢量文件以及标准成图TIF文件。数据经过统一整理与标准化处理,空间定位准确、属性结构规范,可直接应用于GIS空间分析、航空运输研究、交通地理分析及科研教学等多种应用场景。 从数据背景来看,机场是全球航空运输网络的重要节点,也是区域经济联系、人员流动和物流运输的重要基础设施。全球机场广泛分布于亚洲、欧洲、北美洲、南美洲、非洲及大洋洲,不同类型机场共同构建了覆盖全球的航空运输体系。其中,民航机场承担定期客货运输任务,地区性通用机场主要服务于通用航空、应急救援、农林作业及飞行培训等需求,而水上飞机起降点则广泛分布于岛屿、湖泊及沿海地区,在偏远地区交通运输中具有重要作用。 在数据内容方面,本资源收录全球80000余个机场及航空设施,以点状矢量形式表达其空间位置。Shapefile文件包含机场名称、机场类型、所属国家(地区)、所在城市及地理坐标等基础属性信息,可用于航空基础设施统计分析、空间分布研究及专题制图。同时配套提供MXD工程文件,已完成基础图层组织与符号配置,用户可在ArcGIS平台中直接进行编辑与成果输出。 在应用层面,该数据可广泛用于全球航空运输网络分析、机场可达性评价、交通基础设施布局研究、区域经济联系分析及应急保障规划等领域。结合人口、GDP、铁路、公路、港口或航线数据,还可开展综合交通网络分析、航空枢纽识别、物流运输优化及区域发展评价。此外,该数据同样适用于GIS教学、交通地理及航空运输相关课程实践。 资源同时提供标准成图TIF文件,可直接用于科研论文插图、项目报告及教学展示。整体数据结构规范、兼容性强,可在ArcGIS、QGIS等主流GIS软件平台中直接使用。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文围绕“日前-日内”联合市场的虚拟电厂(VPP)竞价与优化策略展开研究,重点通过Matlab代码实现相关模型的仿真与优化。研究内容涵盖虚拟电厂在电力市场中的运行机制,特别是如何在日前市场和日内市场中进行竞价决策与资源优化调度,以最大化经济效益并保障系统稳定性。文中结合了智能优化算法、电力系统调度理论与市场竞价策略,构建了完整的VPP优化框架,并提供了详细的代码实现路径,帮助读者复现研究成果。此外,文档还列举了大量相关科研方向和技术应用,如微电网优化、储能配置、需求响应等,展示了广泛的电力系统仿真服务能力。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的科研人员、研究生及从事能源系统优化工作的技术人员;尤其适合正在进行虚拟电厂、电力市场优化、可再生能源集成等相关课题研究的人员。; 使用场景及目标:① 学习并掌握虚拟电厂在“日前-日内”双市场环境下的竞价策略建模方法;② 利用Matlab实现VPP优化调度算法,提升科研仿真能力;③ 借助提供的代码与案例,完成论文复现、课题开发或实际项目建模;④ 拓展至微电网、储能、电动汽车等多能协同系统的优化研究。; 阅读建议:建议读者结合文中提到的网盘资源下载完整代码与模型,按照文档结构逐步学习,重点关注优化模型的数学构建与Matlab实现细节。同时可参考文末列出的其他研究方向,拓展研究视野,提升科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值