看了一下文档,发现Xposed这货实在太强大了,它直接对Zygote做了一些手脚,简直是无所不能。缺点就是需要安装一下框架。基本原理就是把Android 系统的app_process给替换了,然后启动Zygote的时候多加载点东西,通过一些特殊手段直接把Zygote和Dalvki给劫持了。本文就将带领读者去完成一个简单的Xposed的Module,让大家领略一下Xposed的威力。

要想能看到程序运行的结果,你首先要有一部Root过,安装过Xposed框架和XposedInstaller的手机。这部分不在本篇教程范围内,请自行百度。Xposed的官方下载地址

项目的源码地址:click me

一,建立项目

AS工程,本人AS版本2.0 p8,这个版本建立完工程需要做一个特殊操作,要把Project的build文件里的

  1. classpath 'com.android.tools.build:gradle:2.0.0-alpha8'

换成

  1. classpath 'com.android.tools.build:gradle:1.5.0'

不然无法开发Xposed Module。

然后需要在这里下载XposedBridgeApi-XX.jar,XX为最新版本号。这个是Xposed Module开发需要的Lib。

将XposedBridgeApi-XX.jar引入项目。

二,Android App部分开发。

这部分就很简单了,是一个EditText,一个按钮,在EditText中输入数字3然后点击按钮后会显示yes,否则就是no。

AS建立项目后默认会有一个名为app的module(这个是安卓项目的module),在这个module下开发就行,不需要另外开modu。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. >
  10.  
  11. <EditText
  12. android:id="@+id/edit"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:hint="请输入3" />
  16.  
  17. <Button
  18. android:id="@+id/btn"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_below="@id/edit"
  22. android:layout_centerHorizontal="true"
  23. android:text="测试" />
  24.  
  25. </RelativeLayout>
  1. public class MainActivity extends AppCompatActivity {
  2. Button btn;
  3. EditText edit;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. btn = (Button) findViewById(R.id.btn);
  9. edit = (EditText) findViewById(R.id.edit);
  10. btn.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. int a;
  14. try {
  15. a = Integer.parseInt(edit.getText().toString());
  16. } catch (Exception e) {
  17. Toast.makeText(MainActivity.this, "Oh!No!!", Toast.LENGTH_SHORT).show();
  18. return;
  19. }
  20. if (isEquals(a)) {
  21. Toast.makeText(MainActivity.this, "Yes!you got it!!", Toast.LENGTH_SHORT).show();
  22. } else {
  23. Toast.makeText(MainActivity.this, "Oh!No!!", Toast.LENGTH_SHORT).show();
  24. }
  25. }
  26. });
  27. }
  28.  
  29. private boolean isEquals(int a) {
  30. if (a == 3) {
  31. return true;
  32. }
  33. return false;
  34. }
  35. }

很简单的一个安卓程序,不需要过多解释了。

三,Xposed部分开发

这个项目的xposed module的功能是hook本项目Android 程序部分,让 Activity的isEquls(int a)方法始终返回true,这样无论我们输入什么数字,最终都会显示yes。

修改清单文件:

  1. <meta-data
  2. android:name="xposedmodule"
  3. android:value="true" />
  4. <meta-data
  5. android:name="xposeddescription"
  6. android:value="Test Xposed" />
  7. <meta-data
  8. android:name="xposedminversion"
  9. android:value="46" />

这些是声明这个项目是一个xposed module。其中xposedminversion表示支持的最低的xposed api版本。

建立一个Java Class文件:

  1. /**
  2. * Created by csonezp on 16-2-2.
  3. */
  4. public class HookDemo implements IXposedHookLoadPackage {
  5. @Override
  6. public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
  7. //你想操作的应用的包名,这里为这个项目自身的包名
  8. if (loadPackageParam.packageName.equals("com.csonezp.xposeddemo2")) {
  9. Class clasz = loadPackageParam.classLoader.loadClass("com.csonezp.xposeddemo2.MainActivity");
  10. //hook MainActivity的 isEquls 方法
  11. XposedHelpers.findAndHookMethod(clasz, "isEquals", int.class, new XC_MethodHook() {
  12. //这俩个方法任选其一就可以达到效果
  13. //方法执行前进行的操作
  14. @Override
  15. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  16. Integer para1 = (Integer) param.args[0]; //获取参数1
  17. String s1 = Integer.toString(para1);
  18. Log.v("hook before param1:", s1);
  19. param.args[0] = 3; //设置参数1,也就是将isEquls的参数恒定设为3
  20. Log.v("hook", "before hook!");
  21. XposedBridge.log("hook before param1:" + s1);
  22. }
  23.  
  24. @Override
  25. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  26. boolean res = (boolean) param.getResult();
  27. Log.v("hook after result :", res + "");
  28. Integer para1 = (Integer) param.args[0]; //获取参数1
  29. String s1 = Integer.toString(para1);
  30. param.setResult(true); //设置返回值,始终为true
  31. XposedBridge.log("hook after result:true");
  32. Log.v("hook param1:", s1);
  33. }
  34. });
  35. }
  36. }
  37. }

这就是这个Xposed Module的核心方法了。这个类实现了IXposedHookLoadPackage接口,当读取系统Package的时候,就会调用handleLoadPackage方法。

这里handleLoadPackage主要对“com.csonezp.xposeddemo2” 这个包(也就是本项目)的MainActivity 的 isEquals方法进行一些操作,让这个方法始终返回true。

然后就要添加一个assets文件夹。

右键点击 app这个module  --> new --> Folder -->Assets Folder,然后确认即可。

在assets文件夹中建立一个xposed_init文件

文件内容就是我们上面写的那个Java Class的类名,Xposed框架就是通过这里加载我们的类的,所以一定不要写错。

OK,大功告成,将程序装到手机上,在XposedInstaller中开启我们的Module,重启手机,再打开App,你会发现无论在EditText中输入什么数字,显示的都是Yes了

Xposed Module开发教程1的更多相关文章

  1. Xposed模块开发教程

    转:http://vbill.github.io/2015/02/10/xposed-1/     http://blog.csdn.net/zhangmiaoping23/article/detai ...

  2. Eclipse创建Maven多模块工程Module开发(图文教程)

    自己研究了下Eclipse用Maven多模块工程Module开发,跟大家分享一下! 功能模块来分Module,跟java的package类似,一般是按照的功能模块分module,比如:sso/cas/ ...

  3. Drupal8开发教程:认识.info.yml文件

    YAML 文件是新引入的重要项目文件,在 Drupal 8 中,无论是模块.主题还是安装配置文件,都需要 .info.yml 文件来为其存储项目相关的基础信息. 在 Drupal 中,.info.ym ...

  4. 我的长大app开发教程第一弹:Fragment布局

    在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...

  5. PHP扩展开发教程(总结)

    PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...

  6. Xposed模块开发基本方法记录

    由于某些课程实验的要求,需要通过xposed框架对某应用进行hook操作,笔者选用了开源且免费的xposed框架进行实现.虽然网上存在一些利用xposed实现特定功能的文章资源,但大多均将xposed ...

  7. Xposed模块开发学习记录

    Xposed模块相关API可以参考在线文档: https://api.xposed.info/reference/packages.html     入门教程可以参考: https://github. ...

  8. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

    目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...

  9. ART模式下基于Xposed Hook开发脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78092365 Dalvik模式下的Android加固技术已经很成熟了,Dalvik ...

随机推荐

  1. 初学SQL常用到的一些指令

    一.库 查看有哪些库:show databases; 进入某个库:use 库名; 新增库:create database atm; (atm为库名) 删除库:drop database if exis ...

  2. Add and Search Word

    Trie 树的一个应用 Design a data structure that supports the following two operations: void addWord(word) b ...

  3. extJS起步

    万事开头难,不过还好有解决办法——参考如下文章 http://blog.csdn.net/leimengyuanlian/article/details/18748599 可以快速搭建好eclipse ...

  4. HttpClient方式模拟http请求设置头

    关于HttpClient方式模拟http请求,请求头以及其他参数的设置. 本文就暂时不给栗子了,当作简版参考手册吧. 发送请求是设置请求头:header HttpClient httpClient = ...

  5. css3背景图水平垂直顺时针逆时针翻转旋转

    .bgPlay{ background:url(../images/bg.jpg) no-repeat; /* background-size:auto auto || cover 代表以宽或高填满元 ...

  6. 2016年4月面试题(Unity)

    一. C#中值类型和引用类型的区别? A: 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 值类型存取速度快,引用类型存取速度慢 值类型表示实际数据, ...

  7. LintCode Merge Sorted Array

    两个排好序的数组, A有m个数, 长度够长, B有n个数, 长度为n, 将B放到A里, 不用buffer数组(临时数组), 就用A将两个合在一起, 同时排好序. 方法: 从右边将两个数组里最大的数取出 ...

  8. Rxjava的基本使用

    gradle配置: compile 'io.reactivex:rxjava:1.0.9' 观察者: Observer<String> observer = new Observer< ...

  9. Adobe Flash builder 4的序列号

    下载flex 4 之后,需要输入注册码(如果购买了正版就要选择第二个的单选框,无需输入注册码了) 1424-4258-9368-0713-8534-5128 1424-4806-8312-7960-9 ...

  10. linux创建静态库

    [1]新建源程序staticlib.c /************************************************************************* > ...