andriod逆向入门 | 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,暴力破解等等

应急响应笔记

学习路线

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值