欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安卓逆向之Xposed Hook

程序员文章站 2024-02-25 21:23:21
...

Xposed介绍

Xposed通过拦截安卓程序运行过程来达到修改程序行为的目的。不需要修改安卓源文件,而是通过分析程序运行来拦截并影响运行情况。具体需要把安卓apk逆向后然后分析代码,定位到具体的类,方法等,然后通过xposed来拦截修改方法等。

逆向思路

首先我们总体来看下逆向的思路

  1. 首先需要在手机(模拟器或者真机,有root权限),安装xposed程序
  2. 通过jadx-gui或者android killer等工具对目前apk进行反编译
  3. 分析反编译后的的类文件,找出哪里是我们需要修改或者影响的行为
  4. 开发xpose插件(其实本质就是一个新的安卓程序),实现xposed类型的拦截方法
  5. 打包该插件安装到手机上
  6. 手机上的xpose程序上会识别到已有该插件,勾选上,则代表进行拦截行为
  7. 需要重启手机
  8. 然后操作目标apk, 发现其行为已经发生了改变。

具体如下图

安卓逆向之Xposed Hook

具体思路

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。
安卓逆向之Xposed Hook

具体代码如图:

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住了参数。如下图。
安卓逆向之Xposed Hook

3. 分析反编译后的的类文件,找出哪里是我们需要修改或者影响的行为

因为是自己写的程序,所以这里已经知道了要对showToast()方法来拦截。

4. 开发xpose插件(其实本质就是一个新的安卓程序),实现xposed类型的拦截方法

在android studio中新建一个安卓工程,需要先了解下安卓程序开发。取名叫做TestXposed。

1.导入xposed依赖jar包

api-82.jar 是一个xposed相关依赖包,下载好后放到根路径的lib下面,注意不是libs.
文件结构如图:安卓逆向之Xposed Hook

然后右键该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的插件引导类。
安卓逆向之Xposed Hook

6. 打包改程序安卓在apk
7. 在xposed installer中勾选改插件

需要在xposed_installer中勾选上改插件,这里需要重启手机和模拟器才能是的我们刚刚的逻辑正确运行。因为xposed是基于系统启动过程中接管了进程启动功能。所以每次有修改都需要修改。
安卓逆向之Xposed Hook

8. 运行程序
安卓逆向之Xposed Hook 至此,就实现了拦截处理。你可以在试下把刚刚的xposed模块去掉勾选,重启手机,在运行程序,他还是显示原来的文本。

思路回顾

整体来看,就是通过分析目标程序的代码,查看哪些是我们需要拦截的,然后编写拦截代码打包安装在手机一个apk,通过一个管理程序来安装这些插件使得他们的功能可以正常运行。
安卓逆向之Xposed Hook

上一篇: 中断唤醒系统流程

下一篇: