免责声明:本篇文章仅用来学习交流,请勿用于商业用途,如因违反规定产生任何法律纠纷,本人概不负责。假如本文影响到官方任何利益,请联系文章底部作者微信告知,本人会在第一时间将文章删除,感谢~
# 记录下某 j光新闻apk
的逆向,技术点包括 root 检测,脱壳及静态分析, so
层加密分析。
# 抓包查看接口
打开
app
发现有root
检测,可以使用frida
调用过root
的脚本,这里我用objection
提供的指令过root
检测,方便快捷。使用
objection
如下指令在启动阶段hook
掉root
检测,然后抓包分析接口objection -g appname explore --startup-command "android root disable"
经过查看几个接口分析应该是
sign
和account
参数,抓包分析不细说了,网上可以百度教程
# 接下来就可以拿着参数去静态分析
美滋滋打开
jadx
,发现有加固,看文件名是360
的壳用葫芦娃大佬的
frida_dexdump
直接脱,之前文章有讲脱完用
jadx
打开,可以直接搜到root
的弹窗位置这里还有个坑,高版本有不知名的
bug
,V1.3.3
打开报错,V1.3.2
打开不能搜索,V1.2.0
和V1.3.0
可以打开,新版本纵然有新鲜功能,但还是老版本稳定,可以少掉好多头发。。。搜了下
sign
和account
,最后定位到下面函数位置然后继续追进函数看,这里用
b
类new
了一个a
对象,然后用调用了a
对象的a
函数跟进
b
类,发现下面的两个函数都是空的,难道没壳脱干净? 其实这里是interface
抽象类,一般是在其他地方继承此类,可以理解为重载。我直接搜了一下类名
e.b.b.a.a.b
, 发现有两个重载,追进去看到函数名,就能大概确定就是我们要找的函数,而且是个native
函数,so
文件是wtf
。
# 使用
IDA
分析so
层逻辑从
apk
包里拿出libwtf.so
,用ida
打开,直接确定 -> 确定 -> 确定。。。到下图的界面点击右上角的
Exports
, 查看是否有我们需要的导出函数,搜索java
,刚好就是java
层看到的两个函数getSign
和getFinalDeviceId
.双击
getsign
函数,进入汇编代码界面然后一顿骚操作 >>F5
>>Hide casts
>>替换JNIEnv
; 就可以看到下图的伪 C 代码,逻辑很清晰
# 逻辑理清之后,直接上
frida hook
最后一次md5
加密的函数,so
层加密根据偏移地址进行hook
,参考之前frida
教程。console.log("so start:")
var address = Module.findBaseAddress("libwtf.so").add(0x1690+1);
console.log("func address:", address)
Interceptor.attach(address, {
onEnter: function (args) {
console.log("params1", Memory.readCString(args[0]));
},
onLeave: function (retval) {
console.log("here???", retval)
}
})
# 分析到这里已经结束了,有经验的师傅一眼就看出来
account
其实就是随机的UUID
,去java
代码验证无误。