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的方法

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

相关文章推荐

用Genymotion虚拟机在Android 6.0下安装Xposed框架以及Root

最近在研究Xposed框架下的开发,由于之前玩手机的时候装了一堆模块,导致框架下一堆别的模块产生的Log,而且开机奇慢无比,但Xposed模块更新后必须重启,测试代码时候简直就是噩梦。因此想用虚拟机来...

Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能

目录(?)[-] 一前言二定位原理三拦截操作四操作结果演示五总结 一、前言 前文已经介绍了Xposed框架的基本使用规则,本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信...

Android xposed框架开发入门

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

Xposed Android hook框架入门 -开发步骤

原理Xposed替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(/data/data/de.robv.android.xposed.insta...

Android 神器 xposed 框架使用指南

1 简介xposed号称Android上最强大的神器,如果你还不知道xposed是啥,那么你真的out了,本篇博客,让博主带你来了解xposed。(1) xposed 是啥? xposed是一个框架...

Android神器:Xposed框架

Xposed框架相信不少人在微信或者QQ抢红包时会发现有些人抢红包速度特别快,甚至秒抢,难道这些人手速都这么快吗?答案当然不是,很多会刷机的人都会在手机上刷入一款插件:Xposed,在我使用第一部安卓...

Android Xposed框架 -- 入门篇

Xposed框架 一、简介 【1】Xposed框架是Android Hook技术的一个著名的开源框架,在这个框架下,可以加载很多插件APP来直接或间接操纵系统层面的东西,比如:修改微信界面、自...

Android Xposed框架 -- 开发篇

Xposed模块 一、简介 【1】基于前面对Xposed框架的学习,下面将演示如何使用Android Studio创建并编写一个自定义的Xposed模块 【2】目标APP功能:点击按钮时,...

小米4 Android 6.0 版本 Root 并安装 Xposed 框架攻略

本文首发:http://prototypez.github.io/2016/05/16/root-and-install-Xposed-framework-on-XiaoMi4-with-Androi...

Android Hook框架Xposed原理与源代码分析

对于Xposed框架源代码详细解读重制版~纯手打~
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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