首页
社区
课程
招聘
[原创]某 APP 聊天协议逆向
2023-3-23 11:23 41221

[原创]某 APP 聊天协议逆向

2023-3-23 11:23
41221

某 APP 聊天协议逆向

环境

  1. 主机:win10
  2. 手机:Pixel 4 ,Android 10
  3. APP版本:V4.70.0

工具

IDA、JADX、Frida、Charles、WireShark

逆向思路

总结:猜

流量抓包分析

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

 

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

 

chat

 

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

查壳、脱壳


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

Frida Hook

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

1
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,然后又闻到了熟悉的味道

 

 

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

 

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

 

 

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

 

 

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

 

 

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

 

 

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

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

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

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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

 

 

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


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2023-3-28 10:16 被REerr编辑 ,原因:
收藏
点赞17
打赏
分享
最新回复 (24)
雪    币: 2082
活跃值: (859)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
vlinkstone 2023-3-24 11:17
2
1
frida 大军, 冲冲冲!
雪    币: 163
活跃值: (426)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
covccc 2023-3-24 15:03
3
0
大侠讲话有点意思啊
雪    币: 258
活跃值: (1674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Valdik 2023-3-26 21:00
4
0
太牛逼了,自愧不如
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_水山 2023-3-27 10:07
5
0
过检测的思路学习了,有个疑惑是,他那个检测的线程进去后,肯定也是调用了一些字符串比较、查找子串等常用函数,为啥不hook这些函数来过检测呢,而要费劲分析他的过检测逻辑呢
雪    币: 1467
活跃值: (2044)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
REerr 2023-3-27 11:09
6
2
wx_水山 过检测的思路学习了,有个疑惑是,他那个检测的线程进去后,肯定也是调用了一些字符串比较、查找子串等常用函数,为啥不hook这些函数来过检测呢,而要费劲分析他的过检测逻辑呢
hook检测函数过检测是最优解,像hook strstr、strcmp这类函数去过滤一些常用检测字符串确实可以,但这类函数使用频率很高,并不止检测函数一处使用,长期hook可能会导致app崩溃等问题
雪    币: 486
活跃值: (583)
能力值: ( LV12,RANK:238 )
在线值:
发帖
回帖
粉丝
scpczc 1 2023-3-27 17:30
7
1
学习了。
雪    币: 50
活跃值: (464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-3-27 18:23
8
0
厉害了 可是有个地方我没看懂 
文中提到 开启检测线程的代码是这个:result = pthread_create(qword_45658, 0LL, (void *(*)(void *))sub_18C88, 0LL);
这意味着真正的检测函数是sub_18C88 地址是base + 0x18C88
可为什么 在用frida过检测时 
detect_frida_loop_addr = base_addr.add(0x000000000001B8B4)
请问0x000000000001B8B4是怎么来的呢?
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_水山 2023-3-28 10:03
9
0
REerr hook检测函数过检测是最优解,像hook strstr、strcmp这类函数去过滤一些常用检测字符串确实可以,但这类函数使用频率很高,并不止检测函数一处使用,长期hook可能会导致app崩溃等问题
确实有道理,学习了
雪    币: 1467
活跃值: (2044)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
REerr 2023-3-28 10:17
10
0
是0x18C88
雪    币: 1467
活跃值: (2044)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
REerr 2023-3-28 10:17
11
0
万里星河 厉害了 可是有个地方我没看懂 文中提到 开启检测线程的代码是这个:result = pthread_create(qword_45658, 0LL, (void *(*)(void *))sub_ ...
是0x18C88
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
@=llfly 2023-3-29 16:01
12
0
学习了 , 感谢楼主分享!
雪    币: 267
活跃值: (985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ziyuzile 2023-4-4 09:38
13
0
拖进IDA里将之底裤扒光。。。然后又闻到了熟悉的味道。哈哈,大侠顺便给个样本呢 ?
雪    币: 1467
活跃值: (2044)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
REerr 2023-4-4 09:46
14
0
ziyuzile 拖进IDA里将之底裤扒光。。。然后又闻到了熟悉的味道。哈哈,大侠顺便给个样本呢 ?
灵魂app
雪    币: 859
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_威郑天 2023-4-13 13:34
15
0
mark
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_zvdwnarj 2023-4-14 04:23
16
0
大佬可以留个方式学习吗吗
雪    币: 208
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
63byte 2023-4-20 09:53
17
0
大佬,怎么判断是哪个so文件有Frida检测呢?
雪    币: 1467
活跃值: (2044)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
REerr 2023-4-21 09:36
18
0
通过hook dlopen查看加载so来判断
雪    币: 1467
活跃值: (2044)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
REerr 2023-4-21 09:36
19
0

最后于 2023-4-21 09:36 被REerr编辑 ,原因:
雪    币: 448
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_eiaothcj 2023-8-7 23:05
21
0
63byte 大佬,怎么判断是哪个so文件有Frida检测呢?
hook dlopen打印出来就行了
雪    币: 302
活跃值: (350)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mb_kbkqyusp 2023-8-8 15:40
22
0
前有大佬分析过bilibili frida过检测,这个so就是检测frida的
雪    币: 189
活跃值: (965)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
苦瓜tim 2023-8-25 10:05
23
0
大佬 hook libc.so send函数的能不能贴一下,不甚感激
雪    币: 0
活跃值: (437)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Analysts1981 2023-9-26 18:42
24
0
sub_18C88,请问这个怎么获取的?
雪    币: 158
活跃值: (746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
教教我吧~ 2023-11-8 19:40
25
0

已解决

最后于 2023-11-8 19:52 被教教我吧~编辑 ,原因: 解决
游客
登录 | 注册 方可回帖
返回