Xposed框架与Drozer测试框架学习-Hook篇

 一、前言

Xposed框架是Android中Hook技术的一个著名框架。另一个是CydiaSubstrate,但是这个框架是收费的,可能因为它可以Hook到C++层所以在使用上有点难度,个人感觉这个框架可以作为高阶应用,简单的只在Java层做Hook应用就使用Xposed框架就可以了。Xposed它是免费且开源的,网上有很多文章介绍Xposed。

二、前提

本人测试环境:
Nexus 5 (这个大家随意,只要是Android手机就行)
Android 4.4.4 (已经root过,Xposed框架需要root权限)
准备Xposed框架文件,这里需要注意的是,它针对不同系统发布了多个版本,所以你需要针对自己设备系统版本下载对应的框架。
(注:框架的安装和使用网上有很多文章,这里不再赘述)

三、编写测试app

Xposed.apk是一个模块管理器,我们如果想做hook操作还得自己编写模块安装到设备中。模块安装成功这个框架工具app可以检测出来,会提示你加载模块然后重启生效。

(注:我编写的测试app和模块是在一个项目中)

第一步:

使用Android Studio创建项目,项目名为XPhooktDemo。将项目视图切换为Project,在app目录下创建lib文件夹,在lib文件夹下放入XposedBridge.jar。(这里说明为什么要创建lib文件夹,在网上大部分文章都写的是添加到libs中,但是我自己实验发现这样是不能运行的,模块加载重启后日志提示框架错误。)

在项目上右键,选择open module Settings

 

在Project Structure窗口中点击Dependencies视图卡

 

第二步:

创建简单输入验证,输入正确弹出新的界面,输入错误弹出错误提示Toast。

 

源码:

public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    Button mButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.edit);
        mButton = (Button) findViewById(R.id.btn);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String count_a;
                count_a = mEditText.getText().toString();
                if (!count_a.isEmpty()){
                    if (isEquals(count_a))
                    {
                        Toast.makeText(MainActivity.this,"OK",Toast.LENGTH_SHORT).show();
                        Intent start = new Intent(MainActivity.this,welcome.class);
                        startActivity(start);

                    }
                    else
                        Toast.makeText(MainActivity.this,"ERROR",Toast.LENGTH_SHORT).show();
                }

                Toast.makeText(MainActivity.this,"NULL",Toast.LENGTH_SHORT).show();
            }
        });
    }
    private boolean isEquals(String count){
        if (count.equals("15pb")){
            return true;
        }
        return false;
    }
}

在点击事件中调用了isEquals方法做比较。比较的值是 "15pb"。

第三步:

编写模块,创建实现IXposedHookLoadPackage接口的类

 源码:

public class Main implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

        //打印装载的apk程序包名
        XposedBridge.log("Lanuch app:"+loadPackageParam.packageName);

        //你想操作的应用的包名,这里为这个项目自身的包名
        if (loadPackageParam.packageName.equals("com.example.a71037.xphooktdemo")) {
            Class clasz = loadPackageParam.classLoader.loadClass("com.example.a71037.xphooktdemo.MainActivity");
            //hook MainActivity的 isEquls 方法
            XposedHelpers.findAndHookMethod(clasz, "isEquals", int.class, new XC_MethodHook() {
                //方法执行前进行的操作
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    Integer para1 = (Integer) param.args[0];   //获取参数1
                    String s1 = Integer.toString(para1);
                    Log.v("hook before param1:", s1);
                    param.args[0] = "15pb";  //设置参数1,也就是将isEquls的参数恒定
                    Log.v("hook", "before hook!");
                    XposedBridge.log("hook before param1:" + s1);
                }

            });
        }
    }
}

清单文件:

  <!-- 作为xposed模块 -->
        <meta-data
            android:name="xposedmodule"
            android:value="true"/>

        <!-- 模块描述 -->
        <meta-data
            android:name="xposeddescription"
            android:value="模块描述"/>

        <!-- XposedBridgeApi的最低版本号 -->
        <meta-data
            android:name="xposedminversion"
            android:value="82"/>

第四步:

验证结果,在isEquals方法中比较输入的字符串是否为15pb,在经过hook后将所有的输入的参数修恒定改为15pb,这样无论我们输入什么,他返回的永远是true。

 四、实际用途

本文介绍了Xposed框架的基本使用以及一个简单的例子,但是这个框架是非常有用的最常用的当属破解,也可进行脱壳、外挂等。

五、总结

本文是介绍Xposed的基础使用,通过自己编写测试app加深理解。内容比较简单但却是我学习的记录,如果对你有用希望您点个赞。

(如果懒得写代码需要提供apk,可发我邮箱索要:695876649@qq.com)

原文地址:https://www.cnblogs.com/NigelX/p/6714090.html