Xposed框架开发入门(二)--使用Xposed框架实现Activity跳转拦截

接着上一篇Xposed框架入门开发(一)继续,在上一篇中已经说了,第二篇主要介绍的是Xposed框架开发的基础的应用。在接下来的文章中,主要以一个Activity的跳转APP为例, 示范Xposed框架的基本使用方法。

1、编写一个简单的Activity跳转的应用

在Android Studio中建立工程XposedDemo,在app中添加两个Activity。首先新建在layout中新建layout1.xml和layout2.xml,向每个layout中添加一个TextView,标明其对应的activity。如下为layout1.xml的代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zhayh.xposeddemo.Layout1Activity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_01"
        android:text="Activity_01"
        android:textSize="40sp"
        android:layout_centerInParent="true"/>

</RelativeLayout>

效果如下:
这里写图片描述
新建两个Activity:Layout1Activity和Layout2Activity,直接在onCreate()的setContentView设置layout1和layout2。

在activity_main.xml中设置两个button,通过这两个button分别跳转到activity1和activity2。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zhayh.xposeddemo.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_01"
        android:text="跳转Activity_01"
        android:layout_centerInParent="true"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_02"
        android:text="跳转Activity_02"
        android:layout_below="@id/btn_01"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

效果如下:
这里写图片描述

此时在MainActivity中设置对应的点击事件。这里先新建一个util包,在其下新建一个ButtonListener.java类,该类实现了OnClickListener接口,重写了onClick方法,用来设置点击事件,代码如下:

public class ButtonListener implements View.OnClickListener {
    private Context context = null;
    private Class deste_activity_class = null;

    public ButtonListener(Context context,Class dest_activity_class) {
        this.context = context;
        this.deste_activity_class = dest_activity_class;
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(context,deste_activity_class);
        context.startActivity(intent);
    }
}

这个类非常重要,因为我们接下来的跳转拦截时就是对点击事件进行hook,修改目标activity的参数,达到跳转到我们设置的activity中,从而实现跳转拦截。

然后在MainActivity.java中设置点击事件,代码如下:

public class MainActivity extends Activity {
    private Button btn_01 = null;
    private Button btn_02 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_01 = (Button) findViewById(R.id.btn_01);
        btn_02 = (Button) findViewById(R.id.btn_02);

        btn_01.setOnClickListener(new ButtonListener(MainActivity.this,Layout1Activity.class));
        btn_02.setOnClickListener(new ButtonListener(MainActivity.this,Layout2Activity.class));
    }
}

OK,到这里我们Activity跳转的应用就完成了,运行程序,结果如下:
这里写图片描述
可以看到点击“跳转Activity_01”后跳转到Activity_01,点击“跳转Activity_02”后跳转到Activity_02.
同时最终项目目录结构如下:
这里写图片描述

2、Xposed模块基本配置

1、新建Xposed模块项目,在XposedDemo中New Module为“hookjump”,选择Add No Activity(我们这里的Xposed模块不需要Activity),完成项目创建。
这里写图片描述

2、在Module中创建一个lib文件夹,然后将下载好的XposedBridgeApi.jar(我这里为XposedBridgeApi-54.jar)拷贝到该目录下,然后右键“Add As Library…” 。
这里特别注意是新建一个lib文件夹而不是直接放到工程中已经建立好的libs文件夹,否则不会hook成功。

3、在build.gradle中将在dependencies下自动生成的compile files(‘lib/XposedBridgeApi-54.jar’)改为provided files(‘lib/XposedBridgeApi-54.jar’)
这里写图片描述

4、在AndroidManifest.xml中添加meta-data元素:

        <!--添加标识-->
        <meta-data
            android:name="xposedmodule"
            android:value="true"/>
        <!--在Xposed框架模块中的描述信息-->
        <meta-data
            android:name="xposeddescription"
            android:value="Hook Activity Jump Method"/>
        <!--导入jar的最低版本-->
        <meta-data
            android:name="xposedminversion"
            android:value="54"/>

5、新建主类Main,该类实现了IXposedHookLoadPackage接口,重写了public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {}方法。我们的Hook的主要操作就是在该方法中进行的。如下所示:
这里写图片描述

6、在main目录下建立一个assets文件夹,然后在assets中新建xposed_init文件,向其中写入包名+类名,如:
这里写图片描述
该文件是Xposed模块的入口,其中声明的“packagename+主类”便是声明需要加载到XposedInstaller 的入口类。

到此时一个Xposed模块基本框架就完成了,接下来要进行的就是Hook核心代码的编写。
项目的目录结构如下,所有需要改动的地方都在图中标识出。
这里写图片描述

3、寻找Hook点,Hook实现Activity跳转拦截

在对一个项目进行hook时,我们首先得知道我们要hook的点是哪里,然后才能进行接下来的操作。首先我们对app进行分析,可以发现点击跳转按钮时会进行Activity间的跳转,那么控制Activity跳转的代码肯定在Button 的点击事件中,对跳转按钮的点击事件进行分析:
这里写图片描述

这里写图片描述
可以发现,其跳转的目标Activity便在自定义的OnClickListene的构造方法的第二个参数这里设置 。所以只要在Activity跳转时Hook ButtonListener类的构造方法,将其dest_activity_class改为其他的activity的class便可以实现跳转拦截。

我们这里演示使用hook将两个button的目标activity互换,即点击“跳转Activity_01”后跳转到Activity_02,点击“跳转Activity_02”后跳转到Activity_01.

所以需要在Main方法中找到ButtonListener的构造方法对其进行hook,修改相应的参数。我们这里使用XposeHelper类的findAndHookConstructor方法来hook ButtonListener类的构造方法,从而修改dest_activity_class.

首先点进XposeHelper中查看findAndHookConstructor方法的定义:
这里写图片描述
可以看到它的参数列表为:

/**
*1、String className:要hook的类的全限定名
*2、ClassLoader classloader:当前的ClassLoader
*3、Object... parameterTypesAndCallback:要hook的构造方法的参数列表
*/

所以,我们的Hook函数如下:
这里写图片描述
其中,使用if(loadPackageParam.packageName.equals(“com.zhayh.xposeddemo”))来找到要hook的应用,然后使用XposedHelpers.findAndHookConstructor进行hook。

添加Hook具体代码,代码逻辑为:

if(dest_activity_class == Activity_01.class){
    dest_activity_class = Activity_02.class
}else if(dest_activity_class == Activity_02.class){
    dest_activity_class = Activity_01.class
}else{
    error
}

具体代码为:
这里写图片描述
其中,由于在进行dest_activity_class = Activity_01(2)_calss时,需要将新的Activity的Class传给param.args[1],所以首先应该找到新Activity的Class。对于找到一个只知道类名的类的Class,需要使用XposedHelpers类的findClass(String className,ClassLoader classloader)方法来找到对应的Class。

OK,到这里整个Hook模块便已经编写完毕。运行程序,激活模块后重启,打开原app,运行效果如下:
这里写图片描述
可以看到成功运行后点击“跳转Activity_01”后实际跳转到了Activity_02,点击“跳转Activity_02”后实际跳转到了Activity_01.
同时,DDMS中的Log输出如下:
这里写图片描述
可以看到我们已经成功的拦截到了原app的Activity的跳转,同时将目标Activity改为新的Activity。

总结

在这片文章中,主要介绍了Xposed模块开发的基本步骤(5个主要步骤):

  1. 将XposedBridgeApi.jar导入到目录下,同时Add As Library…
  2. 修改build.gradle,将compile改为provided
  3. 在AndroidManifest.xml中添加meta-data元素
  4. 新建主类,实现IXposedHookLoadPackage接口,重写handleLoadPackage方法
  5. 在main目录下新建assets文件夹,然后在assets中新建xposed_init文件,写入packagename+主类

然后又通过hook一个activity跳转的应用,示例了使用Xposed进行hook的基本用法。

最后给出项目代码的Github地址:https://github.com/zyh16143998882/XposedDemo

在下一篇文章中将会带来“Android某狗输入法用户个人词库的提取”,来示范Xposed框架在实际应用中的使用。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: xposed-framework-v90-beat3-magiskmodule.zip 是一个Magisk模块,它提供了对Xposed Framework的支持。Xposed Framework是一个强大的Android修改工具,可以让用户对系统进行深度定制,并添加各种功能和特性。 该模块需要通过Magisk来进行安装,因为Magisk是一个系统级的框架,可以在无需修改系统分区的情况下对Android设备进行修改。 Xposed Framework主要通过向Android系统注入代码,来实现对系统的修改。它提供了许多插件和模块,可以实现一些常见的功能,如修改某些应用的行为、添加新的快捷方式,甚至可以更改应用的外观和主题等。 通过使用xposed-framework-v90-beat3-magiskmodule.zip,用户可以将Xposed Framework集成到Magisk中,以便在Android设备上进行高级定制。安装这个模块非常容易,只需要将它放置在Magisk的模块文件夹中,然后在Magisk Manager中选择安装即可。 但是需要注意的是,由于Xposed Framework对Android系统进行了深度修改,可能会导致系统的不稳定和安全性的风险。因此,在安装前务必备份设备,以防出现意外情况。另外,确保从可信的来源下载和安装该模块,以避免安全风险。 总之,xposed-framework-v90-beat3-magiskmodule.zip 是一个Magisk模块,用于将Xposed Framework集成到Magisk中,从而实现Android系统的深度定制和功能增强。但是请谨慎操作,并确保安全和稳定性。 ### 回答2: xposed-framework-v90-beat3-magiskmodule.zip是一个针对安卓手机的Magisk模块,用于安装Xposed框架的。Xposed框架是一个开源的第三方框架,通过它可以实现在不修改系统的情况下对安卓手机进行个性化定制和功能增强。 这个Magisk模块的版本是v90-beat3,表示这是一个测试版本,可能存在一些问题和不稳定性。Magisk是一个用于完整系统脱机挂载的工具,可以在不修改系统分区的情况下对系统进行修改,因此可以避免一些安全性问题。 将xposed-framework-v90-beat3-magiskmodule.zip安装到Magisk Manager后,可以在手机上启用Xposed框架Xposed框架具有丰富的模块,可以实现一些强大的功能,如修改系统UI、增加新的快捷方式、改变应用行为等。用户可以根据自己的需求选择和定制需要的模块。 需要注意的是,安装Xposed框架可能会对手机的稳定性和安全性产生一定的影响,因此在安装前需要做好备份,并确保自己具备一定的技术水平和知识来解决可能出现的问题。安全起见,建议仅在了解风险的情况下使用这个Magisk模块,并使用官方推荐的版本。 总结来说,xposed-framework-v90-beat3-magiskmodule.zip是一个通过Magisk安装的Xposed框架模块,可以在安卓手机上实现个性化定制和功能增强。安装前需要备份和了解风险,并需具备一定的技术水平来解决问题。 ### 回答3: xposed-framework-v90-beat3-magiskmodule.zip是一个用于安卓系统的模块,主要用途是通过修改系统文件来实现一些个性化的功能和优化。 Xposed Framework是一个非常流行的开源项目,它提供了让用户在不修改APK文件的情况下修改系统应用程序和框架的能力。它通过在系统启动时使用一个虚拟机来实现这一点,并通过安装不同的模块来添加各种功能。 v90-beat3意味着这是Xposed Framework的版本号,版本号的增加通常意味着更多的功能和更好的稳定性。这个版本可能是一个测试版本,意味着它仍然处于开发阶段,可能存在一些问题,但它也可能包含一些新功能的改进。 Magisk Module是一个用于Magisk Manager的模块,Magisk是一种基于开源的Android通用系统修改工具。它允许用户以系统级的方式对设备进行修改,而不会影响原始系统文件。Magisk Module可以通过Magisk Manager进行管理和安装,它可以添加各种功能,如Root权限、模块管理和隐藏特定应用程序等。 总的来说,xposed-framework-v90-beat3-magiskmodule.zip是一个用于安卓系统的Xposed Framework模块,通过修改系统文件来提供个性化功能和优化。它可能是一个测试版本,而Magisk Module是用于Magisk Manager的模块,可以添加各种功能和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值