学习笔记:Android Xposed 框架入门

目录

Xposed 框架简介

Xposed 框架的具体使用

原理分析

Xposed 框架简介

Xposed是一款优秀的android java层 hook 框架。它允许你在不修改apk源码的情况下,通过编写自己的模块来改变apk的行为。它的优点是采用了插件机制,模块能够适用不同版本的框架和rom。模块改变apk行为的操作发生在内存中,对源apk不进行任何修改。你只需要安装编写的模块并重启相应的设备即可。

xposed 主要由三个项目来组成的:

Xposed:Xposed的C++ 部分,主要是用来替换 /system/bin/app_process,并为XposedBridge 提供 JNI方法。

XposedBridge:Xposed 提供的jar文件,app_process 启动过程中会加载该jar包,其他的 Modules 的开发都是基于 该jar包。

XposedInstaller:Xposed的安装包,提供对基于Xposed框架的Modules的管理。

xposed 目前已逐步支持 ART虚拟机,兼容 android 5.0 以上版本。

Xposed 框架的具体使用

具体的安装教程需要自行百度,的确是安装环境比较耗费时间,不过都是躲不掉的!!!这里用一个绕过密码登录的例子进行说明。Android studio的配置代码这里就不贴了,需要的话可以去百度一下,很多资源。以下是安装使用教程:Xposed框架安装使用教程。

1. 创建 Android 工程

一个 Xposed 模块本质上是一个正常的 apk,所以你只需要去创建一个空的工程,不需要添加任何的 Activity。

2. 添加 jar 包

下载地址:jar包

在添加依赖项的时候注意使用 provided 不要使用 compile! 如下图红线部分所示:

然后还需要在 AndroidManifest.xml 文件配置,在Application节点下添加以下信息:

3. 在 assets 文件夹下写入入口信息

在 Android 工程的 main 文件夹下创建 assets 文件夹(没有的话)。XposedBridge 从assets 目录中的xposed_init 文件中获取入口点。xposed_init文件中每行配置一个进入点,使用完全限定名。在该例子中,进行如下配置。

4. 模块实现

在模块中创建一个类,根据自己的需求实现以下的接口:

安卓系统启动的时候(使用 IXposedHookZygoteInit 接口)

一个新的app被加载的时候(使用 IXposedHookLoadPackage 接口)

一个资源被初始化的时候( 使用 IXposedHookInitPackageResources 接口)

指定要 hook 的包名(这里是 com.markable.androidsecurity ),也就是你想要 hook 的应用包名,我这里就是本项目。

判断当前加载的包是否是指定的包(在接口方法中判断)

指定要 hook 的方法名‍‍

实现beforeHookedMethod方法和afterHookedMethod方法( hook 的具体功能)‍‍

以下是绕过登录的完整代码。

package com.markable.androidsecurity.module;

import android.widget.TextView;

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;

/**

* Created by Markable on 2018/7/11.

* Github: https://github.com/ddz-mark

* Info:

*/

public class SkipLoginCheck implements IXposedHookLoadPackage {

@Override

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam param) throws Throwable {

// 判断是否是应用的包名

if (param.packageName.equals("com.markable.androidsecurity")) {

findAndHookMethod("com.markable.androidsecurity.LoginActivity", param.classLoader, "login", String.class, String.class, new XC_MethodHook() {

@Override

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

super.beforeHookedMethod(param);

XposedBridge.log("开始劫持了~");

XposedBridge.log("参数1 = " + param.args[0]);

XposedBridge.log("参数2 = " + param.args[1]);

}

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

super.afterHookedMethod(param);

XposedBridge.log("劫持前返回的result: " + param.getResult());

param.setResult(true);// 绕过登录

XposedBridge.log("劫持后返回的result: " + param.getResult());

XposedBridge.log("hook finish");

}

});

}

}

}

以上是绕过登录的功能代码,核心代码在于 param.setResult(true),可以让登录直接通过(这里是简单的登录模拟功能)。

5. 原理分析

在 Android 系统中,应用程序进程以及系统服务进程 SystemServer 都是由 Zygote 进程孵化出来的,而 Zygote 进程是由 Init 进程启动的, Zygote 进程在启动时会创建一个 Dalvik 虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个 Dalvik 虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的 Dalvik 虚拟机实例,这也是 Xposed 选择替换 app_process 的原因。

Zygote进程在启动的过程中,除了会创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来前面创建的Dalvik虚拟机实例中去。注意,一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因。XposedBridge有一个私有的Native(JNI)方法hookMethodNative,这个方法也在app_process中使用。这个函数提供一个方法对象利用Java的Reflection机制来对内置方法覆写。具体的实现可以看下文的Xposed源代码分析。

Hook/Replace 简析

Xposed 框架中真正起作用的是对方法的hook。在Repackage技术中,如果要对APK做修改,则需要修改Smali代码中的指令。而另一种动态修改指令的技术需要在程序运行时基于匹配搜索来替换smali代码,但因为方法声明的多样性与复杂性,这种方法也比较复杂。

在Android系统启动的时候,zygote进程加载XposedBridge将所有需要替换的Method通过JNI方法hookMethodNative指向Native方法xposedCallHandler,xposedCallHandler在转入handleHookedMethod这个Java方法执行用户规定的Hook Func。

XposedBridge这个jar包含有一个私有的本地方法:hookMethodNative,该方法在附加的app_process程序中也得到了实现。它将一个方法对象作为输入参数(你可以使用Java的反射机制来获取这个方法)并且改变Dalvik虚拟机中对于该方法的定义。它将该方法的类型改变为native并且将这个方法的实现链接到它的本地的通用类的方法。换言之,当调用那个被hook的方法时候,通用的类方法会被调用而不会对调用者有任何的影响。在hookMethodNative的实现中,会调用XposedBridge中的handleHookedMethod这个方法来传递参数。handleHookedMethod这个方法类似于一个统一调度的Dispatch例程,其对应的底层的C++函数是xposedCallHandler。而handleHookedMethod实现里面会根据一个全局结构hookedMethodCallbacks来选择相应的hook函数,并调用他们的before, after函数。

当多模块同时Hook一个方法的时候,Xposed会自动根据Module的优先级来排序,调用顺序如下:

A.before -> B.before -> original method -> B.after -> A.after

android基于xposed框架,学习笔记:Android Xposed 框架入门相关推荐

  1. Celery 框架学习笔记(分布式框架)

    在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...

  2. Spring框架学习笔记(1) ---[spring框架概念 , 初步上手使用Spring , 控制反转 依赖注入初步理解 ]

    spring官网 -->spring官网 spring5.3.12–>spring-framework 在线文档 --> Spring 5.3.12 文章目录 1.Spring概论 ...

  3. Android日常开发 - FlexboxLayout学习笔记

    Android日常开发 - FlexboxLayout学习笔记 Android日常开发使用FlexboxLayout实现流式布局的效果,FlexboxLayout与h5中的flex使用十分相似,都是将 ...

  4. JeeSite 框架学习笔记

    JeeSite 框架学习笔记 目录 JeeSite 框架学习笔记 一.全局配置 1. 获取 Resource资源实际路径 DefaultResourceLoader 2. 配置前端 js css 二. ...

  5. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  6. Unity游戏框架学习笔记——03基于观察者模式的事件中心

    Unity游戏框架学习笔记--03基于观察者模式的事件中心 基于观察者模式的事件中心 一如既往指路牌:https://www.bilibili.com/video/BV1C441117wU?p=5. ...

  7. Android Studio下载搭建学习笔记01

    Android Studio下载搭建学习笔记01 下载Android Studio 安装Android Studio 进入安装向导 选择安装组件 选择安装位置 选择文件菜单 等待安装 启动并配置And ...

  8. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  9. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  10. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

最新文章

  1. 1037 Magic Coupon
  2. OPENCV中的数据结构总结
  3. mongodb部署以及数据操作
  4. c语言打不开h文件,说那个“mem.h”头文件打不开 怎么改啊 高手们帮帮忙
  5. 坚持自主创新,凌波微步完成数千万A轮融资,加速半导体产业
  6. 互联网晚报 | 11月7日 星期日 | EDG夺得《英雄联盟》S11总冠军;拼多多推出“超拼夜”系列;VMware与戴尔完成分拆...
  7. C++笔记-函数参数使用void *的野路子
  8. 《Joel On Software》读后
  9. Android脱壳圣战---360脱壳与修复
  10. java截取文件名后缀
  11. html 播放视调用本地播放器,用HTML5做一个本地视频播放器
  12. PS 超简单抠头发丝
  13. 2018 10 12 校内模拟 字符串模拟+平面距离+线段树
  14. 【CFD理论】对流项-02
  15. 超级3GP转换器 V1.6.3.0 纯免费的
  16. 综合布线包括计算机网络,综合布线试题
  17. RT 3570 wifi 移植手册
  18. 汇编计算机钢琴流程图,汇编模拟电子琴程序
  19. SIM应用那些事儿,你做对了吗?
  20. python试卷河南理工大学官网_河南理工大学历年大学物理试卷及答案

热门文章

  1. 水星网卡 linux驱动,水星网卡驱动下载_硬件驱动下载
  2. 精心收集17套电子课件
  3. ShadowGun Deadzone 放出 GM Kit Mod 包
  4. idea导入eclipse快捷键
  5. CodeSmith 简单使用和常用模板
  6. dw添加下拉菜单_Dreamweaver怎么创建下拉菜单
  7. Jetson nano : PWM风扇调速。
  8. c语言二进制转十六进制代码,C语言--二进制转十六进制
  9. 16进制与二进制之间的转换
  10. vkt中使用OBJImporter导入模型并进行贴图