某车联网App 通讯协议加密分析

公众号: 奋飞安全
• 阅读 663

一、目标

李老板:最近刚买了辆新车,他带的App挺有意思,要不要盘一盘?

奋飞: 我去,加壳了,还挺有意思,搞一搞。

v6.1.0

二、步骤

抓包

我的抓包环境是 Mac 10.14.6 + httpToolKit, 这一步很顺利的抓到包了。

某车联网App 通讯协议加密分析

1:main

可以看到,http请求和返回值都是加密的,我们的目标就是这个 requestresponse的来历的。

脱壳

脱壳我们首选的就是 BlackDex ,使用方便,效果好。不过针对这个样本却不好使,只脱出来一个dex,大概率是失败了。

然后就上葫芦娃大佬的 FRIDA-DEXDump, 这个样本很狡猾,frida Spawn模式一跑就崩,看来壳比较硬。

这下棘手了,回想起之前我们曾经用 Xcube http://91fans.com.cn/post/antifridaoper/ 来对付加壳应用, 这次继续试试。

Xcube没有让我们失望,注入成功。 但是在Xcube模式下如何跑 FRIDA-DEXDump 呢?

本来想改改代码合并进去。无意中发现yang神也写了个DumpDex https://github.com/lasting-yang/frida_dump

轻松合并到js里面,这下成功的Dump出来了。

字符串搜索

直接搜索 *"request"* 结果不多。

某车联网App 通讯协议加密分析

1:find

很明显,这个 jsonObject.addProperty 嫌疑最大。

点进去看看,顺利的找到了这个 CheckCodeUtil 类。 他的checkcode和decheckcode大概率就是我们这次的目标。

某车联网App 通讯协议加密分析

1:utilcls

hook 之

var CheckCodeUtilCls = Java.use("com.bangcle.comapiprotect.CheckCodeUtil");
CheckCodeUtilCls.checkcode.implementation = function(a,b,c){
    var rc = this.checkcode(a,b,c);
    console.log(TAG + "checkcode >>> a = " + a);
    console.log(TAG + "checkcode >>> b = " + b);
    console.log(TAG + "checkcode >>> c = " + c);
    console.log(TAG + "checkcode >>> rc = " + rc);
    return rc;
}

CheckCodeUtilCls.decheckcode.implementation = function(a){
    var rc = this.decheckcode(a);
    console.log(TAG + "decheckcode >>> a = " + a);
    console.log(TAG + "decheckcode >>> rc = " + rc);
    return rc;

}

跑一下,奇怪,一点输出都没有,这个没有道理呀?

仔细看看,犯傻了,这类里面有两个checkcode函数,所以我们需要指定hook哪一个。 由于我们打印输出的时候忽略了错误输出,导致没有看到报错。

注意: Xcube环境下如果没有任何输出,大概率是脚本报错了,这时候就不要过滤,直接查看全部输出日志,就可以看到报错了。

改改代码

CheckCodeUtilCls.checkcode.overload('java.lang.String','int','java.lang.String').implementation = function(a,b,c){

这次果然很顺利的打印出来了结果。但是奇怪的事情又发生了,App崩了。

挽救崩溃的App

为什么会崩,难道是我们打印数据有bug?

先把打印入参和结果的代码注释掉。 还是崩。

把所有hook代码注释掉,不崩了,但是我不hook没法玩呀?

使出终极大法,换手机。 很多时候换个手机 就好了,也许这个手机水土不服吧。

结果打脸了,换了手机依然崩溃。

木有任何侥幸心理了,说明App或者壳,对关键函数的Hook做了检测,发觉被hook就摆烂。

App或者壳肯定是在Native层做的检测,我们要对付它,就得和它站在同一高度。

不去hook Jave层的函数了,直接取hook Native层的 checkcode 和 decheckcode。

Hook Native

从CheckCodeUtil的java代码中找到了 System.loadLibrary("encrypt");, 说明我们要对付的目标是 libencrypt.so。

IDA打开它,导出表,暴露了两个信息。

1、checkcode函数的地址在 0x24424 , decheckcode函数的地址在 0x2B1BC 。

2、这两个函数大概率使用了AES算法。

继续Hook吧

var targetSo = Module.findBaseAddress('libencrypt.so');
console.log(TAG +" ############# libencrypt.so: " +targetSo);
// 24424    2B1BC

Interceptor.attach(targetSo.add(0x24424 ),{
    onEnter: function(args){
        var strCls = Java.use('java.lang.String');

        this.rBuf = ptr(this.context.x0);
        console.log(TAG + " ======================================== ");
        // console.log(TAG + "-------- checkcode x0 = " + ptr(this.context.x0) ) ;

        var strA = Java.cast(this.context.x2, strCls);
        console.log(TAG + "-------- checkcode a = " + strA);

        console.log(TAG + "-------- checkcode b = " + ptr(this.context.x3));

        var strC = Java.cast(this.context.x4, strCls);
        console.log(TAG + "-------- checkcode b = " + strC);


    },
    onLeave: function(retval){
        var strCls = Java.use('java.lang.String');
        var strRc = Java.cast(retval, strCls);
        console.log(TAG + "-------- checkcode rc = " + strRc);

    }
});

Interceptor.attach(targetSo.add(0x2B1BC ),{
    onEnter: function(args){
        var strCls = Java.use('java.lang.String');

        this.rBuf = ptr(this.context.x0);
        console.log(TAG + " ======================================== ");
        // console.log(TAG + "-------- checkcode x0 = " + ptr(this.context.x0) ) ;

        var strA = Java.cast(this.context.x2, strCls);
        console.log(TAG + "-------- decheckcode a = " + strA);


    },
    onLeave: function(retval){
        var strCls = Java.use('java.lang.String');
        var strRc = Java.cast(retval, strCls);
        console.log(TAG + "-------- decheckcode rc = " + strRc);

    }
});

李老板: 奋飞呀,函数的第一个参数不是 X0吗? 你为什么打印第一个参数是 X2 ?

奋飞: 老板,早就让你多批点经费买书,你不同意,这下露怯了吧。去翻翻 jni编程就知道了,java调用C/C++ 函数的前两个参数是固定的。真实传递进来的参数是从第三个开始。

这次再跑一下。

某车联网App 通讯协议加密分析

1:rc

真相大白了。

帝都已经有秋意了,不好上鲜啤了,差不多可以上二锅头了。

三、总结

脱壳方法千千万,重点还是Dump Dex。

加壳应用不要怕,大概率脱完壳之后就都是线索了。不加壳的App才是真的可怕。

脚本没有任何输出,不一定是位置找错了,还有可能是脚本的报错你没有看到。

App崩了,换手机是有效的,虽然这次打脸了。

针对这个样本,IDA还告诉我们,so里面的函数入口的代码也被抽取了,要分析这个so,估计还得Dump so。

某车联网App 通讯协议加密分析

1:ffshow

只有去穿越和反思痛苦,才能得到更高的思想深度,没有捷径

Tip:

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

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

点赞
收藏
评论区
推荐文章
小程序逆向分析 (一)
一、目标李老板:奋飞呀,最近耍小程序的比较多,而且貌似js好耍一点?要不咱们也试试?奋飞:你是老板,你说了算喽。第一次搞小程序,得找个软柿子捏,就找个以前分析过的某段子App的小程序吧。反编译静态分析动态调试二、步骤春天在哪里?app下载回来就是apk包,那么小程序在哪里?小程序是一个以wxapkg为后缀的文件,在android手机的/da
某电商App 返回数据加密解密分析(四)
一、目标最近在抓包某电商App的时候发现一个加密数据,它在做通讯地址请求的时候,请求数据做了加密。返回数据中的地址信息也是密文。今天我们的目标就是这个数据的加密解密。App版本:v10.3.0二、步骤分析一下1、数据的结尾是"",说明是Base64编码,那么我们可以尝试去HookBase64相关函数,然后打印堆栈。2、返回数据格式是json,那么我
某神奇App data加密算法解析(一)
一、目标李老板:奋飞呀,我遇到一个超级牛掰的App,它请求的时候有个data参数加密,用尽了你介绍的所有的方法,都找不到它是如何加密的。奋飞:子曾经曰过,老板的嘴,骗人的鬼。有这么牛掰的App,那么我们这帮兄弟早就失业了。某神奇Appv10.1.0点社区随便打开一篇有评论的文章今天的目标就是这个data二、步骤搜索特征字符串目标是data,所以我
另一个生鲜App 抓包和mfsig签名分析(一)
一、目标市面上生鲜App一大堆,买菜也确实是高频次的刚需,这些生鲜App还都有一些有意思的共性:大都加壳了大都不好抓包今天我们分析的是某生鲜Appv9.9.59的mfsig签名。二、步骤上jadx看看这么少的包名和类名,基本可以断定是加壳了。那就先复习下BlackDex脱壳脱完壳的结果拖到PC上,赶紧jadx一下,搜一搜"mfsig"
某汽车社区App 签名和加解密分析
一、目标稼轩长短句有云:宝马雕车香满路。从此香车美女就成了标配。这不李老板还没聊几个mm,又开始准备换车了。今天我们的目标是某汽车社区Appv8.0.1。二、步骤脱个壳李老板说这个App很拽,貌似是某个企业版的壳,连Xcube都不好使,调试不了。我们先不管他拽不拽,先用BlackDex把壳脱了先。BlackDex提示脱壳成功,但是对应的目录下只
某音乐App 抓包和signature签名分析
一、目标李老板:奋飞呀,最近我想下个歌,现在听歌软件都这么顽固了,包都抓不到?奋飞:抓不到包的原因太多了,咱们得用排除法分析下。某音乐App10.8.4二、步骤排查协议李老板也跟我们混了这么多期,所以基本排除抓包环境的问题。那么另一个可能就是像某手使用的quic协议或者某鱼使用的spdy协议了。上jadx搜一下"quic",如果搜不到还可
某婚恋App _t 签名分析
一、目标最近也不让加班了,李老板每天早早的就回家,小视频也刷的没意思了。还是好好找个mm正经聊聊吧。今天我们的目标是某婚恋App的v11.3.2。二、步骤抓个包\t参数,看上去像是时间戳加上一个md5(掰指头数了数,一共32位)。jadx搜一搜\t,我去,10几万条结果。一时激动,都忘了我的独门秘籍了。这种签名一般会以字符串的方式存入一个m
手把手教你从Apk中取出算法
一、目标李老板:奋飞呀,我最近从Apk里面跟踪到一个算法,代码清晰,但是我不会java,把他翻译成python貌似挺费劲的,有没有轻松省力的方法呀?奋飞:有的呀,给我加工资,我来翻译。某电商Appv10.4.5,升级之后老有小伙伴说他的sign算法变了,其实他就是做了点小动作。sign参数没有动,uuid是明文去做签名,但是抓包请求里面找不到明文uu
在Frida里面做http请求: 聊聊jar to dex
一、目标李老板:奋飞呀,你hook这个App之后拿到token,然后上报给我的服务器好不好?奋飞:木问题。二、步骤gumjshttp在frida里面做http请求,最根正苗红的必须是gumjshttp,大胡子出品,有保障可惜的是我没有搞明白,李老板催的紧,木有时间去慢慢研究了。先搞个Server测试子曾经曰过:人生苦短,快用Python。不过
另一个生鲜App 抓包和mfsig签名分析(二) 针对flutter抓包
一、目标拿到App之后,抓不到包是件很令人抓狂的事情。今天我们通过排除法来分析抓包失败的原因,并提供一个通用的针对flutter抓包的方案。抓包工具和环境介绍抓包失败的几种原因和对应的解决方案针对flutter抓包今天我们分析的还是某生鲜Appv9.9.59二、步骤抓包工具和环境介绍飞哥手头有两个不同的抓包环境,一台手机是通过手工设置代理到
公众号:  奋飞安全
公众号: 奋飞安全
Lv1
奋飞,国家高级信息系统项目管理师,独立安全研究员。 http://91fans.com.cn/
文章
59
粉丝
4
获赞
44