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

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

一、目标


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


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


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


二、步骤

搜索url字符串


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

224.png

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


结果是没有收获。


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


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


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

"content_url"


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


插播一个屏蔽登录


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


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


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


先从提示入手, 搜索 "登录" 来到这里334334.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;
    }


这次就比较幸运了,我们不仅捞到了明文,还捞到了重要提示226.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;
    }


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


漂亮的堆栈会说话

446.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。看到太阳就要想到鲜啤,看到飞哥的文章就要想到转发556.png


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


TIPS:


本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号: 奋飞安全,最新技术干货实时推送

相关文章
|
27天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
2月前
|
JSON API 网络安全
App数据的爬取
App数据的爬取
36 3
|
3月前
|
安全
【Azure App Service】App service无法使用的情况分析
App Service集成子网后,如果子网网段中的剩余IP地址非常少的情况下,会在App Service实例升级时( 先加入新实例,然后在移除老实例 )。新加入的实例不能被分配到正确的内网IP地址,无法成功的访问内网资源。 解决方法就是为App Service增加子网地址, 最少需要/26 子网网段地址。
|
4月前
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
|
4月前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
4月前
|
缓存
【Azure Function】Function App代码中使用Managed Identity认证获取Blob数据时遇见400报错
【Azure Function】Function App代码中使用Managed Identity认证获取Blob数据时遇见400报错
【Azure Function】Function App代码中使用Managed Identity认证获取Blob数据时遇见400报错
|
4月前
|
开发框架 缓存 .NET
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
|
4月前
【Azure 事件中心】在Azure Function App中消费Event Hub数据,时常出现EventReceiveError
【Azure 事件中心】在Azure Function App中消费Event Hub数据,时常出现EventReceiveError
|
4月前
|
C# 开发工具
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
|
4月前
|
网络协议 NoSQL 网络安全
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)