三分钟创建自定义Xposed模块-含实验

0x1 背景

Xposed模块常用于Android渗透测试,比如使用Inspeckage进行基本分析,使用SSLunpinning来绕过证书绑定。

现在Xposed已经比较成熟,有很多模块可用,然而做渗透测试有时并没有现成模块可用,比如说处理加密,绕过一些特定检查,输出一些非基本类型数据,或者做一些调用,这就需要自行编写模块解决。

尽管模块编写已经并不新鲜,然而对于不熟悉Xposed模块编写的人,模块的创建和编写过程有一定麻烦,而且Xposed API也仅仅进行了基本的封装,因此编写Xposed模块也就有了一点难度。

如果会写Java就会写Xposed模块多好?

于是我决定将Xposed进行封装,像一个组件一样整合进Android Studio,隐藏其中的技术细节,变成傻瓜式操作。

这就是XposedAndroid Studio模板,老少咸宜,快速方便,能够提高测试分析的效率。

好了,废话少说,我们用一个实验来看看它是不是好用。

0x2 实验

实验目标

一个非常简单的HelloWorld App

image.png

反编译看一看:

image.png

可见,Hello World这个字符串来自text2show这个方法。

好,接下来我们写一个模块把Hello World改为Hacked World

步骤一:创建Xposed模块

新建一个空工程

image.png

在Java源码处右键,新建 -> Xposed -> Xposed Module

image.png

创建Xposed模块,选中hook特定应用,将HelloWorld App的包名填进去(可从AndroidManifest.xml文件获得)。

image.png

至此,一个Xposed模块就创建了,xposed_init和XposedBridge.jar等细节均自动完成,不用管。

image.png

步骤二:创建Xposed钩子

在Java源码处右键,新建 -> Xposed -> Xposed Hook

image.png

这样就可以创建一个钩子了。

模板里也有一些预制的钩子,比如说打印方法参数/返回值、实时修改参数/返回值。

image.png

或者直接点Finish就好了。

image.png

我们添加一行

1
param.setResult("Hacked World");

一个修改方法返回值钩子的创建就完成了。

步骤三:将钩子挂在目标方法上

当你使用Xposed自带的XposedHelper进行Hook时,它其实是通过反射来目标获取方法的,老实说,还要指定参数类型很麻烦,如果要指定一些非基本类型参数的方法,就更麻烦了。

何必多此一举呢,利用反射机制获得方法所在的类就好了。

1
Class clz = Class.forName("com.example.monkeylord.demoapp.MainActivity",false,classLoader);

image.png

然后将钩子实例化,挂上。

这里有两种方法:

1、使用正则表达式,hook能够匹配的所有方法。

(其实Xposed并没有要求钩子和方法一一对应,钩子可以一对多,也可以复用)。

1
2
new MyXposedHook().hook(clz,"text2show");
//new MyXposedHook().hook(clz,".*");

image.png

2、反射获取方法,进行精确hook

1
new MyXposedHook().hook(clz.getDeclaredMethods()[2]);

image.png

实验结果

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

加载模块后可见:

image.png

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

Xposed编写那些事

http://www.freebuf.com/articles/terminal/114910.html