1.xposed是什么?
框架是一款开源框架,其功能是可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 就好比是 Google 模块化手机的主体,只是一个框架的存在,在添加其他功能模块(Modules)之前,发挥不了什么作用,但是没了它也不行。也正因为如此,Xposed 具有比较高的可定制化程度。Moto X 用户可定制手机的外观、壁纸、开机动画等,Xposed 则允许用户自选模块对手机功能进行自定义扩充。
2.xposed框架的使用
xposed的主要作用是hook应用方法,动态劫持方法的运行。xposed的使用需要xposed框架.apk和XposedBridgeApi-54.jar配合使用 。而xposed框架apk可以看成是个Xposed 框架的管理工具,在这里可以安装、更新Xposed 框架,也可以卸载Xposed 框架,查看安装日志。也可设置Xposed 框架安装器是否联网更新框架及模块。
xposed框架.apk需要root权限,所以需要一台root后的手机或者模拟器,这里推荐使用模拟器即可。首先下载一个模拟器,常用的模拟器有bluestacks蓝叠,夜神模拟器,genemotion等,由于genemotion的cpu框架是x86的,很多应用无法运行,所以选择了夜神模拟器。下载地址:https://www.yeshen.com/。下载安装之后如下界面:
模拟器是自带root权限的,下面下载xposed框架.apk 文件在文章末尾
下载完成后直接拖到模拟器上安装,安装之后打开apk,点击框架,进去点击安装更新:
下载完成后直接拖到模拟器上安装,安装之后打开apk,点击框架,进去点击安装更新:
授予root权限,然后重启模拟器。xposed框架apk可以工作了,但是现在只是安装好了xposed框架apk,并没有任何hook模块工作。hook模块可以自己去下载,也可以自己编写模块。
3.xposed模块的编写
下面通过简单的demo演示如何编写一个xposed模块,来hook住我们想要hook的方法。这里就hook自己的app的一个加载广告的代码,来动态拦截广告的加载。
1.使用AS新建一个项目XposedDemo:
2.在MainActivity 模拟加载广告的代码,正常点击加载广告按钮,会加载广告,但是使用xposed对该方法进行hook之后,可以改变这个方法的执行。:
public class MainActivity extends AppCompatActivity { private TextView tv_ad; private Button btn_load_ad; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_ad = findViewById(R.id.tv_ad); btn_load_ad = findViewById(R.id.btn_load_ad); btn_load_ad.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tv_ad.setText(getTTAd()); } }); } public String getTTAd(){ return "广告加载成功"; } }
在MainActivity 的布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/tv_ad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="等待广告加载" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn_load_ad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载广告"/> </android.support.constraint.ConstraintLayout>
2.下载XposedBridgeApi-54.jar的依赖包,下载完成后在app目录下创建文件夹mylib(名字随意),并把XposedBridgeApi-54.jar复制到mylib下面,注意不能直接放到lib里面,然后再app的build.gradle的dependencies加上provided fileTree(dir: ‘mylib’, include: [’.jar’]),或者compileOnly fileTree(dir: ‘mylib’, include: [’.jar’]),根据你的gradle版本选择。
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' compileOnly fileTree(dir: 'mylib', include: ['*.jar']) }
3.修改AndroidManifest.xml文件,在applicatio标签下面加入以下标签:
<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> <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="这是一个xposed应用"/> <meta-data android:name="xposedminversion" android:value="54"/> </application>
注意这里面的三个meta-data标签的name不能错误,不然xposed框架apk无法识别自定义编写的xposed模块。
4.编写hook工具类XposedHookUtil对getTTAd方法进行拦截替换,XposedHookUtil实现IXposedHookLoadPackage接口,复写handleLoadPackage方法,并替换原有的getTTAd方法,来进行拦截。
public class XposedHookUtil implements IXposedHookLoadPackage { String class_name = "com.hdc.xposeddemo.MainActivity"; @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { Class clazz = loadPackageParam.classLoader.loadClass(class_name); XposedHelpers.findAndHookMethod(clazz, "getTTAd", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { return "广告被拦截了"; } }); } }
5.在main文件夹下创建文件夹assets,并在assets下面创建xposed_init文本文件,注意这里文件名必须是xposed_init。并在xposed_init里面添加hook工具类的完整包名路径:com.hdc.xposeddemo.xposed.XposedHookUtil
6.运行apk
点击run app按钮运行apk,如果android studio 没有找到夜神模拟器,可能是模拟器还没有关联起来。关联方法:cmd 进入命令窗口,执行
cd C:\Program Files\Nox\bin,注意cd到你的夜神模拟器的安装路径,之后执行:nox_adb.exe connect 127.0.0.1:62001
然后AS可以关联成功,运行apk。
点击加载广告,这时候显示广告加载成功,因为还有使这个xposed模块工作。
7.安装xposed模块 打开Xposed框架apk,
点击模块,看到里面有刚刚编写的模块,勾选之后重启:
重启之后,xposed模块生效,点击加载广告,显示广告被拦截了:
- 文章2305
- 用户1336
- 访客11455432
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器