学了一段时间的XPosed,发现XPosed真的好强,只要技术强,什么操作都能实现...
这次主要记录一下我对这款应用的逆向思路
使用MT管理器检查apk的加壳情况
发现是某数字的免费版本
直接使用frida-dexdump
脱下来后备用
登录
会员
等模块会员
的使用场景,一般在会员
的使用场景或者显示场景中都会有检查是否是VIP
的业务逻辑,根据这个来加载显示不同的资源会员
分析通过对应用的检查发现在添加虚拟机设备的时候用到了会员
权限
?
同时弹出一个对话框,应用也贴心的告诉我们VIP
的使用场景?
?
打开算法助手,算法助手对应用进行了常见功能的Hook,最重要的是支持免费加固的Hook
将这3项勾选
?
重复1、2步,在日志中检查OnClick和弹窗是否有用的信息
很幸运,在这一步就获取有关的逻辑
且函数名称并没有被混淆,能够从调用堆栈读出以下逻辑:点击下载按钮->检查是否VIP->用户没有登录->显示购买VIP的弹窗
打开jadx将脱壳后的dex文件载入,搜索checkVip
?选择第一个函数,发现无有用信息,继续进入checkVip
函数在此函数中发现getUserConf,即获取用户的配置
?在此函数中发现getUserConf,即获取用户的配置
?
通过对此函数的阅读,得出此函数的返回值为UserBean
?
然后检查UserBean
?
?
很明显,有关VIP的数据都在此,使用XPosed来修改这些成员变量,即可达到对显示UI的修改,即使服务器对这些数据有校验也不影响,至少在UI层面已经成功了
使用抓包工具检查网络请求,当点击底部的导航栏的时候,应用会发送网络请求
?
通过检查getInfo
,获取一个Post请求的链接
对此链接进行引用查询,发现有关用户的逻辑
?
?
阅读此函数,网络请求库可能为Retrofit,当请求成功的时候会将用户的信息保存起来并移除广告?同样也能得到UserBean
,这个关键的信息?
getUserConf
getUserConf
函数右键->复制为XPosed片段?
1 2 3 4 5 6 7 8 9 10 |
|
通过对网上公开资料的查询,发现即使应用加固也需要在运行时进行还原修复,使用jadx打开加固的apk文件,找到attachBaseContext
1 2 3 4 5 6 7 8 9 |
|
getUserConf
函数的返回值进行遍历 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Hook完成后,能够发现nickName
是正确的,能够对应上UI的显示
?
?
?
接下来只需要对循环里的数据进行判断赋值,然后返回即可
1 2 3 4 5 6 7 8 9 10 |
|
?
获取到VIP
后,发现还有一个插件下载的逻辑没有效果
当点击Root或者XPosed的时候,会提示加载失败
?
但是点击谷歌服务的时候却有效果,猜测是网络请求
打开抓包工具,通过对两者的对比,发现是其中少了一些数据,所以才会加载失败
?在jadx中搜索getPluginUrl
,通过阅读此函数发现有2个匿名函数,failure
和success
?
?
使用jadx默认给我们的参数Hook不太行,这时候需要使用其他函数来获取vu
1 2 3 4 5 6 7 8 9 10 11 |
|
Root
插件按钮时会进入success
且参数为: 1 2 |
|
http://xxx/xxx/plugin/android71root_plugin-64bit.zip'
http://xxx/xxx/plugin/android71xposed_plugin-64bit.zip'
md5 file
即可得到vu
中的data
,但是返回类型是T,这就比较麻烦了?
?
vu
类的m49633
函数获取返回结果Fields
systemPluginResult
的fieldfield.getType()
获取到Class<?> jo4
jo4.newInstance()
创建一个实例ret
ret.getDeclaredFields()
pluginMd5
和pluginUrl
分别赋值到ret
中field.set(data, ret);
赋值即可pluginMd5
和pluginUrl
是我获取的正确链接,就不公布了?
?
?
?