某知乎APP - X-Zse-96

⚠️前言⚠️

本文仅用于学术交流。
学习探讨逆向知识,欢迎私信共享学习心得。
如有侵权,联系博主删除。
请勿商用,否则后果自负。

接口网址

app 版本: 8.10.0
aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM=

在这里插入图片描述

加密位置分析

> 老规矩,jadx打开,先全局检索一下。

在这里插入图片描述

  • 居然没有搜到任何结果,应该做了混淆
> 由于 X-Zse-96 参数存在于headers中,全局检索一下 addHeader 看有没有啥线索

在这里插入图片描述

  • 发现在添加请求头信息的时候,字段名貌似通过 H.d 做了转换,这也可能是我们搜不到关键词的原因
> frida hook H.d,通过判断 result 减少日志打印,方便我们查看
Java.perform(function () {var h = Java.use('com.secneo.apkwrapper.H');h.d.implementation = function(str){var result = this.d(str);if(result == 'X-Zse-96'){send('arg: ' + str);send('result :' + result);}return result;};
})

在这里插入图片描述

  • 果然是通过H.d方法转换的,那我们可以直接检索一下 G51CEEF09BA7DF27F 来看一下
> 全局检索 G51CEEF09BA7DF27F,这结果就很少了,来看一下这个 addHeader

在这里插入图片描述
在这里插入图片描述

  • 就是这里了,那 H.d(“G38CD8525”) + new String(this.f61339c.encode(encrypt)) 有可能就是我们想要的最终结果
> H.d(“G38CD8525”) 的结果是什么?我们通过 frida hook 固定参数的形式来看一下
Java.perform(function () {var h = Java.use('com.secneo.apkwrapper.H');h.d.implementation = function(str){str = "G38CD8525";var result = this.d(str);send('arg: ' + str);send('result :' + result);return result;};
})

在这里插入图片描述

  • 这不就是 X-Zse-96 的特征值嘛,那我们只需要搞定 new String(this.f61339c.encode(encrypt)) 就可以拿到加密值了

加密逻辑分析

> 首先来看一下这个 a3 是怎么生成,hook 一下这个 a 方法

在这里插入图片描述
在这里插入图片描述

  • 通过 hook 的结果可以看出它参数由4部分组成
  • 101_1_1.0+接口路径及参数+app版本号+Bearer 2.1rDb…
  • 最后一部分经多次测试也是固定不变的,所以对于我们来说唯一需要传递的参数就是 接口的路径及参数
>>这个 a 是一个单独的方法不需要hook,我们直接扣代码即可,代码如下:

在这里插入图片描述

private static String a(String str) throws Exception{return String.format("%032X", new BigInteger(1, MessageDigest.getInstance("MD5").digest(str.getBytes())));}
  • 到这里我们就得到了 a3 的值
> 下面来看一下 encrypt 是怎么生成的

在这里插入图片描述

  • 发现生成 encrypt 值的方法存在于接口类b中,那么一定会在某个地方有一个类继承了这个b,并实现了 encrypt 方法
  • 全局检索一下关键词 接口类 b 所在包名, 这就很明了了。在这里插入图片描述
  • 最终就会找到这个方法
    在这里插入图片描述
>> frida hook 一下这个a方法

在这里插入图片描述

  • 三个参数:参数1 - a3.toLowerCase().getBytes()
  • 参数 2,3 固定值,不要问为什么,一步步方法跟过来你就知道了。😀 😀 😀
>> 参数搞明白之后我们再回头看这个 a 方法

在这里插入图片描述

  • 我们需要搞定三个方法就可以得到 encrypt
  • 首先 b.b, 这个方法直接扣代码就可以了
    在这里插入图片描述
    1. CryptoTool.laesEncryptByteArr,此方法存在于 native 层,可以 hook 得到
      在这里插入图片描述
    1. b.a,和 b.b 一样也是直接扣代码即可
      在这里插入图片描述
  • 至此,encrypt 值就搞定了。
> 下面进入最后一步,发现这个 encode 的方法也是一个接口类

在这里插入图片描述在这里插入图片描述

  • 同样的方法看一下这个 a 是在哪里复现的。。。这里 encrypt 传过来之后通过 j.a 生成 a2,并返回
    在这里插入图片描述
  • j.a 其实就是做了一个 Base64 加密
    在这里插入图片描述
  • 至此,X-Zse-96 加密逻辑就全部分析结束了。

Xposed hook

关键代码:  这里只保留关键性逻辑
@Action("x-zse-96")
public class ZhihuHandler implements RequestHandler {@AutoBindprivate String p1; // 以base64的形式传入@Overridepublic void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {try {log("进来了。。。 开始生成 x_zse_96。。。");String p1_decode = new String(Base64.decode(p1, 2));log(p1_decode);// System.out.println("******************helloword*****************************");StringBuilder sb = new StringBuilder();String temp_str = "101_1_1.0+" + p1_decode + "+8.10.0+Bearer 2.1...";sb.append(temp_str);String result = sb.toString().substring(0, sb.length() - 1);String a3 = a(result);byte[] barr_a3 = a3.toLowerCase().getBytes();// 生成变量 encrypt   b.b(CryptoTool.laesEncryptByteArr(b.a(bArr, str, bArr2), str, bArr2), str, bArr2);String arg2_str = "541a3a5896...";byte[] arg3_barr = new byte[]{ ... };byte[] result_ba = b_a(barr_a3, arg2_str, arg3_barr);// hook so层方法 aesEncryptByteArrfinal Class<?> clazz = XposedHelpers.findClass("com.bangcle.CryptoTool", HookZhihu.loadPackageParam.classLoader);// 注意标明返回值类型 (byte[])  静态方法可以直接使用类名调用byte[] result_CryptoTool = (byte[]) XposedHelpers.callStaticMethod(clazz,"laesEncryptByteArr",new Object[]{result_ba,arg2_str,arg3_barr});byte[] encrypt = b_b(result_CryptoTool, arg2_str, arg3_barr);String x_zse_96 = "1.0_" + new String(Base64.encodeToString(encrypt, 2).getBytes());sekiroResponse.success(x_zse_96);}catch (Exception e){e.printStackTrace();}}// throws Exception 表示的是本方法不处理异常,交给被调用处处理private static String a(String str) throws Exception{return String.format("%032X", new BigInteger(1, MessageDigest.getInstance("MD5").digest(str.getBytes())));}public static byte[] b_a(byte[] bArr, String str, byte[] bArr2) {...}public static byte[] b_b(byte[] bArr, String str, byte[] bArr2) {...}
}

最终成果展示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EOCRDS1T-05S反时限过电流保护继电器 施耐德韩国三和

三和EOCR株式会社是韩国zui大的电动机保护器生产企业&#xff0c;公司由金仁锡博士&#xff08;施耐德电气集团韩国*执行官&#xff09;于1981年建立。 2001年&#xff0c;为了把企业发展成性的、战略性企业&#xff0c;随后加入了法国施耐德电气集团公司。 EOCR主要产品有电…

YOLO新鲜腐烂水果检测数据集:8类,11000多张图像,标注完整

YOLO新鲜腐烂水果检测数据集&#xff1a;8类&#xff0c;11000多张图像&#xff0c;yolo标注完整&#xff0c;包含烂苹果&#xff0c;烂香蕉&#xff0c;烂橙子&#xff0c;烂石榴&#xff0c;好苹果&#xff0c;好香蕉&#xff0c;好橙子&#xff0c;好石榴8个类别 图像统一分…

<计算机网络自顶向下> Internet Protocol

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号&#xff08;IPV4 0100, IPV6 0110&#xff09; headlen&#xff1a;head的长度&#xff08;头部长度字段&#xff08;IHL&#xff09;指定了头部的长度&#xff0c;以32位字&#xff08;4字节&#xff09;为单位计算。这…

OpenHarmony语言基础类库【@ohos.util.LightWeightMap (非线性容器LightWeightMap)】

LightWeightMap可用于存储具有关联关系的key-value键值对集合&#xff0c;存储元素中key值唯一&#xff0c;每个key对应一个value。 LightWeightMap依据泛型定义&#xff0c;采用轻量级结构&#xff0c;初始默认容量大小为8&#xff0c;每次扩容大小为原始容量的两倍。 集合中…

ElasticSearch语句中must,must_not,should 组合关系

前言&#xff1a; 在实际应用中&#xff0c;发现当bool中同时使用must和should 没有达到想要的想过&#xff0c;而是只展示了must中的命中数据&#xff0c;所以打算探究一下bool中 三种逻辑关系的组合。 上述查询语句只展示了must的结果&#xff0c;没有should中的结果&#…

OSPF的LSA详解

一、什么是LSA&#xff1f;LSA作用&#xff1f; 在OSPF协议中&#xff0c;LSA全称链路状态通告&#xff0c;主要由LSA头部信息&#xff08;LSA摘要&#xff09;和链路状态组成。部分LSA只有LSA头部信息&#xff0c;无链路状态信息。使用LSA来传递路由信息和拓扑信息&#xff0c…

HarmonyOS编程实践系列:第一节 - 创建健康App欢迎页

系列文章目录 &#xff08;零&#xff09;鸿蒙HarmonyOS入门&#xff1a;如何配置环境&#xff0c;输出“Hello World“ &#xff08;一&#xff09;鸿蒙HarmonyOS开发基础 &#xff08;二&#xff09;鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 &#xff08;三&#xff09;鸿蒙…

STM32(垃圾桶开关盖)

封装超声波的代码 一、配置引脚的连接 二、配置 三、写代码 四、配置定时器 查找合适的定时器 其实这里的是remap&#xff08;复用&#xff09;&#xff0c;不重要 重要的是看Default才对 仔细查看之后发现还是能用的 先把开关灯封装好 再封装舵机 ----------------------…

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式)&#xff0c;由于老版本的IDEA还在用&#xff0c;所以并没有删除&#xff0c;但是安装完后发现点击idea64.exe后没有反应&#xff0c;于是网上找了好多方法最后解决了 下面是我的解决过程 新版本&#xff1a;IntelliJIdea2024.1 老版本: Intelli…

智慧旅游引领旅游行业创新发展:借助智能科技的力量,推动旅游服务的个性化、精准化,提升游客的满意度和忠诚度

随着信息技术的迅猛发展和广泛应用&#xff0c;智慧旅游已成为旅游行业创新发展的重要引擎。智慧旅游借助智能科技的力量&#xff0c;推动旅游服务的个性化、精准化&#xff0c;不仅提升了游客的满意度和忠诚度&#xff0c;也为旅游行业的可持续发展注入了新的活力。本文将从智…

优化大型语言模型交互:提升查询和提示效果的26条原则

推荐下arxiv挂的一个提示词教程&#xff1a; https://github.com/VILA-Lab/ATLAS https://arxiv.org/abs/2312.16171 它提出了一套26条指导原则&#xff0c;改善和优化与大型语言模型&#xff08;LLMs&#xff09;的交互过程。通过这些原则&#xff0c;旨在简化对LLMs的查询和…

序列化与反序列化

【一】序列化跟反序列化 # api接口开发&#xff0c;最核心最常见的一个过程就是序列化&#xff0c;所谓序列化就是把数据转换格式&#xff0c;序列化可以分两个阶段&#xff1a;【序列化值的是转换数据格式&#xff1a;序列化&#xff0c;返序列化】# 序列化&#xff1a; 把我们…

如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)

sbt下载官网 选择对应的版本和安装程序 Download | sbt (scala-sbt.org) 安装 解压 将sbt-1.9.0.tgz上传到xshell&#xff0c;并解压 解压&#xff1a; tar -zxvf sbt-1.9.0.tgz 配置 1、在/home/hadoop/sbt中创建sbt脚本 /home/hadoop/sbt 注意要改成自己的地址 cd …

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

vue3插槽的name和v-slot的研究

slot可以分为具名插槽和默认,默认插槽name是default 在父组件的template需要些v-slot/#,没写不生效,而在父组件下,而没被template包含的默认放在template且含有#default. 1)没写slot,可以不写template,也可写default的template2)写了name的slot,即使是default也必须些template…

linux开发板开机启动向日葵

硬件&#xff1a;orangepi 5 pro 操作系统&#xff1a;ubuntu 20.4 lts 安装向日葵 根据我的实测&#xff0c;arm架构的ubuntu系统只能安装向日葵提供的麒麟系统的那个版本&#xff0c;具体安装方式官网下载页面有 允许任意用户连接到 X11 使用root用户登录后打开终端输入一下…

JAVASE->数据结构|顺序表底层逻辑

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 什么是 List 2. List 常见接口介绍 3. …

python:reportlab 生成pdf:基本用法。

1.首先&#xff0c;打开cmd&#xff0c;安装reportlab pip install -i https://pypi.tuna.tsinghua.edu.cn/simple reportlab #从清华镜像安装更快 然后就可以使用其基本用法。 from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvasdef genera…

Swift - Playground

文章目录 Swift - Playground1. 新建Playground2. View3. 图片4. ViewController5. Playground - 多Page6. 注释6.1 Playground的注释支持markup语法&#xff08;与markdown相似&#xff09;6.1.1 语法 Swift - Playground Playground可以快速预览代码效果&#xff0c;是学习语…

解决Blender导出FBX文件到Unity坐标轴错误的问题

发现Blender的模型导入到Unity里面有问题,简单研究了下发现是坐标系不同,Unity使用的是左手坐标系,Blender使用的是右手坐标系 。 下面直接将如何解决 首先忽略Blender的右手坐标系以及Z轴朝上的事&#xff0c;依照unity坐标系情况修改模型物体的旋转&#xff0c;以Blender猴…