建设工程有限公司企业网站,wordpress国产定制主题,国内html5网站欣赏,百度一下电脑版网页导语
学了一段时间的XPosed#xff0c;发现XPosed真的好强#xff0c;只要技术强#xff0c;什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路
apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用
应用分…导语
学了一段时间的XPosed发现XPosed真的好强只要技术强什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路
apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用
应用分析
进入应用之后会发现里边含有登录 会员等模块我们先不管登录的部分先检查会员的使用场景一般在会员的使用场景或者显示场景中都会有检查是否是VIP的业务逻辑根据这个来加载显示不同的资源
会员分析 通过对应用的检查发现在添加虚拟机设备的时候用到了会员权限 同时弹出一个对话框应用也贴心的告诉我们VIP的使用场景 打开算法助手算法助手对应用进行了常见功能的Hook最重要的是支持免费加固的Hook 将这3项勾选 重复1、2步在日志中检查OnClick和弹窗是否有用的信息 很幸运在这一步就获取有关的逻辑 且函数名称并没有被混淆能够从调用堆栈读出以下逻辑点击下载按钮-检查是否VIP-用户没有登录-显示购买VIP的弹窗 打开jadx将脱壳后的dex文件载入搜索checkVip 选择第一个函数发现无有用信息继续进入checkVip函数
在此函数中发现getUserConf即获取用户的配置
通过对此函数的阅读得出此函数的返回值为UserBean
然后检查UserBean 很明显有关VIP的数据都在此使用XPosed来修改这些成员变量即可达到对显示UI的修改即使服务器对这些数据有校验也不影响至少在UI层面已经成功了
抓包分析 使用抓包工具检查网络请求当点击底部的导航栏的时候应用会发送网络请求 通过检查getInfo获取一个Post请求的链接对此链接进行引用查询发现有关用户的逻辑 对此链接进行引用查询发现有关用户的逻辑阅读此函数网络请求库可能为Retrofit当请求成功的时候会将用户的信息保存起来并移除广告同样也能得到UserBean这个关键的信息 编写插件
思路
通过对应用的分析可以得出一个关键的信息getUserConfgetUserConf函数右键-复制为XPosed片段 1 2 3 4 5 6 7 8 9 10 XposedHelpers.findAndHookMethod(com.vmos.pro.account.AccountHelper, classLoader, getUserConf, new XC_MethodHook() { Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); } Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); } });
可以看到jadx为我们一键生成了有关的Hook代码但是这样就行了吗我可以告诉你不行。别忘了这是一个加壳的应用即使它是一款免费的加壳
加壳应用Hook
通过对网上公开资料的查询发现即使应用加固也需要在运行时进行还原修复使用jadx打开加固的apk文件找到attachBaseContext 1 2 3 4 5 6 7 8 9 XposedHelpers.findAndHookMethod(com.stub.StubApp, param.classLoader, attachBaseContext, android.content.Context.class, new XC_MethodHook() { Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Context context (Context) param.args[0];//获取运行时的Context ClassLoader classLoader context.getClassLoader()//获取真正的ClassLoader //在此添加Hook VIP等操作使用classLoader } });
继续编写
获取到正确的ClassLoader后对getUserConf函数的返回值进行遍历 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 XposedHelpers.findAndHookMethod(com.vmos.pro.account.AccountHelper, classLoader, getUserConf, new XC_MethodHook() { Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Object UserBean param.getResult(); for (Field field : UserBean.getClass().getDeclaredFields()) { //设置可访问, 极其重要, 不然会崩溃 field.setAccessible(true); //使用反射来获取运行时的数据 var name field.getName(); var type field.getType(); var value field.get(UserBean); Log.i(HookTag, name : value); } super.afterHookedMethod(param); } }); Hook完成后能够发现nickName是正确的能够对应上UI的显示 接下来只需要对循环里的数据进行判断赋值然后返回即可 1 2 3 4 5 6 7 8 9 10 //修改名称其他自行测试 for (Field field : UserBean.getClass().getDeclaredFields()) { ...... if (name.equals(nickName)) { field.set(UserBean, 测试文字); } else if(......) { ...... } } param.setResult(UserBean);//设置返回值替换掉param.getResult()获取的
UI显示和下载功能 插件下载破解
获取到VIP后发现还有一个插件下载的逻辑没有效果
下载逻辑分析 当点击Root或者XPosed的时候会提示加载失败 但是点击谷歌服务的时候却有效果猜测是网络请求 打开抓包工具通过对两者的对比发现是其中少了一些数据所以才会加载失败 在jadx中搜索getPluginUrl通过阅读此函数发现有2个匿名函数failure和success 使用jadx默认给我们的参数Hook不太行这时候需要使用其他函数来获取vu 1 2 3 4 5 6 7 8 9 10 11 //vujo4.class 无法获取 //使用loadClass来获取在参数中填写vu即可 Class? vu classLoader.loadClass(vu); XposedHelpers.findAndHookMethod(com.vmos.pro.activities.main.fragments.PluginHelper$getPluginDownloadBean$2$1, classLoader, success, vu, new XC_MethodHook() { Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Log.i(HookTag, success: Arrays.toString(param.args)); super.beforeHookedMethod(param); } }); //或者使用XposedBridge.hookAllMethods
通过对这两者的Hook当点击Root插件按钮时会进入success且参数为 1 2 谷歌服务按钮success: [CommonResult{code0, msgOK, dataRespPlugin{systemPluginResultRespPluginInfo{pluginUrlhttp://xxx/xxx/plugin/android71gp_plugin-64bit3.zip, pluginMd562c38ec6b509e546e9fe9566969f7c49, version0}}}] Root按钮success: [CommonResult{code0, msgOK, dataRespPlugin{systemPluginResultnull}}]
可以明显发现其中确实是少了一些数据接下来只需要补齐下载链接即可但是如何获取这个链接呢
充值VIP获取其中的链接扫描网站链接?或者找到一个函数获取?猜测
上面2点显然不是我能够解决的2333那就通过对链接的猜测吧根据能够下载的谷歌服务链接来看root和xposed可能为
http://xxx/xxx/plugin/android71root_plugin-64bit.ziphttp://xxx/xxx/plugin/android71xposed_plugin-64bit.zip通过一系列猜测得出来正确的下载链接MD5的话只需要在终端输入md5 file即可得到
阅读函数检查参数发现具体的链接在vu中的data但是返回类型是T这就比较麻烦了 这里采用一种比较麻烦的方法来修改
Hookvu类的m49633函数获取返回结果遍历返回结果的Fields找到含有systemPluginResult的field使用field.getType()获取到Class? jo4使用jo4.newInstance()创建一个实例ret再次遍历ret.getDeclaredFields()根据pluginMd5和pluginUrl分别赋值到ret中最后使用field.set(data, ret);赋值即可具体代码截图pluginMd5和pluginUrl是我获取的正确链接就不公布了