某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提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值