APP反抓包 - 客户端证书验证进阶(代码混淆)

1.关于混淆

  • 在安卓开发中,对于第三方的包是可以进行混淆的,例如:OKHttp3.Http.Cert.check 被混淆后可以是a.f.c.b 形式。
  • 在安卓开发中,系统包是无法混淆的,例如:java.security.KeyStore不会被混淆。

由于这种的情况的存在,再次审示我们之前的通用脚本,就会发现他是不通用的,例如:

  • 客户端证书校验的frida脚本【不通用,被混淆后无法用】

    Java.use('okhttp3.CertificatePinner');  
    Java.use('com.squareup.okhttp.internal.tls.OkHostnameVerifier');
    
  • 服务端证书校验的frida脚本【通用】

    Java.use("java.security.KeyStore");
    

那如果遇到有存在混淆的app,内部又加入了客户端证书校验,原来的绕过方式就都不能用来,怎么解决呢?

  • Hook系统底层必走的核心方法,获取调用栈
  • 根据调用栈向上寻找 客户端证书校验 代码位置,找其他被混淆后的 类名和方法名
  • 用frida Hook脚本的方式绕过

如下图:未混淆时,客户端证书校验的三个位置:

在这里插入图片描述

如下图:app混淆后,代码会变成这样:

在这里插入图片描述

2.客户端校验和系统方法

客户端校验的顺序分别是:

  • 第1步:调用证书校验
    在这里插入图片描述

  • 第2步:主机校验
    在这里插入图片描述

  • 第3步:pinner公钥校验,这个校验过程本质上是调用CertificatePinner类中的check方法。
    在这里插入图片描述

**注意:**内部按照顺序对这3个过程进行校验,只要有一个无法通过,后续的校验就不会再触发执行。

上述三个校验的触发位置是在:okhttp3.internal.connection.RealConnection类中的connectTls方法,例如:

在这里插入图片描述

2.1 调用栈

我是怎么确定触发校验的位置就是这里的?

最简单的方式就是对我们已开发完成的安卓程序(NetDemo)案例进行Hook,根据他们的调用栈来证明,例如:

Log.e("调用栈", Log.getStackTraceString(new Throwable()));

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2 Hook系统位置

在上述调用栈中发现在证书校验时,底层会走 com.android.org.conscrypt.NativeSsldoHandshake方法。

所以,可以Hook他,根据调用栈向上找到证书校验的位置(其他验证也在旁边)。

Java.perform(function () {
   
    var NativeSsl = Java.use('com.android.org.conscrypt.NativeSsl');
    NativeSsl.doHandshake.overload('java.io.FileDescriptor', 'int').implementation = function (a, b) {
   
        console.log("参数:", a, b);
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        return this.doHandshake(a, b);
    };
});

// frida -UF -l 1.hook_check.js

在这里插入图片描述

对比未混淆和混淆的代码,可以找到相应的证书监测的位置:

在这里插入图片描述

3.滴答清单(案例)

以滴答清单(v6.3.3.0)为例,来展开代码混淆处理的过程。

3.1 现象

打开app,进入注册界面,点击【发送验证码】

  • 未设置代理,可以发送成功
  • 已设置代理,请求发送失败

在这里插入图片描述

那么,内部应该可能是做了客户端校验。

但是,使用justrustme 和 frida 脚本依然不好使,哪就有可能是内部进行了代码混淆。

3.2 寻找connectTls

因为触发客户端校验的位置是在:okhttp3.internal.connection.RealConnection类中的connectTls方法中,所以,我们可以先寻找到这个位置,看他被混淆成了啥?

在这里插入图片描述

可以通过hook系统方法 + 输入调用栈,定位 RealConnection类的connectTls方法

Java.perform(function () {
   
    var NativeSsl = Java.use('com.android.org.conscrypt.NativeSsl');
    NativeSsl.doHandshake.overload('java.io.FileDescriptor', 'int').implementation = function (a, b) {
   
        console.log("参数:", a, b);
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        return this.doHandshake(a, b);
    };
});

// frida -UF -l 1.hook_check.js

在这里插入图片描述

在这里插入图片描述

3.3 pinner校验

3.3.1 寻找位置

pinner校验比较常见,在这里也比较简单:

aVar2.f28365k.a(aVar2.f28355a.f28521d, a11.f28513c);

- 在安卓开发中,这个a方法其实就是 CertificatePinner类中的check方法
- 并且 aVar2.f28365k 返回的就是CertificatePinner类

在这里插入图片描述

在这里插入图片描述

所以,我们参考之前hook的check方法,来编写hook脚本,对此方法进行hook,例如:

在这里插入图片描述

Java.perform(function () {
   
    var pinner = Java.use('rk.f');
    pinner.a.overload('java.lang.String', 'java.util.List').implementation 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621933.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于GD32的简易数字示波器(5)- 软件_控制LED

这期记录的是项目实战,做一个简易的数字示波器。 教程来源于嘉立创,帖子主要做学习记录,方便以后查看。 本期主要介绍GPIO口的输入输出模式,使用其中的输出模式驱动LED。详细教程可观看下方链接。 2.2 LED控制实验 语雀 1、LE…

synchronized 使用及实现原理

synchronized 关键字 如何使用 synchronized 关键字的使用方式主要有下面 3 种: 修饰实例方法 修饰静态方法 修饰代码块 1、修饰实例方法 (锁当前对象实例) 给当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁 。 …

ViewModel 完全指南:实践与背后原理全解

一、引言 在现代Android应用开发中,处理UI数据的有效管理和状态保持是开发者面临的重要挑战之一。Google推出的Jetpack组件库中的ViewModel已成为解决这些问题的关键工具。ViewModel旨在以生命周期意识的方式存储和管理界面相关的数据,从而使数据在配置…

暴力法解决最近对问题和凸包问题-实现可视化

目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离,然后进行比较找出第一个最近对,一个一个进行比较。 大概思路就是如图(每个圈代表一个数对) 第一个和其他四个比较 第二个和其他三个比较 …

C++类和对象下——实现日期类

前言 在学习了类和对象的六大成员函数后,为了巩固我们学习的知识可以手写一个日期类来帮助我们理解类和对象,加深对于其的了解。 默认函数 构造函数 既然是写类和对象,我们首先就要定义一个类,然后根据实际需要来加入类的数据与函…

计算机Java项目|Springboot房产销售系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

Windows下安装Node.js、npm和electronic,并运行一个Hello, World!脚本程序

20240510 By wdhuag 目录 简介: 参考: 安装Node.js 安装npm 配置npm: 修改包存放目录和缓存目录 切换镜像源 使用 nrm 切换镜像源 安装Electron 运行一个Hello, World!脚本程序 安装Yarn JavaScript 指南 简介: Nod…

flash attention的CUDA实现探讨-V3

之前关于flash attention的实现参考添加链接描述,添加链接描述,添加链接描述 lash attention的数学变换:给定三个矩阵Q,K,V,形状都是[N,d],计算S=QK.T,然后针对dim=1做softmax,然后和V继续做矩阵乘法得到形状为[N,d]的输出矩阵O,即O=softmax(QK.T,dim=1)V。 下面本人的…

物联网设计竞赛_2_Jetson Nano中文输入法配置安装vscode

1、装ibus和ibus依赖框架 sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 2、启动ibus im-config -s ibus 3、安装拼音引擎 sudo apt-get install ibus-pinyin 4、重启linux系统 shutdown -r now 5、进入ibus设置添加中文 ibus-setup 插入中文p…

四川汇昌联信:拼多多网点怎么开?大概需要多少钱?

想要开一家拼多多网点,你肯定很关心需要准备多少资金。下面,我们就来详细解答这个问题,并从多个角度分析开设网点的要点。 一、 开设拼多多网点,首要任务是确定启动资金。根据不同的经营模式和地区差异,成本会有所不同…

基于SpringBoot + Vue的兼职网站管理系统设计与实现+毕业论文+答辩PPT

系统介绍 本系统包含管理员、用户、企业三个角色。 管理员角色:前台首页、个人中心、用户管理、企业管理、兼职信息管理、职位申请管理、留言板管理、系统管理。 用户角色:前台首页、个人中心、职位申请管理。 企业角色:前台首页、个人中心、…

JUC下的ThreadLocalRandom详解

ThreadLocalRandom 是Java并发包(java.util.concurrent)中提供的一个随机数生成器类,它是从Java 7开始引入的。相较于传统的Math.random()或Random类,ThreadLocalRandom更适用于多线程环境,因为它为每个线程维护了一个…

【spring】application.yml导入额外配置文件

有时候application.yml 已经配置很多配置已经很大很乱了想把他们拆出去放在一个独立的XX.yml文件管理。这时候就用到了 spring.config.import 属性。 spring.config.import spring.config.import 是 Spring Boot 2.4 版本引入的一个配置属性,用于导入额外的配置数…

Java入门基础学习笔记21——Scanner

在程序中接收用户通过键盘输入的数据: 需求: 请在程序中,提示用户通过键盘输入自己的姓名、年龄、并能在程序中收到这些信息,怎么解决? Java已经写好了实现程序,我们调用即可。 API:Applicat…

解决 XXL-Job 端口额外占用问题 小结

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java技术栈笔记 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 问题解决 2.1. 下载源码 2.2. 启动admin服务器 2.3. 项目引入c…

MySQL-InnoDB数据存储结构

1、存储结构-页 索引结构提供了高效的索引方式,索引信息以及数据记录都保存在数据文件或索引文件中(本质存储在页结构中) 1.1、磁盘与内存交互的基本单位:页 在InnoDB中将数据划分为若干页,页的默认大小为&#xff…

OpenCV-基于累计直方图的中值滤波算法

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 基于累计直方图的中值滤波算法是一种图像处理技术,用于去除图像中的噪声。它利用了像素值的频数分布&#…

LeetCode/NowCoder-链表经典算法OJ练习2

最好的,不一定是最合适的;最合适的,才是真正最好的。💓💓💓 目录 说在前面 题目一:分割链表 题目二:环形链表的约瑟夫问题 SUMUP结尾 说在前面 dear朋友们大家好!&…

卷积神经网络边缘识别

为什卷积神经网络能够识别图片呢?是基于图片相似度比较,两张图片的点击越大说明两张图片越像,比如我们那狗胡子的图片去比较,如果相似度很高,就是认为这个动物更像狗。点积越大,图片越相似,这个…

Windows2016系统禁止关闭系统自动更新教程

目录 1.输入cmd--适合系统2016版本2.输入sconfig,然后按回车键3.输入5,然后按回车键4.示例需要设置为手动更新,即输入M,然后按回车键 1.输入cmd–适合系统2016版本 2.输入sconfig,然后按回车键 3.输入5,然后…