安卓逆向 | JEB静态分析APK

JEB反编译APK-静态审计,找到加密算法

参考来源:https://blog.csdn.net/weixin_38819889/article/details/108910525

apk来源:https://app5.scrape.center/

软件&工具:JEB / 雷电模拟器 / burpsuite

声明:scrape.center是一个爬虫逆向练习网站,本文仅做学习交流使用,并未进行渗透测试,切勿用作其他用途。

抓包分析

模拟器设置好代理之后,安装APK,通过burp对APK进行抓包:

图片

图片

通过抓包,我们可以看到,APK会去请求/api/movie这个URL,然后会返回一些JSON格式数据,从数据上可以看到,正是我们APK运行之后的展现出来的电影名字等信息。

我们将请求包发送到Repeater,重放后发现会弹出401未认证,并且尝试将token字段和值删除后,同样如此,因此在这个请求中,我们可以知道:

  • token字段是必须的

  • token字段可能含有时间戳等信息

  • token字段经过了加密

图片

接下来,我们对此APK进行逆向分析,尝试将token的加密算法找出来,然后尝试编写脚本来绕过。

JEB静态分析

将APK拖入JEB之后,JEB会自动进行反编译:

图片

刚拖入之后,只会展示出反编译的smali代码,这个时候我们该如何下手?

通过观察我们可以得知,在URL中存在一些特征字符串,比如/api/movie,我们可以通过搜索特征字符串,进行快速定位,在smali代码窗口 ctrl+F打开查找窗口,直接查找/api/movie

图片

 

.field public static final indexPath:String = "/api/movie"

可以看到,从大致的英文上看,是声明一个静态的String类型变量,变量名为indexPath,值为/api/movie,不懂的话也可以问AI,静态的话一般是叫做常量,不可更改。

图片

但是smali代码对于我们来说还是比较难理解,因此我们可以将它解析成java代码,方便我们阅读:选中这一行,右键-> Decomplie/解析

图片

在右侧会新开一个窗口,其中是解析后的java代码:

 

package com.goldze.mvvmhabit.data.source.http.service;
import io.reactivex.Observable;import retrofit2.http.GET;import retrofit2.http.Query;
public interface MovieApiService { public static final String indexPath = "/api/movie";
@GET("/api/movie") Observable index(@Query("offset") int arg1, @Query("limit") int arg2, @Query("token") String arg3);}

从大致意思上也能看出,是发送GET请求,路径为/api/movie ,请求参数为offset,limit,token,而这正好与我们burp抓到的请求包相对应。

图片

这里我们可以看到,offset,limit,token三个参数给到了index这个方法,那么我们跟进index这个方法,看看它是如何实现并处理参数的,选中index,右键->corss-references / 交叉引用

图片

此时会弹出窗口,查找引用它的地方,我们选中它,然后点OK进行跳转

图片

图片

 

public Observable index(int arg3, int arg4) { ArrayList v1 = new ArrayList(); v1.add("/api/movie"); String v0 = Encrypt.encrypt(v1); return this.apiService.index((arg3 - 1) * arg4, arg4, v0); }}

可以看到index的逻辑,新建了一个动态数组v1,然后向v1中添加一个元素/api/movie,然后通过encrypt方法进行处理,从名字上可以看出是一个加密方法,给到v0,从传参上分析可以得知,arg3为offset,arg4为limit,那么v0就是token了,因此,我们需要分析encrypt方法是如何对v1进行处理的,同时我们可以看到encrypt方法是通过Encrypt对象进行调用的,因此一定有一个实现Encrypt对象的Encrypt类,因此选中Encrypt,查看交叉引用:

图片

 

package com.goldze.mvvmhabit.utils;
import android.text.TextUtils;import android.util.Base64;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.sql.Timestamp;import java.util.ArrayList;import java.util.List;
public class Encrypt { public static String bytes2Hex(byte[] arg5) { String v0 = ""; int v1; for(v1 = 0; v1 < arg5.length; ++v1) { String v2 = Integer.toHexString(arg5[v1] & 0xFF); if(v2.length() == 1) { v0 = v0 + "0"; }
v0 = v0 + v2; }
return v0; }
public static String encrypt(List arg4) { String v0 = String.valueOf(new Timestamp(System.currentTimeMillis()).getTime() / 1000L); // 时间戳 arg4.add(v0); // arg4 = ['/api/movie','时间戳'] String v4 = Encrypt.shaEncrypt(TextUtils.join(",", arg4)); // 字符串拼接后加密 ArrayList v1 = new ArrayList(); v1.add(v4); v1.add(v0); // v1 = [sha1(v4),‘时间戳’] return Base64.encodeToString(TextUtils.join(",", v1).getBytes(), 0); // return base64((v4,时间戳)) , 0表示没有任何标志位 }
public static String shaEncrypt(String arg1) { // sha1加密 try { MessageDigest v0 = MessageDigest.getInstance("SHA-1"); v0.update(arg1.getBytes()); return Encrypt.bytes2Hex(v0.digest()); } catch(NoSuchAlgorithmException unused_ex) { return null; } }}

总体分析程序可以得知,token=base64(sha1('/api/movie,时间戳') + ','+时间戳)

因此,我们可以编写脚本,来生成对应的token,然后发送请求,来获取数据

 

import hashlibimport base64import timeimport requests
url = "https://xxx/api/movie/?offset={offset}&limit={limit}&token={token}"
offset = 0limit = 100v4 = ['/api/movie']
def gen_token(v4): timestamp = str(int(time.time())) v4.append(timestamp)
str_sha = hashlib.sha1(','.join(v4).encode('utf-8')).hexdigest() str_bases = base64.b64encode(','.join([str_sha,timestamp]).encode('utf-8')).decode('utf-8') return str_bases
token = gen_token(v4)
url = url.format(offset=offset,limit=limit,token=token)
res = requests.get(url)print(res.text)# print(url)
# print(gen_token(v4))

最终效果:成功返回数据。

图片

 申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

免费领取安全学习资料包!


渗透工具

技术文档、书籍

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

应急响应笔记

学习路线

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

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

相关文章

浅模仿小米商城布局(有微调)

CSS文件 *{margin: 0;padding: 0;box-sizing: border-box; }div[class^"h"]{height: 40px; } div[class^"s"]{height: 100px; } .h1{width: 1528px;background-color: green; } .h11{background-color:rgb(8, 220, 8); } .h111{width: 683px;background-c…

【差分约束+并查集】第十三届蓝桥杯省赛C++ A组 Java A组/研究生组《推导部分和》(C++)

【题目描述】 【输入格式】 【输出格式】 【数据范围】 【输入样例】 5 3 3 1 5 15 4 5 9 2 3 5 1 5 1 3 1 2 【输出样例】 15 6 UNKNOWN 【思路】 题解来源&#xff1a;AcWing 4651. $\Huge\color{gold}{推导部分和}$ - AcWing 【代码】 #include<bits/stdc.h> #define…

PostgreSQL FDW(外部表) 简介

1、FDW: 外部表 背景 提供外部数据源的透明访问机制。PostgreSQL fdw(Foreign Data Wrapper)是一种外部访问接口,可以在PG数据库中创建外部表,用户访问的时候与访问本地表的方法一样,支持增删改查。 而数据则是存储在外部,外部可以是一个远程的pg数据库或者其他数据库(…

基于java+springboot+vue实现的成都旅游网系统(文末源码+Lw+ppt)23-358

摘 要 人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套成…

代码随想录算法训练营Day60 ||leetCode 84.柱状图中最大的矩形

84.柱状图中最大的矩形 这题和接雨水的题有些像&#xff0c;只不过此处使用的是递增栈&#xff0c;因为矩形的面积想要增加宽度时&#xff0c;需要考虑两边最低的矩形&#xff0c;而为了让所有数据都参加运算&#xff0c;需要前后补0&#xff0c;来弹出栈里所有元素 class Sol…

15 Games101 - 笔记 - 光线追踪(辐射度量学、BRDF与渲染方程)

15 光线追踪&#xff08;辐射度量学、BRDF与渲染方程&#xff09; 基于物理渲染的基础知识 摘要 本篇文章将会从基于物理渲染(PBR)的动机开始讲起&#xff0c;逐步介绍PBR相关的基础知识&#xff0c;如辐射度量学(怎么用物理量精确的描述光线)&#xff0c;以及通过辐射度量学…

MySQL高阶SQL语句

文章目录 MySQL高阶SQL语句MySQL常用查询1、按关键字排序1.1 语法1.2 ASC和DESC1.3 对数据表中信息进行排序1.3.1 普通排序1.3.2 结合where进行条件过滤1.3.3 对多个字段进行排序 2、区间判断及查询不重复记录2.1 and/or —— 且/或2.1.1 普通查询2.1.2 嵌套/多条件查询 2.2 di…

OD C卷 - 反射计数

反射计数&#xff08;200&#xff09; 给定一个包含0 、1的二维矩阵&#xff1b;一个物体从给定的初始位置出发&#xff0c;在给定的速度下移动&#xff0c;遇到矩阵的边缘则发生镜面反射&#xff0c;无论物体经过0还是1&#xff0c;都不影响其速度&#xff1b;经过t时间单位后…

【unity】如何汉化unity编译器

在【unity】如何汉化unity Hub这篇文章中&#xff0c;我们已经完成了unity Hub的汉化&#xff0c;现在让我们对unity Hub安装的编译器也进行下汉化处理。 第一步&#xff1a;在unity Hub软件左侧栏目中点击安装&#xff0c;选择需要汉化的编译器&#xff0c;再点击设置图片按钮…

淘宝自动发货接口是指淘宝开放平台提供的一种接口,用于实现商家在淘宝平台上自动发货的功能

淘宝自动发货接口是指淘宝开放平台提供的一种接口&#xff0c;用于实现商家在淘宝平台上自动发货的功能。通过该接口&#xff0c;商家可以将订单信息与物流信息传递给淘宝平台&#xff0c;由平台自动完成订单发货的操作&#xff0c;提高发货效率和准确性。 淘宝自动发货接口的…

手机termux免root安装kali:一步到位+图形界面_termux安装kali-

1.工具 安卓包括鸿蒙手机、WiFi、充足的电量、脑子 2.浏览器搜索termuxvnc viewer下载安装。 3.对抗华为纯净模式需要一些操作先断网弹窗提示先不开等到继续安装的时候连上网智能检测过后就可以了 termux正常版本可以通过智能监测失败了就说明安装包是盗版 4.以后出现类似…

Jenkins常用插件安装及全局配置

Jenkins常用插件安装及全局配置 前言 ​ Jenkins是一个流行的持续集成工具&#xff0c;通过安装适用的插件&#xff0c;可以扩展Jenkins的功能&#xff0c;并与其他工具和系统集成。本文将介绍一些常用的Jenkins插件以及安装和配置的步骤。通过安装和配置这些常用插件&#xf…

【EI会议征稿通知】电子、通信与智能科学国际会议(ECIS 2024)

电子、通信与智能科学国际会议&#xff08;ECIS 2024&#xff09; The International Conference on Electronics, Communications and Intelligent Science 电子、通信与智能科学国际会议&#xff08;ECIS 2024&#xff09;将于2024年05月24日-05月27日在中国长沙召开。ECIS…

指数强劲反弹,计算机板块表现活跃,北京两融开户佣金和融资融券利息率最低多少?哪个券商最低?支持量化交易?

股市行情的波动是由多种因素共同影响的&#xff0c;其中包括市场情绪、投资者对经济走势的预期、政策变化等等。本文提到的指数强劲反弹和计算机板块的活跃表现可能是由以下几个因素所推动的&#xff1a; 市场情绪改善&#xff1a;当投资者对市场的信心增加时&#xff0c;他们更…

C语言字节对齐关键字__attribute__((aligned(n)))的使用

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作&#xff0c;有些是为了加速对内存的访问。因此&#xff0c;学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

谈谈变压器中的位置编码

变压器中的位置编码 一、说明 在上一期的“Transformers for Everyone”系列中&#xff0c;我们介绍了 Transformer 的概念&#xff0c;并深入研究了第一个关键架构元素&#xff1a;输入嵌入。如果你错过了第一集&#xff0c;你可以通过阅读来赶上&#xff1a;适合所有人的变形…

IRIS / Chronicles 数据库结构

对于我们用得最多的关系型数据库来说&#xff0c;首先有的是数据库名字&#xff0c;然后是表名字&#xff0c;然后就是字段名&#xff0c;随后就是一条一条的数据。 对于 IRIS 来说&#xff0c;因为是使用的层级数据库&#xff0c;所以上面的定义就不能完全的照搬了&#xff0…

【傅里叶变换、短时傅里叶变换、小波变换】

傅里叶&#xff1a;可以知道信号中的成分&#xff0c;但对非平稳过程&#xff0c;不能看出各成分出现的时刻短时傅里叶变换-&#xff1a;加固定窗的傅里叶变换&#xff0c;无法满足非稳态信号变化的频率的需求小波变换&#xff1a;时域能量有限&#xff0c;频域带通滤波 一、傅…

系统可靠性分析与设计相关知识总结

一、软件可靠性定义 软件可靠性使软件产品在规定的条件下和规定的时间区间内完成规定的功能的能力。是软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下维持软件系统功能特性的基本能力。 规定的条件&#xff1a;直接与软件运行相关的使用该软件的计算机系统…

husky配置实现代码提交前校验与规范提交信息

husky是一个Git Hook管理工具&#xff0c;主要用于实现提交前eslint校验和commit信息的规范校验。 Husky 的原理是让我们在项目根目录中写一个配置文件&#xff0c;然后在安装 Husky的时候把配置文件和 Git Hook 关联起来&#xff0c;这样我们就能在团队中使用 Git Hook 了。 …