美文网首页安卓逆向
某小说App返回数据 解密分析

某小说App返回数据 解密分析

作者: fenfei331 | 来源:发表于2022-06-12 12:41 被阅读0次

    一、目标

    李老板:奋飞呀,最近被隔离在小区里,没啥可干的呀。

    奋飞:看小说呀,量大管饱。

    我们今天的目标就是某小说App v2021_09_53

    二、步骤

    搜索url字符串

    App请求小说内容的时候没有加签名,但是返回的数据是加密的。

    main.png

    那么我们先去jadx搜索一下这个url(novel-content),看看有没有发现。

    结果是没有收获。

    那么很有可能这个url不是在apk中写死的,而是某个请求返回的。

    Charles可以搜索数据包,我们从返回包里面找到了这个url。

    main2.png

    那就好办了,看看是哪块代码去解析了这个 content_url ,我们在jadx中搜索

    "content_url"

    这次倒是有收获,但是看不出来这个变量再哪里用了。

    插播一个屏蔽登录

    只能再想想别的办法了,办法还没想出来,又遇到了新的问题。

    第二次启动app的时候,就不让我看书了。一定要我登录,一怒之下登录了,居然还不让我看。还要买VIP。

    这下忍不了了,我不过是想写个分析教程,何必这么为难我。

    先从提示入手, 搜索 "登录" 来到这里

    login.png

    理论上说干掉这两个函数应该就可以了,写代码

        var CacheUtilsCls =  Java.use('com.xxoo.net.net.CacheUtils');
    
        CacheUtilsCls.isVip.implementation = function(){
    
                return true;
    
        };
    
    
        CacheUtilsCls.isLogin.implementation = function(){
    
                return true;
    
        };
    
    

    作者这个类名起的好风趣呀,我都不忍心打码了。

    过滤url

    既然知道请求小说内容的url了,我在url这里做一次过滤,应该就可以定位了吧

        var URL = Java.use('java.net.URL');
    
        URL.openConnection.overload().implementation = function() {
    
            var retval = this.openConnection();
    
            console.log('URL openConnection' + retval);
    
    
            return retval;
    
        };
    
    
        var OkHttpClient = Java.use("okhttp3.OkHttpClient");
    
    
        OkHttpClient.newCall.implementation = function (request) {
    
            var result = this.newCall(request);
    
            console.log(request.toString());
    
            var stack = threadinstance.currentThread().getStackTrace();
    
            console.log("http >>> Full call stack:" + Where(stack));
    
            return result;
    
        };
    

    url和返回数据我都hook了。木有逮住。

    大海捞针大法

    下面就试试咱们老用的字符串匹配大法了。不管你怎么玩,解密之后的数据大概率是要赋值给字符串的。我们先把字符串赋值来捞一遍。

        var strCls = Java.use("java.lang.StringBuilder");
    
        strCls.toString.implementation = function(){
    
            var result = this.toString();
    
            console.log(result.toString());
    
            return result;
    
        }
    

    这次就比较幸运了,我们不仅捞到了明文,还捞到了重要提示

    show.png

    大海告诉我们,大概率是AES CBC算法做的解密。

    字符串匹配定位

    有了重要提示,我们就依据这个提示来定位

        var strCls = Java.use("java.lang.StringBuilder");
    
        strCls.toString.implementation = function(){
    
            var result = this.toString();
    
            // console.log(result.toString());
    
            if(result.toString().indexOf("AES/CBC/PKCS5Padding") >= 0 )
    
            {
    
                console.log(result.toString());
    
                var stack = threadinstance.currentThread().getStackTrace();
    
                console.log("Rc Full call stack:" + Where(stack));
    
            }
    
            return result;
    
        }
    
    

    跑一下,漂亮的堆栈就出来

    漂亮的堆栈会说话

    rc.png

    这个堆栈告诉我们,重点怀疑对象是 NativeBds.dae1

    ,从名字和外形上看,它大概率是个Native函数。

    但是后面的堆栈告诉我们一个好消息,虽然运算过程在Native里面,但是它居然回调了javax.crypto来做加解密,也太敷衍老板了,这在我司是要被扣工资的。

    先不管了,终于找到你了,hook之

        var  DecodeCls = Java.use('com.baidu.searchbox.NativeBds');
    
        DecodeCls.dae1.implementation = function(a,b){
    
            var rc = this.dae1(a,b);
    
    
            var StrCls = Java.use('java.lang.String');
    
            var inStr = StrCls.$new(rc);
    
            console.log(inStr);
    
            return rc;
    
        }
    

    跑一下,没问题,明文出来了,收工,下雨了,没法上鲜啤了。

    三、总结

    不要嫌打印的数据太多,大海捞针也是考验你火眼金睛的时候。

    对常见加解密算法要敏感,要成为条件反射。看到iv就要想到aes,看到32位就要想到md5,看到64位就要怀疑sha256。看到太阳就要想到鲜啤,看到飞哥的文章就要想到转发

    ffshow.jpg

    新一代的财富都是通过代码或者媒体创造的 --- 纳瓦尔

    相关文章

      网友评论

        本文标题:某小说App返回数据 解密分析

        本文链接:https://www.haomeiwen.com/subject/ukjomrtx.html