0x1 背景
渗透测试经常遇到加固应用,按照一般教程编写Xposed插件会Hook不到,因此许多人认为加固能够防Hook,不懂如何Hook加固后的应用。
本篇文章将教大家,如何使用简单的方式Hook加固后的应用。
Hook加固应用Hook不到的原因是,Xposed模块中handleLoadPackage被调用时壳没有启动,所以并没有将应用的类装载进VM。解决方法也相当简单,只需要挑选一个已经装在进VM的时机再Hook即可。
在XposedAndroid Studio模板中包含Timing模板,就是用来解决Hook时机问题的。
0x2 实验
实验目标
一个加固后的应用
反编译看一看,可见是360加固,修复起来应该有点麻烦。
我们要Hook其中的com.timanetworks.timasync.android.base.AsyncSender类的send方法(通过脱壳、打印堆栈或其他方式获得的类名方法名),来分析其网络协议。
步骤一:创建Xposed模块和钩子
新建空工程创建Xposed模块
包名从AndroidManifest.xml中获得。
创建一个Xposed钩子,使用预制钩子Tracer
步骤二:使用Timing模板选择Hook时机
在Java源码处右键,新建->Xposed->Timing,加入Timing代码。
在模块入口处使用Timing,第二个参数表示是否相应时机只执行一次,我们并不需要在这些时机反复执行,因此填true。
然后实现对应时机的方法即可,此处我用到了onNewActivity,即新Activity创建时,一般也代表着相关类早已加载完成。然后将钩子在此时机里挂载目标上。
1 | new Timing(loadPackageParam,true){ |
实验结果
编译模块,然后安装,使用Xposed框架加载,重启框架。
打开应用,随便输入账号密码(如18888888888/123456)后点击登陆。
切出查看Xposed日志,如图所见,方法调用被成功打印出来。
0x3 总结
关于Xposed的Hook
基于Xposed的实现原理,其只能Hook已经真实存在的方法,如果某个方法在内存中并不存在(或者暂时还不存在),Xposed是无法进行预先Hook的。
关于Timing模板
Timing模板是对常用的Hook时机的封装。
除了onNewActivity这个时机外,还有许多其他时机可以选择,目前实现的时机如下:
1 | afterNewActivity(Activity activity) |
如果你想抢在应用真正代码加载进内存而又没有开始运行时,那么可以选择onAttachBaseContext时机。
一般我喜欢使用onNewActivity这个时机,因为比较稳妥不会被壳针对。
后续还会进一步讲解
1、如何利用Xposed模块寻找应用的关键加解密方法(也是获取包名和方法名的办法)
2、如何实时篡改方法的参数及返回值
0x4 附件与参考
本次Hook的App
链接: https://pan.baidu.com/s/13MKQesSiKvRlWxZvHPtPpA 密码: qyrb