XPosed框架__一次简单的应用

Posted 蕉下客--)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPosed框架__一次简单的应用相关的知识,希望对你有一定的参考价值。


0. Xposed框架简介

关于Xposed框架相信大家应该不陌生了,他是android中Hook技术的一个著名的框架,而Xposed框架是免费的而且还是开源的,本文主要介绍如何通过这个框架来进行系统方法的拦截功能,比如我们开发过程中,对于一些测试环境很难模拟,特别是测试同学有时候像随机改变设备的imei,mcc等信息用来模拟不同测试场景,这时候如果可以去修改系统的这个值的话对于测试来说就非常方便了,其实这些在网上已经有很多类似的小工具了,下面就来详细的讲解如何使用这个框架。

1. 编写模块功能

环境搭建好了,下面就开始操作了,上面安装的那个工具其实是一个模块管理器,我们如果想做一些hook操作还得自己编写模块也就是应用程序,然后把这个模块安装到设备中,这个工具就可以检测出来了,会提示你加载这模块然后在重启设备,模块功能就有效果了。那么下面来看一下如何编写一个Xposed模块呢?

第一步:新建一个Android项目,导入Xposed工具包

这里一定要注意,不能使用libs文件夹而是lib文件夹,如果这里使用了libs文件夹的话,在安装成功模块之后重启会发现Hook是失败的,通过打印tag为xposed的日志信息会发现这样的错误:java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

注意:在Eclipse中,如果把工具包放到libs文件中,默认是加入到编译路径中的,同时在编译出来的程序中也是包含了这个工具包中的所有类,而对于其他非libs文件夹,我们添加工具包之后在add buildpath之后只是做到了工程引用工具包的功能,而最终并不会把这个工具包包含到程序中的。


第二步:编写模块代码

模块代码编写还是比较简单的,我们只要新建一个实现IXposedHookLoadPackage接口的类,然后在handleLoadPackage回调方法中进行拦截操作即可,而具体的拦截操作是借助XposedHelpers.findAndHookMethod方法和XposedBridge.hookMethod方法实现的,这两个方法也是比较简单的,从参数含义可以看到,主要是Hook的类名和方法名,然后还有一个就是拦截的回调方法,一般是拦截之前做什么的一个beforeHookedMethod方法和拦截之后做什么的一个afterHookedMethod方法。

  1. public class Main implements IXposedHookLoadPackage {
  2. //hook 一个具体的函数
  3. private void hook_method(String className, ClassLoader classLoader, String methodName,
  4. Object... parameterTypesAndCallback){
  5. try {
  6. XposedHelpers.findAndHookMethod(className, classLoader, methodName, parameterTypesAndCallback);
  7. } catch (Exception e) {
  8. XposedBridge.log(e);
  9. }
  10. }
  11. //hook 相同函数名的函数
  12. private void hook_methods(String className, String methodName, XC_MethodHook xmh){
  13. try {
  14. Class<?> clazz = Class.forName(className);
  15. for (Method method : clazz.getDeclaredMethods())
  16. if (method.getName().equals(methodName)
  17. && !Modifier.isAbstract(method.getModifiers())
  18. && Modifier.isPublic(method.getModifiers())) {
  19. XposedBridge.hookMethod(method, xmh);
  20. }
  21. } catch (Exception e) {
  22. XposedBridge.log(e);
  23. }
  24. }
  25. @Override
  26. public void handleLoadPackage(final LoadPackageParam lpp) throws Throwable{
  27. Log.i("jw", "pkg:"+lpp.packageName);
  28. //hook 系统函数getDeviceId 函数,并将返回值设置为jiangwei
  29. hook_method("android.telephony.TelephonyManager", lpp.classLoader, "getDeviceId", new XC_MethodHook() {
  30. @Override
  31. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  32. Log.i("jw", "hook getDeviceId...");
  33. Object obj = param.getResult();
  34. Log.i("jw", "imei args:"+obj);
  35. param.setResult("jiangwei");
  36. }
  37. });
  38. //定位
  39. hook_methods("android.location.LocationManager", "getLastKnownLocation", new XC_MethodHook(){
  40. @Override
  41. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  42. Log.i("jw", "hook getLastKnownLocation...");
  43. Location l = new Location(LocationManager.PASSIVE_PROVIDER);
  44. double lo = -10000d; //经度
  45. double la = -10000d; //纬度
  46. l.setLatitude(la);
  47. l.setLongitude(lo);
  48. param.setResult(l);
  49. }
  50. });
  51. hook_methods("android.location.LocationManager", "requestLocationUpdates", new XC_MethodHook() {
  52. @Override
  53. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  54. Log.i("jw", "hook requestLocationUpdates...");
  55. if (param.args.length == 4 && (param.args[0] instanceof String)) {
  56. LocationListener ll = (LocationListener)param.args[3];
  57. Class以上是关于XPosed框架__一次简单的应用的主要内容,如果未能解决你的问题,请参考以下文章

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

    Spring 5.0.0框架介绍_中文版_3.9

    最简单oppo系统一键激活xposed框架经验

    最简单小米设备怎么不root激活xposed框架

    (简单有效)三星手机怎么样无需ROOT激活Xposed框架

    Android中Xposed框架篇---基于Xposed的一款脱壳神器ZjDroid工具原理解析