0x1 背景
Xposed模块常用于Android渗透测试,比如使用Inspeckage进行基本分析,使用SSLunpinning来绕过证书绑定。
现在Xposed已经比较成熟,有很多模块可用,然而做渗透测试有时并没有现成模块可用,比如说处理加密,绕过一些特定检查,输出一些非基本类型数据,或者做一些调用,这就需要自行编写模块解决。
尽管模块编写已经并不新鲜,然而对于不熟悉Xposed模块编写的人,模块的创建和编写过程有一定麻烦,而且Xposed API也仅仅进行了基本的封装,因此编写Xposed模块也就有了一点难度。
如果会写Java就会写Xposed模块多好?
于是我决定将Xposed进行封装,像一个组件一样整合进Android Studio,隐藏其中的技术细节,变成傻瓜式操作。
这就是XposedAndroid Studio模板,老少咸宜,快速方便,能够提高测试分析的效率。
好了,废话少说,我们用一个实验来看看它是不是好用。
0x2 实验
实验目标
一个非常简单的HelloWorld App
反编译看一看:
可见,Hello World这个字符串来自text2show这个方法。
好,接下来我们写一个模块把Hello World改为Hacked World
步骤一:创建Xposed模块
新建一个空工程
在Java源码处右键,新建 -> Xposed -> Xposed Module
创建Xposed模块,选中hook特定应用,将HelloWorld App的包名填进去(可从AndroidManifest.xml文件获得)。
至此,一个Xposed模块就创建了,xposed_init和XposedBridge.jar等细节均自动完成,不用管。
步骤二:创建Xposed钩子
在Java源码处右键,新建 -> Xposed -> Xposed Hook
这样就可以创建一个钩子了。
模板里也有一些预制的钩子,比如说打印方法参数/返回值、实时修改参数/返回值。
或者直接点Finish就好了。
我们添加一行
1 | param.setResult("Hacked World"); |
一个修改方法返回值钩子的创建就完成了。
步骤三:将钩子挂在目标方法上
当你使用Xposed自带的XposedHelper进行Hook时,它其实是通过反射来目标获取方法的,老实说,还要指定参数类型很麻烦,如果要指定一些非基本类型参数的方法,就更麻烦了。
何必多此一举呢,利用反射机制获得方法所在的类就好了。
1 | Class clz = Class.forName("com.example.monkeylord.demoapp.MainActivity",false,classLoader); |
然后将钩子实例化,挂上。
这里有两种方法:
1、使用正则表达式,hook能够匹配的所有方法。
(其实Xposed并没有要求钩子和方法一一对应,钩子可以一对多,也可以复用)。
1 | new MyXposedHook().hook(clz,"text2show"); |
2、反射获取方法,进行精确hook
1 | new MyXposedHook().hook(clz.getDeclaredMethods()[2]); |
实验结果
编译模块,然后安装,使用Xposed框架加载,重启框架。
加载模块后可见:
HelloWorld App的文本已经被修改成了Hacked World。
0x3 总结
编写一个Xposed模块其实只需要关注三件事:
1、在什么时机
handleLoadPackage
2、Hook谁
com.example.monkeylord.demoapp.MainActivity.text2show
3、做什么
param.setResult(“Hacked World”);
方法与钩子无需一对一
一个钩子可以对应多个方法,钩子也可以反复复用。
之前有人想要Hook所有方法然后报OOM,就是因为一方法一钩子导致的。
其实可以只用一个钩子Hook所有方法,如果你感兴趣,可以去试试。
关于模板
Xposed Android Studio模板即是为了封装其技术实现,让分析者只需关注其逻辑。
模板的项目地址在:https://github.com/monkeylord/XposedTemplateForAS
其中还封装了许多便于创建Xposed模块的模块化代码,也欢迎大家上传自己封装的代码。
clone以后把里面的目录拷贝到AndroidStudio安装路径下存储模板的目录即可。
后续还会进一步讲解:
1、如何利用Xposed模块寻找应用的关键加解密方法
2、如何实时篡改方法的参数及返回值
3、如何Hook加固后的应用
0x4 附件与参考
HelloWorld App
链接:https://pan.baidu.com/s/1dG3PjZN 密码:n2s0