hook系列——Xposed框架入门(一)

来源:互联网 发布:linux eclipse 安装 编辑:程序博客网 时间:2024/06/05 08:03


说到hook技术,顾名思义就能形象解释了它的作用。


常用的hook技术框架莫过于substrace cydia,frida还有就是这个Xposed了。


先说一下Xposed原理吧


Android 有一个Zygote(受精卵)这个东西,大家应该不陌生,它本质是一个应用层的程序。每个应用程序由它fork()出。其最初的名字是app_process,通过直接调用pctrl把名字给改成了”zygote”。代码位于frameworks/base/cmds/app_process/app_main.cpp。


Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务; 


2.通过替换/system/bin/app_process程序控制zygote进程,使app_process在启动过程中加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持;


好了,开始行动,可参考 https://github.com/rovo89/XposedBridge/wiki/Development-tutorial  


jar包下载地址:http://download.csdn.net/detail/qq_30548105/9765223


先写一个简单的Android 工程,新建工程

activity_main.xml布局如下,很简单,一个文本,一个按钮

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    >    <TextView        android:id="@+id/tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        />    <Button        android:id="@+id/bt"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="我来改变IMEI"/></LinearLayout>

MainActivity代码如下:

public class MainActivity extends AppCompatActivity {    private Button button;    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView= (TextView) findViewById(R.id.tv);        button = (Button) findViewById(R.id.bt);        textView.setText(MyImei());        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                textView.setText(MyImei());            }        });    }    public String MyImei() {        return "真正IMei";    }}

想要达到的效果是,文本原本显示的是 真正IMei 这个几个字,当插件运行了,会修改这个方法,点击按钮,文本字会被修改

接下来,开始写我们的插件

1.新建一个Android 工程,导入jar包,这里着重提醒,大多数博客都是错误的引入方式,导致会报错


正确的引入方式:


在app下新建一个文件夹并复制jar到文件夹下,在build.gradle下写上,Sync now一下即可。


2.在AndroidManifest.xml下的application结点下配置meta-data,如图:


3.写一个类去实现  IXposedHookLoadPackage  接口,并重写handleLoadPackage方法


public class Main implements IXposedHookLoadPackage{    String className = "com.xptest.myimei.MainActivity";    @Override    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {        Class clazz = loadPackageParam.classLoader.loadClass(className);        /**         * 第一个参数是目标类         * 第二个参数是目标方法         * 第三个是回调,可用这个替换目标方法,还有个带两个方法的回调,before,after那个         */        XposedHelpers.findAndHookMethod(clazz, "MyImei", new XC_MethodReplacement() {            @Override            protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {                return "Hook Imei";            }        });    }}


  这个方法是在一个app包被加载的时候执行,执行的特别早,甚至在Application.onCreate()方法之前。可以在这里设置特定的hook钩子。参数对象包含app的一些信息。这里简单打印一些信息。



4.指定模块的运行入口

新建一个asset资源文件,新建一个文本文件,并命名xposed_init(必须)


内容写入口类的全包名



5.安装一开始编写应用,打开是这个样子


点击按钮,也不会发生改变


6.开始编译并安装插件


7.安装完成后,会提示




8.点击打开,选择模块,会看到刚才安装的插件




9.点击勾选,然后回到框架页面重启即可



此时,安装并打开我们编写的应用

一进入页面就发现文本已经被修改了,点击按钮也不会出现之前的”真正IMei“字样,说明我们已经hook成功






本人个人原创,如有雷同,纯属巧合,或者与本人联系,做改动。请转载或者CV组合标明出处,谢谢!(如有疑问或错误欢迎指出,本人QQ:752231513)




0 0
原创粉丝点击