【Android安全-某旅行App之user-dun算法分析】此文章归类为:Android安全。
【文章仅对学习过程进行记录心得,不做任何商务用途,如有侵权,请联系本人删除】
起因是近来空闲,想进一步巩固自己的知识,询问之下发现libduncode.so是个有意思的算法,其中的user-dun便来源于nativeSign方法

从抓包 - java逆向 - 定位so jni方法调用 并没有太多难度,复杂在于so层代码经过混淆,并且以我的能力没办法很好的复原,虽然使用d810插件可以“稍微”好一丢丢,但是并没有太大的卵用,于是乎,有了绞劲脑汁/费尽心思/用尽毕生功力,寻找的一个过程(当然还是我菜,希望有大佬指点指点)

这里还有一个误区,就是网上一搜"user-dun",会发现很多文章都是基于js的,在libduncode.so中的也是少之又少,并且app中有个"User-Dun",注意大小写,这个其实是h5页面的,也就是js代码的,而我刚上来就怼着这个Dun干,最后发现,不是我要逆的dun(吃了经验的亏)


针对libduncode.so创建线程进行hook,以及针对libduncode.so所有JNI方法进行hook

在调用nativeSign生成user-dun的时机是比较晚,并且前面有过setup和initialization这两个jni方法调用(具体作用没有研究,猜测可能是针对设备信息的一些初始化构造)
并且user-dun中是包括了一串62字节的字符串,这是通过JNI方法的cid构造的
后续unidbg构造会发现,其实libduncode.so初始化的时候就已经获取了设备信息并加密。这是构造user-dun的重点!
unidbg模拟构造不困难,但是也存在几个小问题,第一如何hook jni_onload之前的地址?第二得出的结果和抓包的结果格式不对?
我这里直接在LinuxModule.java中callInitFunction中进行判断,当开始调用libduncode.so的时候开始指定断点hook(大佬们有更方便的方法还请赐教,我是unidbg半桶水)
这是一个很狗的问题,就是他会取findclass一个不存在的类,Unidbg默认构造了,所以导致出错,最终导致生成的结果格式不对

可以调用unidbg的方法:

还会加载不存在的方法:

选择在_GetStaticMethodID方法插入代码判断:

在对initialization补全的时候,发现一个bug,总是卡在open base.apk中,进度缓慢,尝试多次hook 以及打印日志,发现就真的是进度缓慢,针对真机Hook理解代码,创建一个线程,伴随整个启动过程,甚至在获取到user-dun后,该线程也还是在运行打开base.apk,当然真机执行会快很多,并且看到了线程结束,没有深入研究,猜测对我们目前的算法还原影响不大(如果有误请大佬指出)
我的操作就是替换掉这个大的base.apk,给个很小的他,就很快跑完,当然,最后Unidbg中我是只调用nativeSign,其他两个jni方法可能对设备参数构造有支持,但是我目的在于算法还原,我想通过算法后解密抓包的user-dun来倒推设备参数,这样思路就明了很多,当然这个办法有很大Bug,可能设备问题,导致某些值不准确,或者缺少某些设备值
在我开启了ida调试逐步对比模式
发现很多result = getauxval(0x10uLL);调用返回结果是和unidbg不一致的,也不管三七二十一,直接hook

当然还有很多这样的问题,我是跟踪了很久对比了很久,第六感告诉我这都不是重点,于是转变思路,重新对env调用这块做重点补全,unidbg补什么我就hook返回
最后于 4小时前
被我是小趴菜编辑
,原因: 补充
更多【Android安全-某旅行App之user-dun算法分析】相关视频教程:www.yxfzedu.com