某app zzReqSign 算法还原分析过程

news2024/11/16 14:18:07

文章目录

  • 前言
  • 一、抓包确定目标
  • 二、反编译定位加密位置
  • 三、反编译定位加密位置
  • 四、frida hook验证
  • 五、进一步分析so
  • 六、算法还原
  • 结束语
    • ------------------------------------------------END--------------------------------------------


前言

工欲善其事必先利其器 准备工具

  1. Fiddler 或任意一款抓包工具
  2. 真机或者模拟器
  3. VSCode
  4. Frida
  5. Jadx\Jeb\GDA 任选一款
  6. IDA

一、抓包确定目标

分析加密第一步 先抓包确定参数 所以老规矩 打开FD先抓包
在这里插入图片描述其中 zzReqSign 便是我们需要还原的算法 我们查课发现没有加固 直接丢进jadx进行反编译

二、反编译定位加密位置

在这里插入图片描述
通过jadx反编译后搜索初步定位到这里 发现是个native 方法 那么加密在so层 上面 System.loadLibrary(“signLib”); 就是加载so的指令 其中 signLib就是so名字

三、反编译定位加密位置

解压apk 去lib目录寻找是否有这个文件
在这里插入图片描述
发现确实有这个so 拖入IDA 导出函数 搜索 getSign

定位如下位置:
在这里插入图片描述
代码如下:

int __fastcall Java_com_zhuanzhuan_sign_SignUtil_getSign(JNIEnv_ *a1, int a2, int a3, int a4)
{
  const char *app_sign_sha1; // r0
  struct _jobject *v9; // r8
  signed int v10; // r5
  int DevID; // r0
  struct _jobject *v12; // r8
  int v13; // r9
  jbyte *v14; // r6
  jsize v15; // r10
  _BYTE *v16; // r8
  signed int i; // r11
  jbyte v18; // r4
  int v19; // r1
  JNIEnv_ *v20; // r4
  int v21; // r9
  int MD5; // r10
  int v24; // [sp+8h] [bp-30h]
  struct _jobject *v25; // [sp+Ch] [bp-2Ch]
  struct _jobject *v26; // [sp+10h] [bp-28h]
  JNIEnv_ *v27; // [sp+14h] [bp-24h]
  jbyte *v28; // [sp+18h] [bp-20h]

  if ( !a3 )
    return 0;
  app_sign_sha1 = get_app_sign_sha1(a1, a4);
  if ( !app_sign_sha1 )
    return 0;
  if ( strcmp(app_sign_sha1, app_sing_str) )
    return 0;
  v9 = toBytes(a1, a3);
  v10 = a1->functions->GetArrayLength(a1, v9);
  v28 = a1->functions->GetByteArrayElements(a1, v9, 0);
  DevID = getDevID(a1, a2);
  if ( !DevID )
    return 0;
  v26 = v9;
  v24 = DevID;
  v12 = toBytes(a1, DevID);
  v13 = 0;
  v14 = a1->functions->GetByteArrayElements(a1, v12, 0);
  v27 = a1;
  v25 = v12;
  v15 = a1->functions->GetArrayLength(a1, v12);
  v16 = malloc(v10);
  for ( i = 0; i < v10; ++i )
  {
    v18 = v28[v13 % v10];
    v19 = (v13 + 1) % v15;
    v13 += 2;
    v16[i] = v14[v19] ^ v18;
  }
  v20 = v27;
  v21 = v27->functions->NewByteArray(&v27->functions, v10 + 9);
  (v20->functions->SetByteArrayRegion)(v20, v21, 0, v10, v16, a3);
  v20->functions->SetByteArrayRegion(&v20->functions, v21, v10, 9, "smiletozz");
  MD5 = getMD5(v27, v21);
  v20->functions->DeleteLocalRef(&v20->functions, v21);
  free(v16);
  v20->functions->DeleteLocalRef(&v20->functions, v24);
  v20->functions->ReleaseByteArrayElements(&v20->functions, v25, v14, 0);
  v20->functions->ReleaseByteArrayElements(&v20->functions, v26, v28, 0);
  v20->functions->DeleteLocalRef(&v20->functions, v25);
  v20->functions->DeleteLocalRef(&v20->functions, v26);
  return MD5;

这段函数最终返回了MD5 MD5是由 MD5 = getMD5(v27, v21);而来的 我们姑且认为他是一个md5算法 点进去看看

在这里插入图片描述
代码如下:

int __fastcall getDigestedBytes(_JNIEnv *a1, int a2)
{
  struct _jobject *v4; // r6
  jmethodID v5; // r5
  jstring v6; // r0
  _jobject *v7; // r9
  _jmethodID *v8; // r0
  int v9; // r8

  v4 = a1->functions->FindClass(a1, "java/security/MessageDigest");
  v5 = a1->functions->GetStaticMethodID(a1, v4, "getInstance", "(Ljava/lang/String;)Ljava/security/MessageDigest;");
  v6 = a1->functions->NewStringUTF(a1, "MD5");
  v7 = _JNIEnv::CallStaticObjectMethod(a1, v4, v5, v6);
  v8 = a1->functions->GetMethodID(a1, v4, "digest", "([B)[B");
  v9 = _JNIEnv::CallObjectMethod(a1, v7, v8, a2);
  a1->functions->DeleteLocalRef(a1, v4);
  a1->functions->DeleteLocalRef(a1, v7);
  return v9;

在这里插入图片描述 插播一条广子 yzm平台 有需要的朋友们可以看看
点我直达
新用户注册加群即送10000点余额

四、frida hook验证

这段就比较简单了 反射java调用md5算法 到这里好像已经分析完毕 貌似就是个md5算法而已 是不是这样呢?我们试验一下

rida hook java层 getSign方法
代码如下:

let SignUtil = Java.use("com.zhuanzhuan.sign.SignUtil");
SignUtil["getSign"].overload('java.lang.String', 'android.content.Context').implementation = function (str, context) {
    console.log(`SignUtil.getSign is called: str=${str}, context=${context}`);
    let result = this["getSign"](str, context);
    console.log(`SignUtil.getSign result=${result}`);
    return result;
};

抓包结果为:zzReqSign: 47383db507e87badc5bc9ce348a6193e
我们去hook结果搜索
在这里插入图片描述
下面为结果 上面是明文 我们md5一下

在这里插入图片描述

五、进一步分析so

发现结果并不对 那么肯定是在md5之前还有其他操作 我们返回so继续分析

在这里插入图片描述
我们看到有个getDevID 方法

getDevID 代码如下:

int __fastcall getDevID(int a1, int a2)
{
  int v4; // r2

  v4 = (*(*a1 + 452))(a1, a2, "getDeviceId", "()Ljava/lang/String;");
  return j__JNIEnv::CallStaticObjectMethod(a1, a2, v4);
}

也是反射的java 这里对应的好像就是java 层

在这里插入图片描述
我们hook一下此方法 拿到值

let SignUtil = Java.use("com.zhuanzhuan.sign.SignUtil");
SignUtil["getDeviceId"].implementation = function () {
    console.log(`SignUtil.getDeviceId is called`);
    let result = this["getDeviceId"]();
    console.log(`SignUtil.getDeviceId result=${result}`);
    return result;
};

在这里插入图片描述
值=SignUtil.getDeviceId result=BE304BAE68E9C99571DEE26718102680

在这里插入图片描述

六、算法还原

这个md5加密前经过了一段简单处理 代码就不放出来了 有兴趣的自己去研究研究 很简单
在这里插入图片描述


结束语

  1. 云在青天水在瓶
  2. 你以前的选择成为了现在的你,无法改变,而你现在的选择将造就未来的你。

------------------------------------------------END--------------------------------------------

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java“树结构TreeNode”用法详解,二叉树用法实现代码!!!

一、TreeNode用法 在Java中&#xff0c;TreeNode通常用于表示树结构中的节点。在树结构中&#xff0c;每个节点可以有零个或多个子节点&#xff0c;而TreeNode就是这个树结构中的一个节点。通常&#xff0c;树结构是通过链式结构实现的&#xff0c;每个节点有指向其子节点的引…

ubuntu20.04环境搭建:etcd+patroni+pgbouncer+haproxy+keepalived的postgresql集群方案

搭建基于etcdpatronipgbouncerhaproxykeepalived的postgresql集群方案 宿主机操作系统:ubuntu20.04 使用kvm搭建虚拟环境(如没有安装kvm&#xff0c;请先自行安装kvm) 1、安装kvm服务 ①、查看虚拟支持 如果CPU 支持硬件虚拟化则输出结果大于0&#xff0c;安装kvm-ok命令检…

(黑马出品_06)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_06&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术ES搜索和数据分析 今日目标1. 查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例 1.3.精准查询1.3.1.term查询1.3.2.ran…

CSP初赛备考—汉字与运算

汉字 英文字符 英文字符的编码有两种&#xff1a;①ASCII标准码&#xff0c;7位&#xff08;128个字符&#xff09;②ASCII扩展吗&#xff0c;8位&#xff08;256个字符&#xff09; 中文字符 汉字分为两级&#xff1a;①一级汉字&#xff1a;3755个&#xff0c;按汉语拼音字…

STM32CubeIDE基础学习-STM32CubeIDE软件程序下载方法

STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法前言第1章 代码下载第2章 下载器固件更新总结 前言 编写完代码&#xff0c;一般都会选择在线下载程序的方式进行验证该程序是否正确&#xff0c;如果发现结果和…

不会用虚拟机装win10?超详细教程解决你安装中的所有问题!

前言&#xff1a;安装中有任何疑问&#xff0c;可以在评论区提问&#xff0c;博主身经百战会快速解答小伙伴们的疑问 BT、迅雷下载win10镜像&#xff08;首先要下载win10的镜像&#xff09;&#xff1a;ed2k://|file|cn_windows_10_business_editions_version_1903_updated_sep…

恋活2 仿原神人物卡系列2全合集打包

内含&#xff1a;炽沙话事人 芭别尔迪希雅镀金女团 -沙中净水镀金女团 -叶轮舞者珐露珊坎蒂丝柯莱可莉丽莎-叶隐芳名神里绫华-花时来信瑶瑶。 下载地址&#xff1a; https://www.changyouzuhao.cn/13661.html

HarBor私有镜像仓库安装部署

环境准备 #>>> redis $ yum -y install redis $ systemctl enable --now redis $ vim /etc/redis.conf modify: bind <ipaddress> $ systemctl restart redis#>>> nfs $ yum -y install nfs-utils $ mkdir -p /data/harbor $ vi /etc/exports /data/h…

最顶级的Unity团队都在使用的技巧!!!

作为该系列的第二篇文章&#xff0c;今天将给大家分享一下&#xff0c;Unity最资深的团队是如何设置物理、UI和音频的。希望可以帮助大家最大限度的使用Unity引擎。 第一篇给大家介绍了如何提高资源、项目配置和图形的性能&#xff0c;感兴趣的朋友千万不要错过了。 文章链接…

Autosar Crypto Driver学习笔记(一)

文章目录 Crypto DriverPre-ConfigurationCryptographic capabilities加密能力Available Keys可用密钥 General BehaviorNormal OperationFunctional RequirementsSynchronous Job ProcessingAsynchronous Job Processing Design NotesPriority-dependent Job Queue基于优先级的…

一元函数积分学——刷题(16

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 比较这两种题的求解方法 2.解题思路和步骤&#xff1a; 3.13&#xff1a; 这个题就很适合用万能公式&#xff0c;因为可以把1t2消掉&#xff1a; 也可以用三角…

大数据时代的数据保护:分布式存储系统的七大原则

第一原则&#xff1a;“灾”和“备”&#xff0c;区分容灾切换与数据备份的区别 管理对象 管理对象 防什么&#xff1f; 底层逻辑 核心评价指标 容灾切换 IT环境与业 物理灾难 …

基于C++和Qt Creator实现的仿制网易云音乐播放器

目录 总体介绍开发环境技术介绍项目目录项目介绍特殊说明Gitee地址 总体介绍 仿照网易云播放器界面实现&#xff0c;目的在于锻炼C编程能力&#xff0c;熟练掌握Qt Creator各种组件的使用及样式设置、界面布局、QtPlugin技术、QXml读写XML文件方法、Qss文件的编写及使用等。 …

【期刊】ACM Transactions on Privacy and Security

首页截图 subject areas 混合模式 根据官网介绍&#xff0c;本期刊不在金OA行列&#xff0c;可以自主选择出版模式。 出版方向 Topics of interest include 发文量 季刊&#xff0c;发文量很小 图像安全领域 未在今年发表图像安全领域论文。

CentOS 8启动流程

一、BIOS与UEFI BIOS Basic Input Output System的缩写&#xff0c;翻译过来就是“基本输入输出系统”&#xff0c;是一种业界标准的固件接口&#xff0c;第一次出现在1975年&#xff0c;是计算机启动时加载的第一个程序&#xff0c;主要功能是检测和设置计算机硬件&#xff…

【文档智能】再谈基于Transformer架构的文档智能理解方法论和相关数据集

前言 文档的智能解析与理解成为为知识管理的关键环节。特别是在处理扫描文档时&#xff0c;如何有效地理解和提取表单信息&#xff0c;成为了一个具有挑战性的问题。扫描文档的复杂性&#xff0c;包括其结构的多样性、非文本元素的融合以及手写与印刷内容的混合&#xff0c;都…

小程序 van-field label和输入框改成上下布局

在组件上面加个样式就行&#xff1a;custom-style"display:block;" <van-field label"备注说明" type"textarea" clearable title-width"100px" custom-style"display:block;" placeholder"请输入" /> …

JavaScript原型和原型链

JavaScript每个对象拥有一个原型对象 需要注意的是&#xff0c;只有函数对象才有 prototype 属性 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff…

02hadoop伪分布式搭建

3. 环境安装 3.1 安装方式 单机模式 只能启动MapReduce 伪分布式 能启动HDFS、MapReduce 和 YARN的大部分功能 完全分布式 能启动Hadoop的所有功能 3.2 安装JDK 3.2.1 JDK安装步骤 下载JDK安装包&#xff08;下载Linux系统的 .tar.gz 的安装包&#xff09; https://www…

企业微信HOOK协议,新设备二次验证处理

提示设备强制二次验证问题已处理 HOOK&#xff1a;https://www.showdoc.com.cn/1663062930779972/7859611259700402密码&#xff1a;999999999