APP 聊天协议逆向

VSole2023-04-07 09:46:21

环境

主机:win10

手机:Pixel 4 ,Android 10

APP版本:V4.70.0

工具

IDA、JADX、Frida、Charles、WireShark

逆向思路

总结:猜

流量抓包分析

聊天数据一般都为TCP传输,所以直接使用WireShark抓包。

经过不断观察以下特征数据很像聊天数据:

接下来的思路就是Hook libc.so 的send函数,打印调用堆栈。

查壳、脱壳

未查到,那就先将APK拖进JADX里进行分析。

Frida Hook

撸起袖子就准备直接开干,Frida Server已启动,直接运行。

frida -Uf cn.xxxx.android -l .\xxx.js --no-pause

世间万般逆向怎么都如我所愿?不出意外的意外,Process terminated。

狗贼将我的Frida大法拒之门外,作为Frida忠实爱好者(别的不会),这哪能忍?

往上看,/lib/arm64/libmsaoaidsec.so这小子名字一看就不是什么好东西。拖进IDA里将之底裤扒光。

我们知道一般检测Frida的函数无非是strstr、strcmp、readline,fgets这些。我们当然也知道一般检测函数大多都在init_proc、JNI_OnLoad中进行调用执行。

打开so 定位到init_proc,然后又闻到了熟悉的味道。

里面调用的函数不是很多,所以直接人肉分析,那这样不是外套脱了还剩里面的?不行不行。

通过观察上面的CFG发现,该混淆符合以下逻辑:

整体思路就是先查找主分发器,一般被引用次数最多的那个块就是主分发器,引用主分发器的块大概率是真实块,再使用unicorn模拟执行,遍历每一个分支,记录每一个块,如果某一个块是上次记录的块则也为真实块,无后继的块则为retn块,剩下的就是无用块。最终处理后样子如下:

经过一个一个的点,最终找到了一个十分可疑的家伙sub_1A8A0()。

再次跟进去,发现了重点胖揍对象。

result = pthread_create(qword_45658, 0LL, (void *(*)(void *))sub_18C88, 0LL);

那可不就是这小子阻碍了Frida大军的步伐。

下面编写Frida脚本去绕过该检测手段。

function hook_pthread_create(){    var pt_create_func = Module.findExportByName(null,'pthread_create');    var detect_frida_loop_addr = null;    console.log('pt_create_func:',pt_create_func);    Interceptor.attach(pt_create_func,{       onEnter:function(){           if(detect_frida_loop_addr == null)           {                var base_addr = Module.findBaseAddress('libmsaoaidsec.so');                if(base_addr != null){                    detect_frida_loop_addr = base_addr.add(0x0000000000018C88)                    console.log('this.context.x2: ', detect_frida_loop_addr , this.context.x2);                    if(this.context.x2.compare(detect_frida_loop_addr) == 0) {                        hook_anti_frida_replace(this.context.x2);                    }                }            }        },       onLeave : function(retval){           // console.log('retval',retval);       }   })}function hook_anti_frida_replace(addr){    console.log('replace anti_addr :',addr);    Interceptor.replace(addr,new NativeCallback(function(a1){        console.log('replace success');        return;    },'pointer',[])); }setImmediate(hook_pthread_create(),3000);

然后就可以愉快的使用Frida了。

加密流程分析

通过Frida Hook libc.so后发现,聊天协议走的是JAVA层的socket,然后Hook JAVA层相关函数得到如下调用堆栈。

那么组包和加密大概率是在wq这个类里面的某些函数实现的。

打开JADX,查看wq.d$d.e函数。

e函数里可以看到body即为tcp数据,经过body = EncryptUtils.encryptMessage(body);加密,跟进encryptMessage函数。

最终发现为DES(DES/ECB/pkcs5padding)加密,加密key由getUserIdKey生成。

再次发起Frida魔法攻击。

未加密的数据结构为protobuf。

result结果即为TCP data。

解密后就可以拿到聊天内容,发送方昵称,发送时间等信息。

本作品采用《CC 协议》,转载必须注明作者和本文链接
APP 聊天协议逆向
2023-04-07 09:46:21
环境主机:win10手机:Pixel 4 ,Android 10APP版本:V4.70.0工具IDA、JADX、Frida、Charles、WireShark逆向思路总结:猜流量抓包分析聊天数据一般都为TCP传输,所以直接使用WireShark抓包。经过不断观察以下特征数据很像聊天数据:接下来的思路就是Hook libc.so 的send函数,打印调用堆栈。查壳、脱壳未查到,那就先将APK拖进JADX里进行分析。Frida Hook撸起袖子就准备直接开干,Frida Server已启动,直接运行。不出意外的意外,Process terminated。再次跟进去,发现了重点胖揍对象。再次发起Frida魔法攻击。result结果即为TCP data。
经监测,我们截获了一起与未知家族有关的欺诈性 Android 应用传播事件。详细调查发现,该家族主要使用开源的 Telegram Android 源代码作为其核心功能模板。
FIRST 2022 议题速递
2022-07-28 08:21:45
FIRST 是成立于 1990 年的非营利组织,汇聚了全球的安全团队和安全研究人员,旨在共同维护全球互联网的安全。如今,已有全球 101 个国家的 635 个安全团队加入了 FIRST,其中中国大陆参加的组织包括中国国家计算机网络应急技术处理协调中心(CNCERT/CC)、中国移动、阿里、腾讯、奇安信等。
KCon 2021部分PPT发布
2021-11-09 07:32:15
今年是 KCon 10周年,疫情环境下线下会议举步维艰,原本计划在8月底进行的大会随后推迟到10月底。考虑到未到场听众的急切心情,我们决定提前对外发布 KCon 议题。这次披露的是QEMU中比较罕见的可控长度越界读写漏洞,可以稳定利用并进行虚拟机逃逸,本次是首次披露该模块的漏洞细节。本议题将介绍如何针对 CFI 的固有缺陷来突破其防御。
笔者片面的从多年乙方经验(不涉及监管层面能拿到的数据)的技术层面来讨论下大攻防演练多人运动下的溯源反制思路,以及作为反制团队如何与蓝队其他成员之间进行配合反制相关的工作。 如有写的不对的地方及遗漏的地方(肯定有的),请多多交流。
习近平总书记指出,没有网络安全就没有国家安全,就没有经济社会稳定运行,广大人民群众利益也难以得到保障。网络空间不是法外之地,依法惩治和有效预防网络犯罪,推动健全网络综合治理体系,以法治力量引导科技向上向善,营造清朗的网络空间,是检察机关的重要职责。
习近平总书记指出,没有网络安全就没有国家安全,就没有经济社会稳定运行,广大人民群众利益也难以得到保障。网络空间不是法外之地,依法惩治和有效预防网络犯罪,推动健全网络综合治理体系,以法治力量引导科技向上向善,营造清朗的网络空间,是检察机关的重要职责。
习近平总书记指出,没有网络安全就没有国家安全,就没有经济社会稳定运行,广大人民群众利益也难以得到保障。网络空间不是法外之地,依法惩治和有效预防网络犯罪,推动健全网络综合治理体系,以法治力量引导科技向上向善,营造清朗的网络空间,是检察机关的重要职责。
作为App平台收集、使用用户信息的第一道关口,隐私协议不仅是收集、使用个人信息服务的“说明书”,更应成为保障用户利益的“安全阀”。
计算机网络中为什么在IP协议是无连接的前提下,TCP协议可以面向连接?TCP报文段就包含在IP数据报的数据部
VSole
网络安全专家