Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的虚拟机的劫持。基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作.与 iOS 越狱后的插件相似。由于涉及到修改系统,所以如果调教不当,很可能会使你的手机变成砖
搭建Xposed环境花了很久,特此整理出一个捷径给小伙伴们。不要在为了刷第三方Recovery烦恼,不要再为手机root烦恼,也不要再为安装Xposed烦恼,直接下载一个root好的,包含XP框架的Rom包,直接装入即可。
以下是使用AS开发自己的Xposed插件
初次在Android studio中使用Xposed,以下是流程,不要粗心,少一步都是失败的。至于原理的分析,我就不做整理,毕竟自己弄懂了之后还抽不出来整理。
首先准备好XposedBridgeApi的jar包。
拿走不谢
链接:https://pan.baidu.com/s/1mi7onQo 密码:v8ci
新建Xposed框架工程,注意此工程无Activity
将jar包放在工程lib文件夹中,并在AndroidManifest.xml文件中添加如下内容:
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="一个登陆劫持的样例" />
<meta-data
android:name="xposedminversion"
android:value="87" />
另外新建一个被劫持的工程。此工程就是我们需要的登录界面和逻辑的工程
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/et1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入你的账号"/>
<EditText
android:id="@+id/et2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入你的密码"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="my_onClick"
android:text="登陆"
android:textSize="26dp"/>
LinearLayout>
以上是布局代码,以下是MainActivity代码
package com.zhonghao.test1;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText mEditText;
private EditText mEditText1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.et1);
mEditText1 = (EditText) findViewById(R.id.et2);
}
public void my_onClick(View view) {
String username = mEditText.getText().toString();
String password = mEditText1.getText().toString();
if(CheckRegister(username,password)){
Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MainActivity.this,"登陆失败",Toast.LENGTH_SHORT).show();
}
}
private boolean CheckRegister(String username, String password) {
return username.equals(password);
}
}
ok,被劫持的工程准备完毕,此工程可以安装到手机上了,下面回到XP框架工程
jar包添加之后,不要忘记配置。在app的build中特别注意此处
将compile改为provided,不改的话会怎么样,你自己试试呗,肯定报错
下一步我们需要告诉Xposed框架模块的主入口类,也就是这里的com.zhonghao.hooktest.Main
添加一个assets文件夹:右键点击 app这个module –> new –> Folder –>Assets Folder,然后确认即可。
在assets中new一个file,文件名为xposed_init,并在其中写上入口类的完整路径
文件里 将路径写上即可
com.zhonghao.hooktest.Main
下面,新创建一个类
Main
我们的模块所要实现的功能就是劫持登录的账号密码,然后显示在手机上Xposed框架的日志里以及打印在Logcat控制台上。
新建一个Main类,并实现IXposedHookLoadPackage接口,并实现IXposedHookLoadPackage接口中的handleLoadPackage方法
package com.zhonghao.hooktest;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
/**
* 项目名称:HookTest
* 包名:com.zhonghao.hooktest
* 创建人:小豪
* 创建时间:2017/1/26 14:15
* 类描述:
*/
public class Main implements IXposedHookLoadPackage {
//被HOOK的程序的包名和类名
String packName = "com.zhonghao.test1";
String className = "com.zhonghao.test1.MainActivity";
/**
* 获取包加载时候的回调
*/
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
// 将包名不是 com.zhonghao.test1 的应用剔除掉,此处要特别注意,我们只想hook住需要的包名
if (!loadPackageParam.packageName.equals("com.zhonghao.test1"))
return;
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
// replaceHookedMethod 替换方法
// beforeHookedMethod 方法前执行
// afterHookedMethod 方法后执行
// 处理是的情况
// 找到对应类的方法,进行hook,hook的方式有两种
findAndHookMethod(className, // 类名
loadPackageParam.classLoader, // 类加载器
"CheckRegister", // 方法名
String.class, // 参数1
String.class, // 参数2
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("开始劫持了! ");
XposedBridge.log("参数1 = : " + param.args[0]);
XposedBridge.log("参数2 = : " + param.args[1]);
Log.d("xposedplugin", (String) param.args[0]);
Log.d("xposedplugin", (String) param.args[1]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("劫持结束了! ");
XposedBridge.log("参数1 = : " + param.args[0]);
XposedBridge.log("参数2 = : " + param.args[1]);
Log.d("xposedplugin", (String) param.args[0]);
Log.d("xposedplugin", (String) param.args[1]);
}
});
}
}
到此就完成了。然后这个没有activity的工程,签名打包生成apk装到手机上。为什么不能直接装?没主界面无法运行。so.安装完之后,在Xposed框架里点击模块勾中你的应用,然后重启手机即刻生效。最后的效果如下
对于实现原理想要方便的同学直接查看Xposed框架hook原理
到此一个初次见面就完成了,之后是开发自己所需的高端的Xposed框架,带我完成之后再分享给大家!
最近才更新,我的建议大家还是自己刷入Xposed吧,因为rom自带的问题很多。我这里把获取系统权限的superSu给大家,还有XposedInstaller,以及ReExplore文件浏览器。 XposedInstaller里边直接点击下载框架,然后也是进入recover界面相应目录下刷进去。
superSu下载
XposedInstaller下载
RootExplore下载