Xposed模块开发入门
原文章是从Xposed作者github上翻译过来的,但是其中一些内容在新版本的Android studio中不再适用,我将结合自己实践对原文进行补充。
Method hooking/replacing
Xposed真正强大的地方在于对Method调用的hook,如果通过反编译来验证逻辑猜想的话,只能多次的反编译代码,修改代码,重新签名打包来完成。而使用Xposed的hook功能,不用修改apk方法中的代码,通过再目标method前后插入要执行的代码即可,method是java中最小的执行单元。
创建project
一个xposed module本质上是一个普通的Android app,只是多了几个meta data和文件而已。因此,首先创建一个普通的Android project,sdk版本选择4.0.3(API 15)以上,因为module没有界面,因此不必要创建activity,这时,应该已经创建好了一个空的Android project。
但是不创建activity将无法安装到模拟器上,建议还是创建一个empty activity
接下来把上一步刚创建好的project改造成可以被Xposed加载的module,分为以下几个步骤:
添加Xposed Framework API到project
在https://bintray.com/rovo89/de.robv.android.xposed/api下载相应的api,放到项目的libs文件夹下,并在app/build.gradle中引入。
1 | dependencies { |
*将implementation fileTree(dir: “libs”, include: [“.jar”])这行注释掉,否则构建项目时会失败**
需要注意的是,这里是有provide而不是compile。如果使用compile,api库的classes将会被打包到apk中,会导致bug,特别是在Android 4.x设备上。使用provided只是让module可以通过编译,在apk中只有对api的引用,真正的实现在由运行设备的Xposed Framework提供。新版本的Android Studio中provide被compileOnly代替。
AndroidManifest.xml
Xposed Installer能列出系统已经安装的module,是因为它通过application中一个特殊的meta flag来识别。到AndroidManifest.xml => Application => Application Nodes (at the bottom) => Add => Meta Data.在Application节点底部添加几个meta data.
- name:xposedmodule,value:true;
- name:xposedminversion,value:上一节获得的API version;
- name:xposeddescription,value:module简单的描述
1 |
|
Module实现
以http://blog.llloverr.com/index.php/archives/21/中看雪ctf的一道题目为例
新建一个class
1 | package com.luckyfuture.firsthook; |
assets/xposed_init
最后要做的一件事是告诉XposedBridge那个class包含hook入口,通过一个叫xposed_init的文件。在asset目录下新建这个文件,该文件每行包含一个class的全限定名,在这里是:com.luckyfuture.firsthook.Start。
编译运行
保存上述修改,运行这个application,因为是首次安装这个module,需要首先打开Xposed Installer激活。在Modules tab找到刚安装的module,激活,重启设备.通过logcat观察输出