三分钟学会Hook加固后应用-含实验

0x1 背景

渗透测试经常遇到加固应用,按照一般教程编写Xposed插件会Hook不到,因此许多人认为加固能够防Hook,不懂如何Hook加固后的应用。

本篇文章将教大家,如何使用简单的方式Hook加固后的应用。

Hook加固应用Hook不到的原因是,Xposed模块中handleLoadPackage被调用时壳没有启动,所以并没有将应用的类装载进VM。解决方法也相当简单,只需要挑选一个已经装在进VM的时机再Hook即可。

XposedAndroid Studio模板中包含Timing模板,就是用来解决Hook时机问题的。

0x2 实验

实验目标

一个加固后的应用

image.png

反编译看一看,可见是360加固,修复起来应该有点麻烦。

image.png

我们要Hook其中的com.timanetworks.timasync.android.base.AsyncSender类的send方法(通过脱壳、打印堆栈或其他方式获得的类名方法名),来分析其网络协议。

步骤一:创建Xposed模块和钩子

新建空工程创建Xposed模块

image.png

包名从AndroidManifest.xml中获得。

image.png

创建一个Xposed钩子,使用预制钩子Tracer

image.png

步骤二:使用Timing模板选择Hook时机

在Java源码处右键,新建->Xposed->Timing,加入Timing代码。

image.png

在模块入口处使用Timing,第二个参数表示是否相应时机只执行一次,我们并不需要在这些时机反复执行,因此填true。

image.png

然后实现对应时机的方法即可,此处我用到了onNewActivity,即新Activity创建时,一般也代表着相关类早已加载完成。然后将钩子在此时机里挂载目标上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
new Timing(loadPackageParam,true){
@Override
protected void onNewActivity(XC_MethodHook.MethodHookParam param) {
super.onNewActivity(param);
try {
Class clz = Class.forName("com.timanetworks.timasync.android.base.AsyncSender",
false,
classLoader);
new MyXposedHook().hook(clz, "send");
}catch (Exception e){
XposedBridge.log(e.getLocalizedMessage());
}
}
};

实验结果

编译模块,然后安装,使用Xposed框架加载,重启框架。

打开应用,随便输入账号密码(如18888888888/123456)后点击登陆。

image.png

切出查看Xposed日志,如图所见,方法调用被成功打印出来。

image.png

0x3 总结

关于Xposed的Hook

基于Xposed的实现原理,其只能Hook已经真实存在的方法,如果某个方法在内存中并不存在(或者暂时还不存在),Xposed是无法进行预先Hook的。

关于Timing模板

Timing模板是对常用的Hook时机的封装。

除了onNewActivity这个时机外,还有许多其他时机可以选择,目前实现的时机如下:

1
2
3
4
5
afterNewActivity(Activity activity)
onNewApplication(Application application)
afterNewApplication(Application application)
onAttachBaseContext(Context context)
afterAttachBaseContext(Context context)

如果你想抢在应用真正代码加载进内存而又没有开始运行时,那么可以选择onAttachBaseContext时机。

一般我喜欢使用onNewActivity这个时机,因为比较稳妥不会被壳针对。

后续还会进一步讲解

1、如何利用Xposed模块寻找应用的关键加解密方法(也是获取包名和方法名的办法)

2、如何实时篡改方法的参数及返回值

0x4 附件与参考

本次Hook的App

官网下载

链接: https://pan.baidu.com/s/13MKQesSiKvRlWxZvHPtPpA 密码: qyrb

之前内容

三分钟创建自定义Xposed模块

获得类名方法名的一个思路

使用网络堆栈自底向上定位数据加解密代码位置