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



说到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)




猜你喜欢

转载自blog.csdn.net/qq_30548105/article/details/58585758