找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 110|回复: 0

[看雪] 某 APP 聊天协议逆向

[复制链接]

2万

主题

128

回帖

10万

积分

管理员

积分
105661
发表于 2023-3-28 09:14:06 | 显示全部楼层 |阅读模式 IP:山东省临沂市 电信

登录后更精彩...O(∩_∩)O...

您需要 登录 才可以下载或查看,没有账号?立即注册

×
某 APP 聊天协议逆向

某 APP 聊天协议逆向环境
  • 主机:win10
  • 手机:Pixel 4 ,Android 10
  • APP版本:V4.70.0

工具
IDA、JADX、Frida、Charles、WireShark

逆向思路
总结:猜

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

经过不断观察以下特征数据很像聊天数据
1.png
接下来的思路就是Hook libc.so 的send函数,打印调用堆栈

查壳、脱壳
2.png
未查到,那就先将APK拖进JADX里进行分析

Frida Hook
撸起袖子就准备直接开干,Frida Server已启动,直接运行
[JavaScript] 纯文本查看 复制代码
frida -Uf cn.xxxx.android -l .\xxx.js --no-pause

世间万般逆向怎么都如我所愿?
不出意外的意外,Process terminated。
狗贼将我的Frida大法拒之门外,作为Frida忠实爱好者(别的不会),这哪能忍?
3.png

往上看,/lib/arm64/libmsaoaidsec.so这小子名字一看就不是什么好东西

拖进IDA里将之底裤扒光

我们知道一般检测Frida的函数无非是strstr、strcmp、readline,fgets这些

我们当然也知道一般检测函数大多都在init_proc、JNI_OnLoad中进行调用执行

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

切!如今没有高级复杂电路图的APP,咱都不屑于去分析(吹牛

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

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

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

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

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

[JavaScript] 纯文本查看 复制代码
result = pthread_create(qword_45658, 0LL, (void *(*)(void *))sub_18C88, 0LL);

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

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

[JavaScript] 纯文本查看 复制代码
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(0x000000000001B8B4)
                    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层相关函数得到如下调用堆栈
10.png

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

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

11.png

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

11.png

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

再次发起Frida魔法攻击
12.png

未加密的数据结构为protobuf

result结果即为TCP data

13.png



from:https://bbs.kanxue.com/thread-276591.htm
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|IOTsec-Zone|在线工具|CTF WiKi|CTF平台汇总|CTF show|ctfhub|棱角安全|rutracker|攻防世界|php手册|peiqi文库|CyberChef|猫捉鱼铃|手机版|小黑屋|cn-sec|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2024-5-3 14:47

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表