一、前言
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,可发我邮箱索要:[email protected])