一、情景介绍 这个软件内部做了防止Xposed的hook功能检测,当我们写了对应了Xposed模块在打开app的时候就会出现这样的错误,其实吧这个错误 上之前有人写过分析了,我们可以百度一下: 看到这些搜索结果了吧,早在去年这个人就写了这个分析,无独有偶这个人就在我的编码美丽小密圈里,不过更可惜的是,这个方案现在已经不行了。 第二、检测进程中使用so名中包含关键”hack|inject|hook|call” 的信息,这个主要是防止有的人不用这个Xposed框架,而是直接自己写一个注入功能 第三、root检测原理是:是否含有su程序和ro.secure是否为1 第五、如果应用被Xposed进行hook操作之后,抛出的异常堆栈信息中就会包含Xposed字样,所以可以通过应用自身内部抛出异常来检测是否包含Xposed字段来进行防护: 有的同学会好奇怎么反射操作呀为Xposed的hook原理的就是在程序启动都注入jar功能,所以安装hook模块之后,每个应用内部都包含了这个Xposed功能jar,就相当于你的应用中有了Xposed的所有功能类,所以在应用中反射Xposed的类是可以成功的,当然前提是设备装了Xposed并且有相应的hook模块!而这些方案已经都是公开的,一些应用为了防止被hook做了很强的安全防护策略,大家感兴趣可以去看看”一 店”应用,会发现hook他也是失败的,并且很难找到相应的检测机制! 就是在ScanAttack类中进行了很多检测,这里就不在截图一一说明了,那么我们直接hook这个类,然后把所有检测都拦截掉不就可以了吗惜的是没有效果。 三、逆向分析 这里我们分析得到了这个对话框的大致布局,找到展示消息的TextView的id值,这里我们先不去public.xml中找到对应的int值,可以先去jadx中搜索R.id.message即可,要是搜不到在去找int值进行搜索: 幸运的是我们在多个dex中都搜到了这个值,而且看上去也是一个对话框类,点进去进行查看: 那么确定是不是这些对话框很简单,直接hook这些对话框的onCreate方法即可,可惜的是全部没有走到也就是没有效果,这里我说的是一些也就是我把搜索到的对话框都hook了一遍都是没效果的。所以到这里我们就陷入了沉思,哦不对是我陷入了沉思,这几天我夜不能寐辗转反侧饭也吃不下水也喝不进去,就在我绝望之际那天我一个人孤独的走在漆黑的小树林里,突然灵机一动想到一个绝妙的思路,那就是不管他是自定义的对话框还是用的系统对话框。那么最终都会调用对话的show方法,那么我们就直接干脆点hook系统的对话框方法: 就这么进行hook系统对话框的show方法,然后在内部进行异常抛出来打印堆栈信息可以更快的跟踪代码调用逻辑,然后运行模块,其实运行前心里没底因为感觉理论上应该差不多可能或许会成功: 哈哈哈,果然成功了我们定位到了代码关键点在CI这个类中弹出这个对话框的,查看代码: 看到这个类方法之后,发现了一件大事就是这个支付应用内部为了防止被字符串查找,内部的字符串信息全部Base64编码类,其实这个我在之前也说过了,现在有些应用为了保护自己应用内的常量字符串信息在编译期做了防护编码。后面会单独出一篇文章解析这个操作的,我们可以把一个应用内部的字符串常量全部加密。其实 上已经有这种插件或者工具了,但是没怎么说原理。然后这里我们看到他用的是AlertDialog对话框进行展示的,不过AlertDialog对话框是继承Dialog类的,这里看到为什么我们hook这个Dialog类的show方法了吧,因为最终调用show方法都是调用Dialog的show方法。我们继续查看逻辑代码,看到有一个按钮是关闭的,直接看看内部代码: 然后看看点击事件: 在这里就强制退出程序了,那么到这里我们继续来看什么时候弹出这个对话框的呢们查看堆栈信息: 有一个内部类中的run方法: 然后这里做了一个判断逻辑之后开始调用展示对话框逻辑: 这里看到他在做检测逻辑了,这些功能都还是在CI这个类中,其实到这里有的同学会好奇上面的堆栈方法信息到run就结束了,也没看到他调用这个检测方法呀实这里有个遗憾就是没法继续跟踪下去了,因为堆栈信息断了,而且我猜想支付应用内部还有什么判断逻辑而已。 四、过滤hook检测 合理看到如果想屏蔽原始方法直接返回null即可,那如果还是想调用原始方法怎么办呢为有时候我们可能需要判断有一些情况需要屏蔽原始方法有些情况是不需要的,那么不屏蔽的方法就是直接返回 XposedBridge.invokeOriginalMethod 即可。下面就直接运行这个模块即可。
既然这个方法是Base64编码的,那么拦截这个编码方法打印他的原始字符串信息即可获取所有原始没有编码的常量字符串信息了,即使不这么做也可以自己写一个程序进行编码然后全局搜索这个Base64编码字符串信息也是可以定位到的。那么我们后面要做的是介绍如何把应用中的常量字符串信息全部编码一下,至于什么编码加密可以自行定义。 六、总结 |
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!