zoukankan      html  css  js  c++  java
  • Xposed Module开发教程1

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

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

    项目的源码地址:click me

    一,建立项目

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

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

    换成

     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。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        >
    
        <EditText
            android:id="@+id/edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入3" />
    
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/edit"
            android:layout_centerHorizontal="true"
            android:text="测试" />
    
    </RelativeLayout>
    public class MainActivity extends AppCompatActivity {
        Button btn;
        EditText edit;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn = (Button) findViewById(R.id.btn);
            edit = (EditText) findViewById(R.id.edit);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int a;
                    try {
                        a = Integer.parseInt(edit.getText().toString());
                    } catch (Exception e) {
                        Toast.makeText(MainActivity.this, "Oh!No!!", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    if (isEquals(a)) {
                        Toast.makeText(MainActivity.this, "Yes!you got it!!", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "Oh!No!!", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    
        private boolean isEquals(int a) {
            if (a == 3) {
                return true;
            }
            return false;
        }
    }

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

    三,Xposed部分开发

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

    修改清单文件:

    <meta-data
                android:name="xposedmodule"
                android:value="true" />
            <meta-data
                android:name="xposeddescription"
                android:value="Test Xposed" />
            <meta-data
                android:name="xposedminversion"
                android:value="46" />

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

    建立一个Java Class文件:

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

    这就是这个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了

  • 相关阅读:
    Vijos 1083 小白逛公园(线段树)
    [NOIP2012提高组] CODEVS 1200 同余方程(扩展欧几里德算法)
    sshpass安装以及使用
    python 判断操作系统以及操作系统版本号
    subprocess.run()用法python3.7
    SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xd0 in position 2: invalid continuation byte
    linux动态监控dstat&&glances&&psutil&&bottle
    subprocess.Popen()
    centos解决bash: telnet: command not found...&& telnet: connect to address 127.0.0.1: Connection refused拒绝连接
    pexpect &&pxssh
  • 原文地址:https://www.cnblogs.com/csonezp/p/5177928.html
Copyright © 2011-2022 走看看