安卓逆向之Xposed Hook
Xposed介绍
Xposed通过拦截安卓程序运行过程来达到修改程序行为的目的。不需要修改安卓源文件,而是通过分析程序运行来拦截并影响运行情况。具体需要把安卓apk逆向后然后分析代码,定位到具体的类,方法等,然后通过xposed来拦截修改方法等。
逆向思路
首先我们总体来看下逆向的思路
- 首先需要在手机(模拟器或者真机,有root权限),安装xposed程序
- 通过jadx-gui或者android killer等工具对目前apk进行反编译
- 分析反编译后的的类文件,找出哪里是我们需要修改或者影响的行为
- 开发xpose插件(其实本质就是一个新的安卓程序),实现xposed类型的拦截方法
- 打包该插件安装到手机上
- 手机上的xpose程序上会识别到已有该插件,勾选上,则代表进行拦截行为
- 需要重启手机
- 然后操作目标apk, 发现其行为已经发生了改变。
具体如下图
具体思路
1.在手机上安装xposed instller程序
这里我们使用的的安卓模拟器,我是用的是网易的mumu模拟器,模拟器需要电脑开启虚拟化VT功能,不然运行起来会很卡。同时需要在模拟器上设置root权限。然后到官网上下载xposed installer,需要注意不同安卓系统版本对应xposed installer 版本有区别。xposed installer程序的功能是安装我们后面开发的xposed插件的。
xposed下载网址
http://forum.xda-developers.com/showthread.php?t=3034811
2.通过jadx-gui等对apk进行反编译
这里我们为了更好理解,我们直接自己写了一个安卓程序,他的功能就是只有一个mainActivity,有一个按钮,点击后提示一个hello。
具体代码如图:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showToast("hello");
}
public void showToast(final String text) {
View viewById = findViewById(R.id.button1);
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
});
}
}
其实这里就是在showToast方法这里传入一个参数,点击后把这个值展示一下。我们通过oncreate()方法来调用并传入一个hello值。
现在我们要拦截这个方法,把他的值改为hook住了参数。如下图。
3. 分析反编译后的的类文件,找出哪里是我们需要修改或者影响的行为
因为是自己写的程序,所以这里已经知道了要对showToast()方法来拦截。
4. 开发xpose插件(其实本质就是一个新的安卓程序),实现xposed类型的拦截方法
在android studio中新建一个安卓工程,需要先了解下安卓程序开发。取名叫做TestXposed。
1.导入xposed依赖jar包
api-82.jar 是一个xposed相关依赖包,下载好后放到根路径的lib下面,注意不是libs.
文件结构如图:
然后右键该jar包,选择Add As Library添加进依赖库。
2.修改app目录下的build.gradle文件
把
implementation files('lib/api-82.jar')
改为
compileOnly files('lib/api-82.jar')
3.修改AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 让手机中的xposed installer程序识别出该apk是xposed模块 -->
<meta-data
android:name="xposedmodule"
android:value="true" />
<!-- 描述信息,显示改模块的具体作用 -->
<meta-data
android:name="xposeddescription"
android:value="Xposed 测试例子" />
<!-- 最低xposed版本号(lib文件名可知) -->
<meta-data
android:name="xposedminversion"
android:value="30" />
</application>
4. 编写拦截处理代码
这里分析到,目标apk,就是添加了一个button按钮,点击后调用的是showToast()方法,showToast里面是调用安卓的一个Toast.makeText方法,显示文本,而文本是我们传进来的参数。
所以拦截代码如下:建立一个HookToast类,实现IXposedHookLoadPackage接口,需要是实现handleLoadPackage方法。通过XposedHelpers工具类来拦截处理方法,改工具类可以对方法,属性级别的拦截,我们这里是调用findAndHookMethod方法实现方法级别的拦截,第一个参数是需要拦截的目标apk的类路径,因为安卓程序的都是包名唯一的,所以可以唯一确定一个类,这里就是反编译后分析出来的结果。第三个参数就是拦截的showToast方法,然后传进来一个方法拦截的处理器XC_MethodHook。通过param.args可以获取被拦截方法传进来的参数,我们这里取第一个参数就是showToast方法的参数,然后改成hook住了参数.
public class HookToast implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
XposedHelpers.findAndHookMethod("com.example.myapplication.MainActivity", loadPackageParam.classLoader,
"showToast", String.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
param.args[0] = "hook住了参数";
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
param.args[0] = "hook成功了";
}
});
}
}
5. 创建xposed_init文件
需要在main路径下建立一个assets文件夹,里面新增一个xposed_init文件,不要后缀名,然后文件里面是我们刚刚写的hook代码的类,作为xposed installer的插件引导类。
6. 打包改程序安卓在apk
7. 在xposed installer中勾选改插件
需要在xposed_installer中勾选上改插件,这里需要重启手机和模拟器才能是的我们刚刚的逻辑正确运行。因为xposed是基于系统启动过程中接管了进程启动功能。所以每次有修改都需要修改。
8. 运行程序
至此,就实现了拦截处理。你可以在试下把刚刚的xposed模块去掉勾选,重启手机,在运行程序,他还是显示原来的文本。思路回顾
整体来看,就是通过分析目标程序的代码,查看哪些是我们需要拦截的,然后编写拦截代码打包安装在手机一个apk,通过一个管理程序来安装这些插件使得他们的功能可以正常运行。
上一篇: 中断唤醒系统流程