首页 > 编程知识 正文

Xposed框架安装器(转转笔新手教程)

时间:2023-05-05 11:50:26 阅读:64782 作者:949

在互联网上,关于Xposed模块的教程可以说是一大亮点。 但是,随着时间的推移,很多工具和方法都发生了变化。 例如,由于Eclipse退出了Android编程舞台,AndroidStudio不断升级,一些设置也发生了变化。 因此,在网络教程中,现在已经放弃了provide这个关键词,但还是有人在使用。 另外,我说过要将jar包放在lib文件夹而不是libs文件夹中…。 最近,朋友第一次写Xposed模块时请求帮助。 读了他要找的参考教程,觉得或多或少有问题,于是写了一篇文章,在最新的AndriodStudio开发环境中实现Xposed模块开发入门。

001 Xposed模块创建概述

Xposed框架的原理并不多言,但引入到根后的安卓手机中,通过替换/system/cjdlz/app_process程序来控制zygote进程, 使app_process在启动时加载名为XposedBridge.jar的jar包。在不修改APK源代码的情况下,在自己创建的模块中影响程序运行的框架服务中,使用自动红包

其实,本质上,Xposed模块也是安卓程序。 但是,与常规程序不同,要使导出的Android程序成为Xposed模块,需要额外完成以下四项硬任务:

1、让手机的xposed框架知道我们安装的这个程序是xposed模块。

2、在模块中包含xposed的API的jar包,实现以下hook操作。

3、本模块需要对对象程序进行hook操作的方法。

4、让手机的xposed框架知道我们制作的xposed模块中,是哪个方法实现了hook操作。

这引出了我接下来要介绍的四件重要的事情。 (与前四个步骤进行一对一比较。 )

1、AndroidManifest.xml

2、XposedBridgeApi-xx.jar和build.gradle

3、实现hook操作的具体代码

4、xposed_Init

考虑到这四个主要事项,按顺序一个一个地完成第一个Xposed模块的创建。 那我们开始吧!

002执行第一个步骤,创建新项目并编辑AndroidManifest.xml

1、首先打开AndroidStudio (以3.1版为例,还在使用旧版本的用户请升级),启动提示选择“Activity”的项目,进行Empty Activity (这是模块接口,请自由选择。

2、您可以将项目的显示方式设置为项目模式,以便于查看。 然后,在项目名称/app/src/main/目录中找到AndroidManifest.xml,双击它,然后在指定的位置插入以下三个代码:

android:name='xposedmodule '

android:value='true' /

Android : name=' xposeddescription '

android:value='这是Xposed例程' /

安卓: name=' xposedminversion '

android:value='53' /

插入位置和代码的说明如图所示。

插入后,只要将手机连接到AndroidStudio,然后单击“编译”或“运行”,手机就会启动刚才创建的这个程序。 手机的Xposed框架中也显示该模块:

表示Xposed框架识别了我们写的程序。 但是,虽然很快——框架就已经认为他是Xposed模块了,但我们自己心里知道,这个模块还是无能为力。 下一步,让我们向这个模块伸出一点手臂。

003走出第二步,处理XposedBridgeApi-xx.jar和build.gradle

我们知道Xposed模块的主要功能是用于Hook其他程序的各种函数。 但是,如何伸展上一步的“贫穷”模块呢? 那将引入一个名为XposedBridgeApi.jar的包。 你可以理解为武器。 模块有了这把宝刀就可以发挥Hook本领了。 以前,必须手动下载XposedBridgeApi-54.jar和XposedBridgeApi-82.jar等jar包,并将其手动导入到libs目录中。 其实在AndroidStudio 3.1中,我们不用这么麻烦,只要写一行代码,AndroidStuido就会自动为我们配置XposedBridgeApi.jar! 开始下一个操作。 序号接上一节。

3、在"项目名称/app/src/main/"目录中找到build.gradle,

在图示位置加上:

repositories {

jcenter()

}

以及

compileOnly 'de.robv.android.xposed:api:82'

compileOnly 'de.robv.android.xposed:api:82:sources'

这句代码是告诉AndroidStuido使用jcenter作为代码仓库,从这个仓库里远程寻找 de.robv.android.xposed:api:82 这个API。这个网上很少有Xposed教程介绍它的!(我们不用自己找XposedBridgeApi.jar了。注意!此处要用compileOnly这个修饰符!网上有些写的是provide ,现在已经停用了!)如图:

写完之后, build.gradle会提示文件已经修改,是否同步。点击 “sync now”,同步即可:

【ps:如果网络不通,或者同步不畅,就不要进行第三步的repositories { jcenter()}这个步骤了,改做这个步骤:】

手动下载XposedBridgeApi-82.jar ,拖放到“项目名称/app/libs/”里面(不是网上说的单独建立lib文件夹,那是很久以前的故事了!),然后右键“Add As Library” 自行添加这个jar包。而compileOnly ‘de.robv.android.xposed:api:82′和 compileOnly ‘de.robv.android.xposed:api:82:sources’这两句仍然照常添加。

好了,现在宝刀已经到手。下一步,就要开始“施展刀法”(编写hook代码)了。

0×04 迈开第三步,实现hook操作的具体代码

4、在“施展刀法”(编写hook代码)之前,我们先要立一个靶子。在界面上画一个按钮,并在MainAcitiviy里写代码如下:

package com.example.root.xposd_hook_new;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button = (Button) findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();

}

});

}

public String toastMessage() {

return "我未被劫持";

}

}

这个靶子很简单:MainActivity界面有个按钮,点击按钮后会弹出一个toast提示,该提示的内容由 toastMessage() 方法提供,而toastMessage()的返回值为“我未被劫持”:

下面我们正式开始“施展刀法”(编写hook代码) 来hook我们的MainActivity并修改这个类的toastMessage()方法,让它的返回值为“你已被劫持”:

5、在MainActivity的同级路径下新建一个类“HookTest.java”,代码如下:

package com.example.root.xposd_hook_new;

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 HookTest implements IXposedHookLoadPackage {

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

if (loadPackageParam.packageName.equals("com.example.root.xposd_hook_new")) {

XposedBridge.log(" has Hooked!");

Class clazz = loadPackageParam.classLoader.loadClass(

"com.example.root.xposd_hook_new.MainActivity");

XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

super.beforeHookedMethod(param);

//XposedBridge.log(" has Hooked!");

}

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

param.setResult("你已被劫持");

}

});

}

}

}

由代码可知,我们是通过IXposedHookLoadPackage接口中的handleLoadPackage方法来实现Hook并篡改程序的输出结果的。代码中“com.example.root.xposd_hook_new ”是目标程序的包名,”com.example.root.xposd_hook_new.MainActivity” 是想要Hook的类, “toastMessage”是想要Hook的方法。我们在afterHookedMethod方法(用来定义Hook了目标方法之后的操作)中,修改了toastMessage()方法的返回值为“你已被劫持”。

OK,以上用来hook的代码编写完毕,让我们进行下一步操作。

0×05 最后一步,添加入口点

右键点击 “main ” 文件夹 , 选择new –> Folder –>Assets Folder,新建assets 文件夹:

然后右键点击 assets文件夹, new–> file,文件名为xposed_init(文件类型选text),并在其中写上入口类的完整路径(就是自己编写的那一个Hook类),这样, Xposed框架就能够从这个 xposed_init 读取信息来找到模块的入口,然后进行Hook操作了:

好了,曙光就在前面!最后选择禁用 Instant Run: 单击 File -> Settings -> Build, Execution, Deployment -> Instant Run,把勾全部去掉。

然后点击小三角“运行”!在Xposed框架里找到自己写的模块,打上勾,重启——点开自己的程序看看,是不是toast的提示已经变了?

本次教程就到这里,谢谢!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。