美文网首页
Xposed应用的开发

Xposed应用的开发

作者: leoryzhu | 来源:发表于2018-03-22 11:27 被阅读492次

    一. xposed原理

    Xposed的底层原理是通过替换/system/bin/app_precesss 程序控制zygote进程,使得它在系统启动的过程中会加载Xposed framework的一个jar文件即XposedBridge.jar,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持,并且能够允许开发者独立的替代任何class

    二. 安装xposed框架

    • 条件
      使用设备需要root

    • 下载安装xposed框架的安装器
      安装器会自动检测和选择设备系统对应的xposed版本
      http://xposed.appkg.com/2303.html

    image.png
    • 安装xposed框架,目前的最新版本号是89,安装成功后重启设备

    三. 首先创建一个需要被hook的目标应用

    新建一个应用XposedApplication
    目标:通过劫持方法verifyLogin 返回登陆成功
    MainActivity

    public class MainActivity extends AppCompatActivity {
    
        private EditText etAccount;
        private EditText etPassword;
        private Button btnLogin;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            etAccount=findViewById(R.id.et_account);
            etPassword=findViewById(R.id.et_password);
            btnLogin=findViewById(R.id.btn_login);
            btnLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String account=etAccount.getText().toString();
                    String pwd=etPassword.getText().toString();
                    if(verifyLogin(account,pwd)){
                        Toast.makeText(MainActivity.this,"登陆成功!",Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(MainActivity.this,"登陆失败!",Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
        }
        private boolean verifyLogin(String account,String pwd){
            if(account.equals("leory")&&pwd.equals("123")){
                return true;
            }
            return false;
        }
    }
    

    R.layout.activity_main

    LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.zhuliyi.xposedapplication.MainActivity">
        <EditText
            android:id="@+id/et_account"
            android:hint="账号"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/et_password"
            android:hint="密码"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/btn_login"
            android:text="登陆"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    

    四. 编写hook应用

    新建一个android工程XposedDemo

    • 引入xposed api
      在app build.gradle文件中
      provided 'de.robv.android.xposed:api:82'
      注意是通过provided方式引入

    • 在AndroidManifest.xml文件配置xposed信息

    <!-- 标记xposed插件 start-->
            <meta-data
                android:name="xposedmodule"
                android:value="true"/>
            <!-- 模块描述 -->
            <meta-data
                android:name="xposeddescription"
                android:value="测试Xposed"/>
            <!-- 最低版本号 -->
            <meta-data
                android:name="xposedminversion"
                android:value="54"/>
    <!-- 标记xposed插件 end-->
    
    • 创建hook类,实现IXposedHookLoadPackage接口
    public class HelloHook implements IXposedHookLoadPackage {
        @Override
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
            XposedBridge.log("===包名===" + lpparam.packageName);
           
    
            if (lpparam.packageName.equals("com.zhuliyi.xposedapplication")) {
                //混淆后方法名也变化了
                XposedHelpers.findAndHookMethod("com.zhuliyi.xposedapplication.MainActivity", lpparam.classLoader, "verifyLogin", String.class, String.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                    }
    
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        param.setResult(true);
                    }
                });
            }
        }
    }
    

    handleLoadPackage方法回调是在目标应用加载时候调用,先通过LoadPackageParam参与判断目标应用的包名,然后通过XposedHelpers.findAndHookMethod() hook调用的方法,第一个参数是包名,第二个是classLoader,第三个是方法名,后面是方法参数,最后是XC_MethodHook回调,beforeHookedMethod是方法执行前调用 ,afterHookedMethod是方法执行后调用,通过param.setResult(true),设置返回值为true,当然也可以通过进行其他操作,这里就不介绍了

    • 添加hook文件配置
      我们需要在assets目录下面新建一个xposed_init文件,写上我们Hook文件的路径,如图:
    image.png

    接着 编译,运行,安装apk,最后在XposedInstaller 模块中添加XposedDemo框架,然后重启设置

    image.png

    随便输入都可以登陆成功

    image.png

    五.注意事项

    目前的应用大多是混淆的,这种 情况下,应用的属性和方法可能会被混淆,导致不是真实的方法名,比如我对目标应用进行混淆后,通过反编译工具查看到的代码如下图


    image.png

    验证登陆的方法名verifyLogin变成了a,此时我们就要修改XposedHelpers.findAndHookMethod() 中的方法名为a

    温馨提示:android反编译的工具为的详解地址

    相关文章

      网友评论

          本文标题:Xposed应用的开发

          本文链接:https://www.haomeiwen.com/subject/irngqftx.html