破解Instagram Android抓包:绕过SSL Pinning的详细教程

在移动应用安全测试和数据分析过程中,抓包是一项基础而重要的技术。然而,像Instagram这样的主流应用通常会实现SSL Pinning(证书锁定)机制来防止中间人攻击,同时也阻碍了合法的抓包分析。本文将详细介绍如何绕过Instagram Android应用的SSL Pinning保护,实现有效的抓包分析。

SSL Pinning是什么?

SSL Pinning是一种安全机制,应用程序会在编译时内置服务器的证书或公钥信息。当建立HTTPS连接时,应用会验证服务器提供的证书是否与预先"锁定"的证书匹配,而不仅仅依赖系统的证书信任链。

这种机制有效防止了中间人攻击,因为即使用户在设备上安装了自定义CA证书,应用程序仍会拒绝非原始证书的连接。

绕过Instagram SSL Pinning的方法

方法一:使用Frida脚本

Eltion的Instagram-SSL-Pinning-Bypass项目提供了一种基于Frida的解决方案。

准备工作

  1. 工具准备

    • 一部已获取root权限的Android设备
    • 安装Frida(电脑和手机端)
    • 安装Charles或Fiddler等抓包工具
    • Instagram应用
  2. 安装Frida

    # 在电脑上安装Frida客户端
    pip install frida-tools

    # 在Android设备上安装Frida服务端
    # 下载对应版本的frida-server
    adb push frida-server /data/local/tmp/
    adb shell "chmod 755 /data/local/tmp/frida-server"
    adb shell "/data/local/tmp/frida-server &"

  3. 配置抓包工具

    • 安装CA证书到Android设备
    • 确保代理设置正确

实施绕过

  1. 下载绕过脚本

    git clone https://github.com/Eltion/Instagram-SSL-Pinning-Bypass.git
    cd Instagram-SSL-Pinning-Bypass

  2. 运行绕过脚本

    frida -U -f com.instagram.android -l instagram-ssl-pinning-bypass.js --no-pause

  3. 等待Instagram启动,当看到"Instagram SSL Pinning Bypassed!"消息时,表示绕过成功

方法二:使用Objection

Objection是一个基于Frida的运行时移动探索工具包,可以更简单地执行一些常见操作。

# 安装Objection
pip install objection

# 启动Instagram并绕过SSL Pinning
objection -g com.instagram.android explore

# 在Objection控制台中禁用SSL Pinning
android sslpinning disable

方法三:使用ecapture进行eBPF基础抓包

ecapture是一个基于eBPF技术的工具,可以在内核层面捕获SSL/TLS明文,不需要绕过SSL Pinning。

使用ecapture的优势

  1. 不需要修改应用
  2. 直接从内核捕获数据,更加隐蔽
  3. 适用于各种加密库(OpenSSL, GnuTLS等)

安装和使用

# 克隆仓库
git clone https://github.com/gojue/ecapture.git
cd ecapture

# 编译(需要安装Go和相关依赖)
make

# 使用ecapture捕获特定应用的TLS流量
sudo ./bin/ecapture tls -p $(pidof com.instagram.android) -o instagram_traffic.log

SSL Pinning实现原理分析

Instagram实现SSL Pinning的方式主要基于以下几种技术:

  1. 证书哈希对比:应用存储服务器证书的哈希值,连接时验证
  2. 公钥固定:固定服务器的公钥信息
  3. 自定义验证逻辑:在Java层或Native层实现复杂的验证过程

绕过这些机制的关键是找到并修改以下关键函数:

  • X509TrustManager.checkServerTrusted()
  • OkHttp3的证书验证逻辑
  • Native层的SSL验证函数

实践中的注意事项

  1. 版本兼容性:Instagram经常更新,绕过方法需要随之更新
  2. 法律合规:只能用于自己的设备和账号进行研究
  3. 风险警告
    • 可能违反Instagram的服务条款
    • 使用过程中可能存在账号安全风险
    • Root设备本身带来安全隐患

实用分析技巧

成功绕过SSL Pinning后,你可以:

  1. 分析API结构:了解Instagram的API端点和数据格式
  2. 研究缓存机制:分析应用如何缓存和加载内容
  3. 了解权限控制:观察不同操作的授权要求
  4. 分析数据流:追踪数据如何在应用和服务器间传输

哪些数据值得关注

通过分析Instagram的网络流量,你可以发现:

  1. 认证机制:如何验证用户身份和保持登录状态
  2. 内容推送策略:了解推荐算法的基本逻辑
  3. 交互行为记录:应用如何追踪用户行为
  4. 媒体加载机制:图片和视频如何被优化加载

总结

绕过Instagram的SSL Pinning并非易事,但通过Frida脚本、Objection或eBPF技术,我们可以实现有效的抓包分析。这些技术对于安全研究、应用分析和开发测试都有重要价值。

请记住,这些方法仅应用于合法的安全研究和自我学习目的,使用时请遵守相关法律法规和服务条款。


参考资料: - Eltion/Instagram-SSL-Pinning-Bypass - 绕过SSL Pinning复现 - gojue/ecapture: eBPF捕获工具

使用apk-mitm抓取TikTok应用接口详解

在移动应用逆向工程和接口分析领域,TikTok因其复杂的加密和防抓取机制而备受关注。本文将详细介绍如何使用apk-mitm工具对TikTok应用进行接口抓取和分析。

什么是apk-mitm

apk-mitm是一个强大的工具,它可以自动修改Android应用,使其信任用户安装的证书,从而允许通过MITM(中间人)代理进行HTTPS流量检查。这个工具特别适用于那些实现了SSL Pinning(证书锁定)的应用程序,如TikTok。

准备工作

在开始之前,我们需要准备以下工具和环境:

  1. Python 环境(推荐Python 3.7+)
  2. 安装apk-mitmpip install apk-mitm
  3. Java开发环境:确保已安装JDK(版本8或更高)
  4. Android SDK:需要安装build-tools和platform-tools
  5. Charles或Fiddler等抓包工具
  6. 一部已root的Android设备或模拟器
  7. TikTok APK文件

步骤一:安装证书

首先,我们需要在手机上安装抓包工具的证书:

  1. 在电脑上打开Charles/Fiddler,设置代理端口(通常是8888)
  2. 确保手机和电脑在同一网络下
  3. 在手机的Wi-Fi设置中配置代理,IP为电脑IP,端口为抓包工具设置的端口
  4. 在手机浏览器中访问chls.pro/ssl(Charles)或http://192.168.x.x:8888(Fiddler,其中x.x为电脑IP)
  5. 下载并安装证书
  6. 对于Android 7.0+,还需要在系统设置中将此证书设为信任

步骤二:使用apk-mitm修改TikTok APK

现在,我们使用apk-mitm工具来修改TikTok APK,绕过其SSL Pinning保护:

# 确保apk-mitm已正确安装
apk-mitm /path/to/tiktok.apk -o /path/to/output/tiktok-mitm.apk

这个过程将解包APK,修改相关代码,然后重新打包,生成一个新的APK文件,该文件会信任我们之前安装的证书。

步骤三:安装修改后的APK

接下来,我们需要卸载原有的TikTok应用,然后安装修改后的版本:

# 卸载原有应用(如果有)
adb uninstall com.zhiliaoapp.musically # 国际版TikTok包名

# 安装修改后的APK
adb install /path/to/output/tiktok-mitm.apk

步骤四:配置代理和开始抓包

现在,我们可以开始抓取TikTok的接口了:

  1. 确保手机仍然连接到我们配置的代理
  2. 启动Charles/Fiddler并配置好HTTPS抓取
  3. 在手机上打开修改后的TikTok应用
  4. 在抓包工具中,您应该能够看到来自TikTok的加密请求

分析TikTok的主要接口

通过抓包,我们可以观察到TikTok应用的几个关键接口:

1. 视频Feed流接口

https://api*.tiktokv.com/aweme/v1/feed/

这个接口负责获取推荐视频,其参数包括用户ID、设备信息、位置数据等。

2. 用户信息接口

https://api*.tiktokv.com/aweme/v1/user/profile/other/

此接口用于获取特定用户的个人资料信息。

3. 评论接口

https://api*.tiktokv.com/aweme/v1/comment/list/

用于获取视频的评论列表。

请求头和签名分析

TikTok的API请求通常包含复杂的请求头和签名参数,包括:

  • X-Gorgon:一个基于请求参数、时间戳和设备信息生成的签名
  • X-Khronos:时间戳
  • X-Ladon:另一个签名参数
  • user-agent:包含详细设备信息的自定义UA

这些参数的算法是高度复杂的,常常会随着应用版本更新而变化。

注意事项

  1. 法律风险:未经授权抓取TikTok接口可能违反其服务条款,仅建议用于学习目的
  2. 版本依赖:不同版本的TikTok可能实现不同的安全机制,本教程的方法可能需要针对特定版本调整
  3. 地区限制:某些接口可能根据地区不同而有所不同
  4. 频率限制:过度请求可能触发TikTok的频率限制或IP封锁

进阶技巧

Frida辅助分析

除了使用apk-mitm,还可以结合Frida工具进行动态分析:

// Frida脚本示例:绕过SSL Pinning
Java.perform(function() {
var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
console.log('[+] SSL Pinning Bypassed');
return untrustedChain;
};
});

提取TTEncrypt算法

TikTok使用名为TTEncrypt的加密库来保护某些敏感数据。通过反编译可以提取并分析此算法:

apktool d tiktok.apk -o tiktok_decompiled
# 分析 tiktok_decompiled/lib/[架构]/libttencrypt.so

总结

通过使用apk-mitm工具,我们能够绕过TikTok的SSL Pinning保护,成功抓取并分析其网络接口。这为理解TikTok的API结构和数据流提供了宝贵的见解。然而,请记住,此类技术应当仅用于教育和研究目的,尊重TikTok的服务条款和用户隐私。

如果您对移动应用的接口抓取和分析有进一步的兴趣,可以查看我的其他相关文章,如获取百度的搜索结果的真实地址使用you-get下载视频


参考资料: 1. apk-mitm GitHub仓库 2. Android安全机制与SSL Pinning 3. 中间人攻击(MITM)原理与防御

SGD(Stochastic Gradient Descent): 随机梯度下降

随机梯度下降(Stochastic Gradient Descent,简称SGD)是一种常用于训练机器学习模型的优化算法,特别在深度学习中广泛应用。SGD的主要思想是通过迭代更新模型参数以最小化损失函数,以使模型能够更好地拟合训练数据。

以下是SGD算法的关键步骤和工作原理:

  1. 初始化参数:首先,为模型的参数(通常是权重和偏置)分配初始值,通常是随机初始化。

  2. 迭代更新参数:SGD使用以下迭代步骤来更新模型参数:

    1. 随机抽取训练样本:每次迭代中,从训练数据中随机选择一个训练样本。

    2. 计算梯度:对于选定的训练样本,计算损失函数对于每个参数的梯度。梯度表示损失函数的变化率,指示了参数应该如何调整以减小损失。

    3. 更新参数:使用计算得到的梯度和学习率,通过以下公式来更新模型的参数:

    \(\theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t; x, y)\)

    其中:

    • \(\theta_{t+1}\) 是更新后的参数值。
    • \(\theta_t\) 是当前参数值。
    • \(\eta\) 是学习率(learning rate):它控制了参数更新的步长。
    • \(\nabla L(\theta_t; x, y)\) 是损失函数对参数的梯度,表示损失函数在当前参数下的变化率。
    • \(x\) 是训练样本的特征。
    • \(y\) 是训练样本的标签。
  3. 重复迭代:SGD会重复执行上述迭代步骤,每次选择一个不同的训练样本,然后更新模型参数,直到达到预定的迭代次数或损失收敛到某个阈值。

SGD的优点包括简单、易于实现和在大规模数据集上有效。由于它每次只使用一个训练样本来计算梯度,因此在处理大型数据集时可以节省内存。此外,SGD具有一种随机性,可以帮助跳出局部极小值,有助于逃脱损失函数的局部最小值。

然而,SGD也有一些缺点,例如不稳定的更新路径和慢收敛。因此,为了解决这些问题,研究人员提出了许多SGD的变种,包括小批量梯度下降(Mini-batch Gradient Descent)和带动量的SGD(Momentum SGD),这些变种在深度学习中更常用。

Adam(Adaptive Moment Estimation): 自适应学习率优化算法

Adam(Adaptive Moment Estimation)是一种自适应学习率优化算法,用于训练神经网络和其他机器学习模型。Adam结合了梯度下降的思想和自适应学习率的特性,旨在解决传统梯度下降算法中学习率固定和难以选择的问题。它在深度学习中广泛使用,通常能够加速模型的训练和提高性能。

以下是Adam算法的主要思想和关键步骤:

  1. 初始化参数:首先,为模型的参数(权重和偏置)分配初始值,通常是随机初始化。

  2. 初始化累积梯度和累积平方梯度:Adam维护两个累积变量,一个是梯度的指数移动平均(通常称为动量或一阶矩),另一个是梯度的平方的指数移动平均(通常称为RMSprop或二阶矩)。这两个变量分别初始化为零。

  3. 计算梯度:使用训练数据的损失函数计算当前梯度,表示损失函数对于每个参数的变化率。

  4. 更新动量和RMSprop累积:在每次迭代中,Adam使用指数移动平均方法来更新梯度的动量和RMSprop累积,以捕捉梯度变化的趋势。这有助于适应不同参数的尺度和梯度的变化情况。

  5. 修正偏差:由于动量和RMSprop的累积在初始时会出现偏差,Adam引入了修正偏差项,以修正这些偏差。

  6. 计算学习率:Adam引入了自适应学习率,即每个参数具有不同的学习率。学习率的计算基于动量和RMSprop的累积,并通过修正偏差项来校正。

  7. 更新参数:使用计算得到的学习率,根据以下公式来更新模型的参数:

    \(\theta_{t+1} = \theta_t - \eta \cdot \frac{m_t}{\sqrt{v_t} + \epsilon}\)

    其中:

    • \(\theta_{t+1}\) 是更新后的参数值。
    • \(\theta_t\) 是当前参数值。
    • \(\eta\) 是学习率。
    • \(m_t\) 是动量的累积。
    • \(v_t\) 是RMSprop的累积。
    • \(\epsilon\) 是一个小的常数,通常用来防止分母为零。

Adam的优点包括自适应学习率、速度较快的收敛和较好的性能。然而,需要谨慎选择学习率和其他超参数,以免过拟合。Adam是深度学习中常用的优化算法之一,通常能够在模型训练中表现出色。

Rmsprop(Root Mean Square Propagation): 均方根传播

RMSprop(Root Mean Square Propagation)是一种优化算法,用于训练神经网络和其他机器学习模型。它是一种自适应学习率算法,旨在解决传统梯度下降算法中学习率固定的问题。RMSprop的主要目标是通过自动调整每个参数的学习率,来加速模型的收敛并提高性能。

以下是RMSprop算法的工作原理和关键步骤:

  1. 初始化参数:首先,为模型的参数(权重)分配初始值,通常是随机初始化。

  2. 计算梯度:使用训练数据的损失函数计算梯度,表示损失函数对于每个参数的变化率。

  3. 初始化累积平方梯度:RMSprop维护一个累积平方梯度的移动平均值,通常初始化为零。

  4. 更新累积平方梯度:在每次迭代中,计算当前梯度的平方,并使用指数移动平均方法将其添加到累积平方梯度中。这有助于捕捉梯度的变化趋势。

  5. 计算学习率:RMSprop引入了一个自适应的学习率,该学习率是根据累积平方梯度来计算的。它用于调整每个参数的学习率,以便在梯度变化大时降低学习率,从而减小参数的更新幅度,而在梯度变化小时增加学习率,从而更快地收敛。

  6. 更新参数:使用计算得到的学习率,根据以下公式来更新模型的参数:

    \(\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2] + \epsilon}} \cdot g\)

    其中:

    • \(\theta_{t+1}\) 是更新后的参数值。
    • \(\theta_t\) 是当前参数值。
    • \(\eta\) 是学习率。
    • \(E[g^2]\) 是平方梯度的指数移动平均。
    • \(\epsilon\) 是一个小的常数,通常用来防止分母为零。

RMSprop的关键优点是它可以自动调整学习率,因此对于不同参数和不同时间步的梯度变化具有良好的适应性。这有助于加速收敛,尤其是在具有稀疏梯度或不同尺度的参数时。然而,需要注意的是,RMSprop不具有二阶信息(Hessian矩阵),因此在某些情况下,可能会受到局部极小值的影响。

RMSprop是深度学习中常用的优化算法之一,通常与其他自适应学习率算法如Adam一起使用,以提高模型的性能和收敛速度。

对比

SGD(随机梯度下降),Adam,和RMSprop都是用于优化机器学习模型的梯度下降算法的变种。它们各自有不同的优点和缺点,适用于不同的场景。

  1. SGD(随机梯度下降):

    优点:

    • 简单易实现,计算速度快。
    • 适用于大规模数据集,因为每次只使用一个样本。
    • 具有随机性,可以帮助跳出局部极小值。

    缺点:

    • 收敛速度相对较慢,特别是在损失函数具有强烈非凸性的情况下。
    • 参数更新的路径较不稳定,可能导致震荡。

    适用场景:

    • 大规模数据集。
    • 当计算资源有限或需要快速原型设计时。
    • 在随机性有助于逃脱局部极小值的问题上。
  2. RMSprop(Root Mean Square Propagation):

    优点:

    • 自适应学习率,能够加速收敛。
    • 对于非平稳性目标函数(损失函数变化较快)更稳定。
    • 相对容易调整参数。

    缺点:

    • 仍可能需要手动调整学习率和其他超参数。
    • 有时可能受到局部极小值的困扰。

    适用场景:

    • 大多数深度学习任务。
    • 当需要加速收敛并提高性能时。
  3. Adam(Adaptive Moment Estimation):

    优点:

    • 自适应学习率,结合了动量和RMSprop。
    • 通常能够快速收敛,并在实践中表现良好。
    • 不需要手动调整学习率。

    缺点:

    • 可能对超参数敏感,需要仔细调整。
    • 有时可能陷入局部极小值。

    适用场景:

    • 深度学习任务中常用。
    • 当需要自适应学习率和良好的性能时。

总的来说,选择合适的优化算法取决于您的具体问题和数据。一般而言,Adam是一个通用性较强的优化算法,适用于大多数深度学习任务。RMSprop也是一个不错的选择,特别适用于非平稳性目标函数。SGD通常在大规模数据集或计算资源受限的情况下使用。在实际应用中,往往需要通过交叉验证和实验来确定哪种算法最适合您的问题。此外,超参数调整也是非常重要的,包括学习率、动量、和正则化等。

结构

Embeding

Self-Attention

Add & Norm

Feed Forward

Multi-Head Attention

输入A对应多个Attention, 得到多个输出O1, O2, O3... 然后将输出concat起来,通过一个linear层,转换为最终的输出。

意义为,每个注意力头可能关注的是不同的部分,然后将这些部分的信息融合起来。

参考

基础参数

learning rate: 学习率

步长,用来控制参数更新的幅度。 每次训练更新参数时,参数的更新幅度为:learning rate * gradient。 学习率用于控制参数更新的幅度,如果学习率过大,可能会导致参数更新过大,导致模型无法收敛;如果学习率过小,可能会导致参数更新过小,导致模型收敛速度过慢。

例如:有3个点 A, B, C。之间间隔是0.01, B点为最优解,但是如果学习率太高,步长太长,可能会直接跳过B,直接到达C。

gradient: 梯度

目标函数的偏导数,用来表示参数更新的方向。

iteration: 迭代次数

epoch: epoch

周期,一次完整的训练过程,包括前向传播、反向传播、参数更新。

batch size: batch size

每次训练的样本数。

weight: 权重

矩阵中的每个元素,用来表示输入和输出之间的关系。

bias: 偏置

阅读全文 »

范例(Paradigms)

监督学习(Supervised Learning)

提供带有标签的数据集进行训练,常用于分类和回归问题。

  • 线性回归(Linear Regression)
  • 逻辑回归(Logistic Regression)
  • 朴素贝叶斯(Naive Bayes)
  • 决策树(Decision Tree)
  • Ensemble
    • 随机森林(Random Forest)
    • AdaBoost
    • Gradient Boosting
  • k-近邻(k-Nearest Neighbors)
  • 支持向量机(Support Vector Machine)
  • 人工神经网络(Artificial Neural Network)

无监督学习(Unsupervised Learning)

训练时候不提供标签,让模型自己归纳、提取特征。常用于聚类问题。

常见算法和模型:

  • k均值聚类(k-Means Clustering)
  • 霍夫菲尔德网络(Hopfield Network)
  • Boltzmann机(Boltzmann Machine)
  • 自编码器(Autoencoder)
  • VAE(Variational Autoencoder)

半监督学习(Semi-Supervised Learning)

也被称为弱监督学习(Weakly Supervised Learning)

真实情况下,不会有那么多已经标好的数据进行训练,所以需要使用半监督学习的方式,将无标签的数据和有标签的数据一起进行训练。

自监督学习 (Self-supervised Learning)

是一种半监督学习的方式,通过自身的输入数据来学习,不需要标签。自动学习出有用的特征,从而为后续的监督学习提供有用的特征表示。

常用于图像分类、语音识别等。

例如:将无标记的图像进行旋转,加噪点,遮挡,镜像等方式,生成一组具有相似性的数据,让模型提取出这些数据的共性,从而学习到有用的特征。CLIP模型就是使用类似的方法, 输入文本和图像,让模型自己学习出文本和图像之间的关系,从而实现图像和文本的相互转换。

  • 对比学习(Contrastive Learning): 对比正样本和负样本,让模型学习出正样本和负样本之间的差异。
  • 非对比学习(Non-Contrastive Learning): 只使用正样本,不使用负样本。

强化学习 (Reinforcement Learning)

给定一个环境(env),和一些行动(action),让模型在环境中进行行动,每次行动后,环境会给出一个奖励(reward),重复步骤,让模型学习如何在环境中获得最大的奖励。

阅读全文 »

模型

MLP(Multi Layer Perceptron): 多层感知机

Multi-layer perceptron 是由多层全连接层组成的神经网络,每一层的输入都是上一层的输出,最后一层的输出就是网络的输出。

阅读全文 »

mango支持远端用户连接(创建用户)

> use target_db

> db.createUser({
user: 'userName',
pwd: 'secretPassword',
roles: [
{ role: 'dbAdmin', db:'target_db'},
{ role: 'readWrite', db:'target_db'},
]
})
阅读全文 »
0%