Xposed安装与使用

xposed是什么?

一个很牛逼的框架,可以在不修改APK的情况下影响程序的运行,比如:

  • 直接把APP的界面改成自己想要的样
  • 去掉界面里不喜欢的东西,
  • 自动抢红包
  • 消息防撤回
  • 步数修改等等

Xposed的工作原理

在开始修改之前,你应该大致了解Xposed如何工作(如果你觉得太无聊,你可以跳过这一部分)。方法如下:

有一个叫做“Zygote”的过程。从它的名字(中文含义——受精卵)这是Android运行时的核心。每个应用程序都作为它的副本(“fork”)启动。/init.rc手机启动时,脚本会启动此过程。进程开始完成/system/bin/app_process,加载所需的类并调用初始化方法。

这就是Xposed发挥作用的地方。安装框架时,会将扩展的app_process可执行文件复制到/system/bin。这个扩展的app_process就会把XposedBridge.jar加载到运行时环境,这样我们就可以在虚拟机启动之前,甚至是在Zygote的main方法被执行之前做一些爱做的事(捂脸,其实就是加载插件)。此时我们的插件被执行,就是Zygote进程的一部分,所以可以直接获取到应用的上下文Context,然后做很多超出想象的事情——对于任何一个app ,我们都可以hook或者替换掉其中的类或方法或对象。再加上已经root。我们可以为所欲为了。

jar位于,/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar其源代码可在此处找到。查看类XposedBridge,您可以看到该main方法。这就是我上面写的内容,这个过程在一开始就被调用了。在那里进行了一些初始化,并且还加载了模块(稍后我将回到模块加载)。

方法挂钩/更换

真正创造Xposed力量的是“钩”方法调用的可能性。通过反编译APK进行修改时,可以直接在任意位置插入/更改命令。但是,您需要在之后重新编译/签署APK,并且您只能分发整个包。使用可以放置Xposed的钩子,你不能修改方法内的代码(不可能清楚地定义你想在哪个地方做什么样的改变)。相反,您可以在方法之前和之后注入自己的代码,这是Java中可以清楚解决的最小单元。

XposedBridge有一个私有的本机方法hookMethodNative。此方法也在扩展中实现app_process。它会将方法类型更改为“native”,并将方法实现链接到其自己的本机通用方法。这意味着每次调用hooked方法时,都会调用泛型方法,而不会让调用者知道它。在此方法中,handleHookedMethod调用XposedBridge中的方法,将参数传递给方法调用,this引用等。然后,此方法负责调用已为此方法调用注册的回调。这些可以更改调用的参数,更改实例/静态变量,调用其他方法,对结果执行某些操作...或者跳过任何内容。它非常灵活。

安装:

安装XposedInstalle(Xposed安装程序)

XposedInstalle.apk下载链接(安卓5.0以下不用这个,自己找去吧):
下载地址,论坛下面有下载地址

开发模块

一、创建Xposed模块

首先需要知道,Xposed模块是以APK的格式提供的,本身也是需要安装到手机上的,也像普通应用一样可以启动,只是因为APK中包含了一些声明,被Xposed框架检测到了,所以同时也可以以Xposed模块的方式来进行hook操作。那么这些声明是什么呢?
在AndroidManifest.xml中添加下面的声明,
meta-data中的内容分别用于声明是否为插件,插件的描述和兼容的最低Xposed版本。加入3个meta-data就好了。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.sxkj_mg.xposeddome"><applicationandroid: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"><meta-dataandroid:name="xposedmodule"android:value="true"/><meta-dataandroid:name="xposeddescription"android:value="我就是个简单的Xposed Demo"/><meta-dataandroid:name="xposedminversion"android:value="83"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

二、添加依赖

apply plugin: 'com.android.application'android {compileSdkVersion 28defaultConfig {applicationId "com.example.sxkj_mg.xposeddome"minSdkVersion 23targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {//    主要是下面这两行,再下面的是自动生成的compileOnly 'de.robv.android.xposed:api:82'//如果需要引入文档,方便查看的话compileOnly 'de.robv.android.xposed:api:82:sources'implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:28.0.0'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'
}

三、创建xposed_init

xposed_init创建位置

在图片位置创建xposed_init,写入代码为:

# 我的是这个,你们根据自己的路径改,最后一个是文件名,一会创建这个文件
com.example.sxkj_mg.xposeddome.HookModule

修改MainActivity.java

修改id

package com.example.sxkj_mg.xposeddome;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv=findViewById(R.id.tv);tv.setText("我是渣渣辉");}
}

编写HookModule

package com.example.sxkj_mg.xposeddome;import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;import java.lang.reflect.Field;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class HookModule implements IXposedHookLoadPackage {public static final String TAG = "MyHook";@Overridepublic void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {Log.d(TAG, "重启手机后,我执行了,说明这个 Xposed 模块生效了");if (loadPackageParam.packageName.equals("com.example.sxkj_mg.xposeddome")){Log.d(TAG, "进入到这个app了");XposedHelpers.findAndHookMethod("com.example.sxkj_mg.xposeddome.MainActivity",loadPackageParam.classLoader,"onCreate", Bundle.class,new XC_MethodHook(){@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {Log.d(TAG, "这里是hook方法之前");super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable{Log.d(TAG, "这个是hook方法之后");Class c= loadPackageParam.classLoader.loadClass("com.example.sxkj_mg.xposeddome.MainActivity");Field field = c.getDeclaredField("tv");field.setAccessible(true);Log.d(TAG, "这次到这里了2");TextView tv = (TextView) field.get(param.thisObject);tv.setText("王境泽");}});}}
}

此时运行一下,就装到手机上了。(前提USB连接手机)
手机打开,是不是还是渣渣辉,然后XposedInstalle启用模块后,手机重启,就显示王境泽了。

API介绍

  • IXposedHookLoadPackage接口:App被加载的时候调用,用于App应用的Hook
    回调方法是:handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam)

  • XC_LoadPackage.LoadPackageParam:包含与正在加载的应用程序的有关信息。

  • XposedHelpers.findAndHookMethod(要Hook的类,classLoader,方法名,参数,回调对象)

    • Hook一个方法的时候使用,回调对象XC_MethodHook()需重写两个方法
    • beforeHookedMethod(MethodHookParam param):方法调用前执行
    • afterHookedMethod(MethodHookParam param) 方法调用后执行
    • 注:可以调用param.setResult()设置方法的返回值!
  • MethodHookParam:包含与调用方法有关的信息
    比较关注的是这个thisObject,代表调用该方法的对象实例,如果是静态方法
    的话,返回一个Null,比如这里调用onCreate()方法的是MainActivity,获得
    的自然是MainActivity实例。

接着是获取成员变量,分为私有与非私有变量,非私有直接调用下述方法
即可获得class

Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
Field field = c.getField("tv");

如果是私有,则需要先设置访问权限(setAccessible)

Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
Field field = c.getDeclaredField("tv");
field.setAccessible(true);

接着调用获得该对象

TextView tv = (TextView) field.get(param.thisObject);
tv.setText("贪玩难约");

代码外内容

  • IXposedHookZygoteInit:在Zygote启动时调用,用于系统服务的Hook
    回调方法initZygote()

  • IXposedHookInitPackageResources:在资源布局初始化时会回被执行(inflate方法)
    回调方法:handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam)

  • InitPackageResourcesParam包含两个参数,包名和XResource(资源相关)
    有了这个XResource对象,就可以拿到布局资源树了,通过重写hookLayout方法,

  • LayoutInflatedParam,里面这个view就是布局资源树了,你可以拿到遍历,拿到某个特定控件,然后做一些骚操作。

  • XposeHelpers提供了一些辅助方法

    • callMethod(Object obj,String methodName, Object… args):在APP中调用特定方法; 参数依次是:调用方法的所在类,调用方法名,方法参数

    • findClass(String className,ClassLoader classLoader):获取class类实例
      参数依次是类名,类加载器

    • findMethodExact:通过反射查找类的成员方法(可setAccessible(true)设置非私有)

    • findConstructorExact:通过反射查找构造函数(同样可设置可访问下性)

    • findAndHookXXX:查找并Hook

    • setXxx:通过反射设置对象数据成员的值

    • setStaticXxx:通过反射设置静态变量的值

    • XposedBridge.log(“日志内容”):输入日志和写入到/data/xposed/debug.log
      Xposed Installer日志那里可以看到!

内部类:通过$符号链接内部类

只能Hook方法与构造方法,不能Hook接口和抽象方法

通过这些api是不是大概清楚Xposed能干啥了,除了Xposed,还有其他的框架可以干这些事比如下面:

Magisk框架,Xposed框架比较,VirtualXposed框架

框架MagiskXposedVxp
平台android5.0~8.1android4.4以下,android5.0 ~ 8.1,但是8.0~8.1稳定版还没出来,出来的beta版本android5.0~9.0
模拟器,真机支持情况都支持都支持不支持 x86,也就是不支持模拟器
更新情况更新快一直在更新已经停更了框架一直在更新
稳定性模块少,但是可以装systemless版Xposed模块来弥补最稳定、模块最多不会变砖、模块少
激活模块必须重启激活模块必须重启激活模块支持免重启手机激活模块
root内置ROOT需要root免root
hook支持支持暂不支持资源以及系统api的HOOK
使用必须将需要 hook 的 APP 和模块 APP 安装到VirtualXposed
github地址MagiskXposedVirtualXposed
原理对系统侵入较少,仅修改boot.img,同时能够对系统隐藏自身存在,支持OTA升级,可以实现Multirom多系统等功能Xposed框架的原理是通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik或者art虚拟机的劫持它去启动别的App,在启动过程中通过 epic Hook本进程,从而控制被启动的App

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620296.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】Xposed 框架解析

前言 Xposed这位老兄大家可能不认识&#xff0c;微信自动抢红包大家听过吧、微信记录器作弊大家听过吧、地理位置模拟大家听过吧&#xff0c;我很负责任的告诉大家&#xff0c;这些都是Xposed干的&#xff0c;对的&#xff0c;就是它&#xff0c;相信大家充着“谁抢我红包”的…

Android之Xposed框架完全使用指南

文章目录 Xposed环境搭建Xposed简介Xposed原理Xposed的安装 Xposed插件开发Xposed插件编写流程Xposed开发之Hook构造函数相关API无参构造函数的hook有参构造函数的hook实际效果 Xposed开发之修改属性相关API修改静态字段和成员字段实际效果 Xposed开发之hook一般函数相关APIhoo…

深入理解Android(三):Xposed详解

编者按&#xff1a;随着移动设备硬件能力的提升&#xff0c;Android系统开放的特质开始显现&#xff0c;各种开发的奇技淫巧、黑科技不断涌现&#xff0c;InfoQ特联合《深入理解Android》系列图书作者邓凡平&#xff0c;开设深入理解Android专栏&#xff0c;探索Android从框架到…

Xposed入门教程

2019年8月27日16时51分47秒以前一直没机会接触Android Hook方式的逆向今天有空试了下&#xff0c;以前也很少写这种东西&#xff0c;今天第一次&#xff0c;认真写下&#xff0c;记录一下?准备 准备搞太极的&#xff0c;但是Xposed都不会&#xff0c;不好搞&#xff0c;所以就…

RabbitMQ---订阅模型-Topic

订阅模型-Topic • Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符&#xff01; • Routingkey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以…

PostgreSQL命令行工具psql常用命令

1. 概述 通常情况下操作数据库使用图形化客户端工具&#xff0c;在实际工作中&#xff0c;生产环境是不允许直接连接数据库主机&#xff0c;只能在跳板机上登录到Linux服务器才能连接数据库服务器&#xff0c;此时就需要使用到命令行工具。psql是PostgreSQL中的一个命令行交互…

pyreverse+Graphviz 快速理清整个项目中的代码结构

作用 &#xff1a; 分析代码中的调用关系&#xff0c;帮助快速理清代码。 安装方法&#xff1a;以windows为例 • 从官网下载 https://www.graphviz.org/download/ 安装• 记得将其添加到系统路径• 运行下面命令来检查安装是否完成&#xff1a; dot -V• 安装Pyreverse&…

配置web服务

Web服务器又称为WWW服务器&#xff0c;它是放置一般网站的服务器。一台Web服务器上可以建立多个网站&#xff0c;各网站的拥有者只需要把做好的网页和相关文件放置在Web服务器的网站中&#xff0c;其它用户就可以用浏览器访问网站中的网页了。 LAMP是Linux, Apache, MySQL, PH…

Web Service(Web服务)

什么是webservice&#xff1f; 一句话概括&#xff1a;WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 所谓跨编程语言和跨操作平台&#xff0c;就是说服务端程序采用Java编写&#xff0c;客户端程序则可以采用其他编程语言编写&#xff0c;反之亦然&#xff01…

什么是Web 服务?

Web 服务是一种可以用来解决跨网络应用集成问题的开发模式&#xff0c;这种模式为实现“软件作为服务”提供了技术保障。而“软件作为服务”实质上是一种提供软件服务的机制&#xff0c;这种机制可以在网络上暴露可编程接口&#xff0c;并通过这些接口来共享站点开放出来的功能…

什么是web服务

2001年秋天互联网公司&#xff08;dot-com)泡沫的破灭标志着互联网的一个转折点。许多人由此断定互联网是被大家过分炒作了&#xff0c;事实上网络泡沫和相继而来的股市大衰退是所有技术革命的共同特征。股市大衰退通常标志着蒸蒸日上的技术已经开始占领中央舞台&#xff0c;假…

Web服务基础

1 Web服务器 WEB服务器用来接收客户的请求&#xff0c;然后向客户返回一些结果。 用户可以通过web浏览器请求一个资源。Web服务器在接收到请求之后&#xff0c;负责查找资源&#xff0c;然后向用户返回一个结果。 2 Web客户端 Web客户端允许用户请求服务器上的某个资源&#xf…

WEB服务的部署

文章目录 一、WEB服务相关概念1. WEB服务器2. 协议端口号3. WEB服务器发布软件 二、WEB服务器的部署1.配置服务器的静态IP&#xff1a;10.1.1.12.安装IIS-WEB插件3.停用默认站点4. 新建站点senting5. 一台服务器同时发布多个WEB站点6. 对于动态网站的搭建 一、WEB服务相关概念 …

Web 服务的概述

Web 服务的概述 由于能够提供图形、声音等多媒体数据&#xff0c;再加上可以交互的动态 Web 语言的广泛普及&#xff0c;WWW&#xff08;World Wide Web&#xff0c;万维网&#xff09;深受Internet用户欢迎。一个最重要的证明就是&#xff0c;当前的绝大部分Internet流量都…

【网络安全】Web服务器

文章目录 1、Web服务器概述1.1、Web服务器1.2、端口1.3、网站与网页 2、Web服务器发布2.1、发布软件2.2、发布形式2.3、网站类型 3、部署Web服务器3.1、配置服务器IP地址3.2、安装IIS服务3.3、新建和发布网站3.3.1、同端口&#xff0c;不同IP3.3.2、同IP&#xff0c;不同端口3.…

Web服务(02)——Web服务器中间件

文章目录 Web服务&#xff08;02&#xff09;——Web服务器中间件前言一、JAVA中间件1、Tomcat2.Weblogic3.Jboss4.Webshaere 二、Python中间件1、wsgi2、uwsgi3.uWSGI 三、Php中间件1、php-fpm2、CGI3、FastCGI4、Php-FastCGI 四、其他中间件1、事务处理中间件——Hadoop2、消…

Web服务是什么

1、Web服务 服务&#xff1a;提供的某个功能&#xff1b;网络服务&#xff08;Net Service&#xff09;&#xff1a;使用不同的网络协议&#xff08;http、ftp、stmp/pop3&#xff09;提供的服务&#xff1b;Web服务&#xff1a;指使用 http 或 https 协议接受用户的服务请求并…

【优化算法】Python实现面向对象的遗传算法

遗传算法 遗传算法(Genetic Algorithm)属于智能优化算法的一种&#xff0c;本质上是模拟自然界中种群的演化来寻求问题的最优解。与之相似的还有模拟退火、粒子群、蚁群等算法。 在具体介绍遗传算法之前&#xff0c;我们先来了解一些知识&#x1f9c0; DNA&#xff1a; 携带有…

pyinstaller打包openvino 2021.4.2

打包准备 1. 测试环境准备 conda create -n opinstall python3.7 -y conda activate opinstall pip install openvino2021.4.2 pip install pyinstaller PyCharm新建openvino_install&#xff0c;选择虚拟环境opinstall&#xff0c;编写测试代码 app.py import numpy as n…

8.27周报

文章目录 前言论文阅读摘要介绍模型算法 总结 前言 本周学习了GAN论文《Generative Adversarial Nets》&#xff0c;了解GAN主要由两部分组成&#xff1a;生成器和判别器&#xff0c;知道生成器G和判别器D的作用及原理&#xff0c;相比于其他的生成模型&#xff0c;了解GAN的优…