Android学习第十三天---Xposed框架理解

转载 2016年08月30日 16:47:52

这篇文章
http://www.360doc.com/content/14/0625/09/9462341_389540723.shtml

1.简介

Xposed是GitHUB上rovo89大大设计的一个针对Android平台的动态劫持项目,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。与采取传统的Inhook方式(详见Dynamic Dalvik Instrumentation分析这篇本章 )相比,Xposed在开机的时候完成对所有的Hook Function的劫持,在原Function执行的前后加上自定义代码。

2.框架

Xposed:Xposed的C++部分,主要是用来替换/system/bin/app_process,并为XposedBridge提供JNI方法。
 XposedInstaller:Xposed的安装包,负责配置Xposed工作的环境并且提供对基于Xposed框架的Modules的管理。在安装XposedInstaller之后,app_process与XposedBridge.jar放置在了/data/data/de.robv.android.xposed.installer。
 XposedMods:使用Xposed开发的一些Modules,其中AppSettings是一个可以进行权限动态管理的应用

3.原理

3.1Zygote

在Android系统中,应用程序进程都是由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源代码分析。

3.2 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 APP的启动过程

这里写图片描述

详情看这里

来看看 看雪大牛的帖子

注入安卓进程,并hook java世界的方法

说明:
安卓系统的可执行对象有两个世界,一个是Linux Native世界,一个是Java世界.两个世界能够通过jvm产生交互,具体来说就是通过jni技术进行互相干涉.但是在正常情况下,只能在Java世界通过jni调用native方法,二native不能在没有任何java上的支持下干涉java世界.
在一些应用中,我们需要对一个app的java世界进行干涉.再说到linux上的进程注入技术,已不用我多讲,但是传统的linux进程注入技术在安卓上只能进入目标进程的native世界.
于是本教程是要注入别的进程,并hook java世界的java 方法!

再解释一些专业术语用来帮助理解

native 本地层

JNI 是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

从native世界进入java世界.熟悉jni编程的都知道,java到native的桥梁是JNIEnv,我们只要获得一个JNIEnv就能进入到java世界了.突破点就在AndroidRuntime,android::AndroidRuntime::getJavaVM();这个静态方法能够获取一个JavaVM, JavaVM->GetEnv方法能够获得一个JNIEnv了.JNIEnv是和线程相关的,使用前一定记得将其附加到当前进程,也要在适当的时候将其销毁.

JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立。JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程都可以使用这个JavaVM。当后台线程需要调用JNI native时,在native库中使用全局变量保存JavaVM尤为重要,这样使得后台线程能通过JavaVM获得JNIEnv。

详情看这里

看雪的分析下载

相关阅读

如何在Android中启动Java程序

Android中Java代码的启动 app_process

zygote即app_process的启动和重启

Xposed源码简析

另外偶然发现一个很不错了 可以看看

Android应用程序永久获得root的方法

如果能把上面的看完 而且是理解了 相信你已经不错了

Xposed学习一:初探

转:http://www.cnblogs.com/vendanner/p/4784377.html 随笔 - 56  文章 - 0  评论 - 0 Xposed学习一:初...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2016年09月19日 12:44
  • 485

Xposed框架开发入门(一)

最近在学习Android逆向的时候涉及到了Hook方面的知识,所以研究了下Xposed和Cydia Substrate框架,虽然最后还是成功搞起了,但是一路下来感觉还是有很多不顺的,所以在学习的时候就...
  • qq_24280381
  • qq_24280381
  • 2017年03月30日 21:20
  • 1999

Xposed框架学习

  • 2015年07月06日 17:40
  • 2.41MB
  • 下载

Xposed模块开发教程

转:http://vbill.github.io/2015/02/10/xposed-1/ 原文地址。这是开发者所写的,可以说是官方开发指南。文章讲述了Xposed的原理,以及怎么开...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2017年02月06日 11:51
  • 2412

Android xposed框架开发入门

近期在搞信息安全大赛,我们的作品是要基于xposed来做钩子,所以就研究了一下这个技术。但是真心感觉这个坑很多啊。。我是搞了半天才把框架搭建起来能够使用。写下来,各位后来的童鞋少走点坑吧。哈哈。入门涉...
  • u013496707
  • u013496707
  • 2016年03月21日 13:12
  • 10574

xposed 框架学习

xposed 框架学习 xposed 框架学习 一xposed 启动过程 app_main 虚拟机 二hook流程分析 findAndHookMethod findMethodExact hookMe...
  • djhsws
  • djhsws
  • 2015年11月08日 09:39
  • 1775

Android Hook框架Xposed入门

转:http://chendd.com/blog/2016/05/15/learn_xposed/ 一.基础知识        Xposed是Android平台上较为出名的...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2016年08月25日 16:19
  • 3381

研究Xposed相关二:如何root android模拟器(android4.3.1)

从上一篇文章 研究Xposed相关一:Xposed框架的安装
  • wch18956441322
  • wch18956441322
  • 2014年11月07日 09:04
  • 3701

Android Studio创建Xposed工程

Android Studio创建Xposed工程1.新建lib文件夹将XposedBridgeApi-xxx.jar导入其中2.修改build.gradle->dependencies->compil...
  • pl19920614
  • pl19920614
  • 2016年12月10日 20:55
  • 1296

Xposed学习一:初探

学习Xposed框架,在github:https://github.com/rovo89 下载XposedInstaller安装到电脑上来管理Xposed的模块。 本文记录根据官方文档(资料1)在an...
  • a6624624
  • a6624624
  • 2015年08月26日 16:54
  • 628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android学习第十三天---Xposed框架理解
举报原因:
原因补充:

(最多只允许输入30个字)