说到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.youkuaiyun.com/detail/qq_30548105/9765223
<?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>
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)