IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 某APP逆向算法学习与分析 -> 正文阅读

[移动开发]某APP逆向算法学习与分析

前言

第一次来到CSDN写文章,有不对的地方欢迎大家批评指正


提示:此文章仅供学习使用,切勿用于非法用途,产生的其他责任与本人无关

一、首先利用Charles对APP登录动作进行抓包

有关Charles的使用与原理不在此赘述,可以自行搜索查阅相关文章。抓到的数据包如下所示:

{"Encrypt":"NIszaqFPos1vd0pFqKlB42Np5itPxaNH\/\/FDsRnlBfgL4lcVxjXii02ggCULFNaeKJcVfQ4ZwO+z\njx3xNK\/ZxWPffP5uqGkOPedVtE\/H3fhw3BnLxDuQZ\/YvKbhpYGZCAHtsGFR47RlqEJ9tNZnvph0x\n8mdrufJZm8fALwUFnqQavFGitoMgvwQvnqPwRRNc7Jiia\/s1tBRpnXgdfJ4qLREHwtrU1\/tBGH\/N\n8He7QBU=\n"}
url:http://xxx.xxx.com/api/user/login

二、使用Jadx对代码进行反编译,并对其进行算法分析

1.查找关键语句

利用Jadx自带的搜索功能对抓到数据包的链接地址与关键词"Encrypt进行搜索,
根据先对原生代码进行分析、不分析或少分析框架自带的函数的原则,找到两处可疑点,我们随机选择一处进行分析,经验证这两处都可以找到正确算法。(我们选择第二条分析)
我们选择第二条进行分析

2.算法分析

我们进入以后代码如下:

 private void paraMap(Map<String, String> addMap) {
        String encrypt;
        String time = System.currentTimeMillis() + "";
        if (addMap == null) {
            addMap = new HashMap<>();
        }
        if (this.useDes) {
            addMap.put("timeStamp", time);
            if (DodonewOnlineApplication.loginUser != null) {
                addMap.put("userId", DodonewOnlineApplication.loginUser.getUserId());
                if (TextUtils.isEmpty(DodonewOnlineApplication.devId)) {
                    DodonewOnlineApplication.devId = Utils.getDevId(DodonewOnlineApplication.getAppContext());
                }
                addMap.put("imei", "Android" + DodonewOnlineApplication.devId);
            }
            encrypt = RequestUtil.encodeDesMap(RequestUtil.paraMap(addMap, Config.BASE_APPEND, "sign"), this.desKey, this.desIV);
        } else {
            encrypt = this.mGson.toJson(addMap);
        }
        JSONObject obj = new JSONObject();
        try {
            obj.put("Encrypt", encrypt);
            this.mRequestBody = obj + "";
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

我们发现encodeDesMap这个函数非常可疑,他New了一个Jsonobject,并把一堆变量例如包含Imei、UserId以及日期时间戳的addMap传给了函数内部,最后将Encrypt之后的值放到了这个Obj内部,不管三七二十几,我们先Hook再说。
Hook.js文件如下:

Java.perform(function () {
    var RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
    RequestUtil.encodeDesMap.implementation=function (data, desKey, desIV) {
        console.log("sunci",data,desKey,desIV);
        var encode = this.encodeDesMap(data,desKey,desIV);
        console.log(encode)
        return encode;
    }
})

本想能看看里面是个啥了,结果报错了,原来这个encodeDesMap有多个重载函数,那么我们声明下到底Hook哪个函数

Java.perform(function () {
    var RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
    RequestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation=function (data, desKey, desIV) {
        console.log("sunci",data,desKey,desIV);
        var encode = this.encodeDesMap(data,desKey,desIV);
        console.log(encode)
        return encode;
    }
})
sunci {"equtype":"ANDROID","loginImei":"Android352689081159760","sign":"AB0EAC82D85583B3BE075D72C1A2344B","timeStamp":"1627526246732","userPwd":"fgdhfjff","username":"15165096666"} 65102933 32028092

不出所料,这里就是关键代码,第一项是加密的值,第二项是DesKey,第三项是IV偏移量。但是里面还有个值看起来很扎眼,sign,这是个啥玩意,那么既然Des加密要用到他,那么sign的位置离Des加密的位置不会太远,果然在Des加密中调用了paraMap这个函数,最后返回了sign,Hook看看。

Java.perform(function () {
    var RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
    var utils = Java.use("com.dodonew.online.util.Utils");
    utils.md5.implementation=function (a){
        console.log(a);
        var ss = this.md5(a);
        console.log(ss);
        return ss;

    }
    RequestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation=function (data, desKey, desIV) {
        console.log("sunci",data,desKey,desIV);
        var encode = this.encodeDesMap(data,desKey,desIV);
        console.log(encode)
        return encode;
    }
   
})
equtype=ANDROID&loginImei=Android352689081159760&timeStamp=1627542188579&userPwd=fgdhfjff&username=15165096666&key=sdlkjsdljf0j2fsjk

sign的问题也解决了,就是一个普通的md5,算法复现明天写,今天累了,拜拜了您内


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:51:16  更:2021-07-30 12:53:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:48:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码