IDA、JADX、Frida、Charles、WireShark
总结:猜
聊天数据一般都为TCP传输,所以直接使用WireShark抓包
经过不断观察以下特征数据很像聊天数据
接下来的思路就是Hook libc.so 的send函数,打印调用堆栈
未查到,那就先将APK拖进JADX里进行分析
撸起袖子就准备直接开干,Frida Server已启动,直接运行
世间万般逆向怎么都如我所愿?
不出意外的意外,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()
再次跟进去,发现了重点胖揍对象
那可不就是这小子阻碍了Frida大军的步伐
下面编写Frida脚本去绕过该检测手段
然后就可以愉快的使用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
解密后就可以拿到聊天内容,发送方昵称,发送时间等信息
frida
-
Uf cn.xxxx.android
-
l .\xxx.js
-
-
no
-
pause
frida
-
Uf cn.xxxx.android
-
l .\xxx.js
-
-
no
-
pause
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-3-28 10:16
被REerr编辑
,原因: