新手不要再被误导!这是一篇最新的Xposed模块编写教程

新⼿不要再被误导!这是⼀篇最新的Xposed模块编写教程
在互联⽹上,关于Xposed模块编写的教程可谓是⼀抓⼀⼤把。但由于时间的推移,很多⼯具和⽅法都发⽣了变化(如Eclipse退出安卓编程舞台,AndroidStudio 不断升级导致其⼀些设置也随之变化等)也正因此,⽹上的教程往往有⼀些时限性,⽐如现如今 provide 这个关键字已经被舍弃了却仍有⼈在⽤,还有些说要把jar包放到lib⽂件夹⽽⾮libs⽂件夹……种种错误或者落伍的教程对新⼿产⽣了很⼤的误导。笔者近⽇收到过朋友初学Xposed模块编写时的求助,看了⼀些他的参考教程,觉得多多少少都存在点问题,因此萌⽣了写⼀篇关于在最新AndriodStudio 开发环境下实现Xposed模块开发⼊门的⽂章。
0×01 Xposed 模块编写简介
Xposed 框架的原理就不多说了,它部署在ROOT后的安卓⼿机上,通过替换/system/bin/app_process程序控制zygote进程,使得
app_process在启动过程中会加载XposedBridge.jar这个jar包,从⽽完成对Zygote进程及其创建的Dalvik虚拟机的劫持。可以让我们在不修改APK源码的情况下,通过⾃⼰编写的模块来影响程序运⾏的框架服务,实现类似于⾃动抢红包、消息⾃动回复等功能。
其实,从本质上来讲,Xposed 模块也是⼀个 Android 程序。但与普通程序不同的是,想要让写出的Android程序成为⼀个Xposed 模块,要额外多完成以下四个硬性任务:
1、让⼿机上的xposed框架知道我们安装的这个程序是个xposed模块。
2、模块⾥要包含有xposed的API的jar包,以实现下⼀步的hook操作。
3、这个模块⾥⾯要有对⽬标程序进⾏hook操作的⽅法。
4、要让⼿机上的xposed框架知道,我们编写的xposed模块中,哪⼀个⽅法是实现hook操作的。
内翅片管式换热器这就引出我即将要介绍的四⼤件(与前四步⼀⼀对照):
1、l
2、XposedBridgeApi-xx.jar 与 adle
3、实现hook操作的具体代码
安全带包
4、xposed_Init
牢记以上四⼤件,按照顺序⼀个⼀个实现,就能完成我们的第⼀个Xposed模块编写。下⾯我们就开始吧!
0×02 迈开第⼀步,新建项⽬并编辑l
1、⾸先打开AndroidStudio(以版本3.1为例,还在⽤⽼版本的请升级),建⽴⼀个⼯程,提⽰我们选择“Activity”,那就选⼀个Empty Activity吧。(这个是模块的界⾯,随意选择即可)。
2、我们可以把项⽬查看⽅式设置为Project模式,以⽅便查看。然后在 “项⽬名称/app/src/main/”⽬录下到l,双击之,并在指定位置插⼊以下三段代码:
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="这是⼀个Xposed例程" />
<meta-data
android:name="xposedminversion"
android:value="53" />
插⼊位置及代码说明如图所⽰:
插⼊之后,如果你把⼿机连上AndroidStudio ,点击“编译”或者“运⾏”的话,⼿机就会启动刚刚编写的这个程序。⽽在⼿机⾥的Xposed框架中也会显⽰出这个模块:
说明Xposed框架已经认出了我们写的程序。但先别⾼兴太早——虽然框架已经觉得他是⼀个Xposed模块了,但我们⾃⼰⼼⾥清楚,这个模块还啥都不会⼲呢。下⼀步,我们让这个模块长点本事。
0×03 ⾛出第⼆步,搞定XposedBridgeApi-xx.jar 与 adle
我们知道,Xposed模块主要功能是⽤来Hook其他程序的各种函数。但是,如何让前⼀步中的那个“⼀穷⼆⽩”的模块长本事呢?那就要引⼊XposedBridgeApi.jar 这个包,你可以理解为⼀把兵器,模块有了这把宝⼑才能施展出Hook本领。以前,都需要⼿动下载诸如XposedBridgeApi-54.jar 、 XposedBridgeApi-82.jar 等jar包,然后⼿⼯导⼊到libs⽬录⾥,才能⾛下⼀步道路。其实在AndroidStudio 3.1⾥⾯,我们完全不⽤这么⿇烦,只需要多写⼀⾏代码,就让AndroidStuido⾃动给我们配置XposedBridgeApi.jar !下⾯操作开始(序号接着上⼀节):
3、在 “项⽬名称/app/src/main/”⽬录下到adle,在图⽰位置加上:
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 ,现在已经停⽤了!)如图:
写完之后, adle会提⽰⽂件已经修改,是否同步。点击 “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⾥写代码如下:
posd_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) {
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”,代码如下:
posd_hook_new;
bv.android.xposed.IXposedHookLoadPackage;
bv.android.xposed.XC_MethodHook;
bv.android.xposed.XposedBridge;
bv.android.xposed.XposedHelpers;
bv.android.xposed.callbacks.XC_LoadPackage;
public class HookTest implements IXposedHookLoadPackage {
声源定位public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (loadPackageParam.packageName.equals("posd_hook_new")) {
XposedBridge.log(" has Hooked!");
Class clazz = loadPackageParam.classLoader.loadClass(
"posd_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("你已被劫持");
}
});
8300c}
}
}
由代码可知,我们是通过IXposedHookLoadPackage接⼝中的handleLoadPackage⽅法来实现Hook并篡改程序的输出结果的。代码
中“posd_hook_new ”是⽬标程序的包名,”posd_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的提⽰已经变了?
本次教程就到这⾥,谢谢!

本文发布于:2024-09-23 10:28:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/278268.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模块   编写   程序   代码   框架
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议