1.添加hook方法

首先是init进程打开 app_process,然后进入XposedInit.java main() - > initForZygote() 加入对ActivityThread.handleBindApplication() 的hook,找到Method对象

XposedBridge.hookMethod(method,callback) 加入到一个  key=method val=callbacks 的map中 sHookedMethodCallbacks

Native 方法 hookMethodNative(),当前在zygote中,zygote的app_process被xposed修改过,加载过这个方法。

然后是loadModules() 加载所有模块app

App_process

先加载/system/framework/XposedBridge.jar 到 env CLASSPATH 中

然后启动虚拟机,调用onVmCreatedCommon()加载native方法

加载jar路径成功后到 de.robv.android.xposed.XposedBridge main() 中

ArtMethod* artMethod = ArtMethod::FromReflectedMethod(soa, javaReflectedMethod); //(soa = Method = jobject)

该方法根据 soa对象里的 artMethod int值经过一系列操作,asArtMethod()

得到artMethod,然后执行hook

artMethod->EnableXposedHook(soa, javaAdditionalInfo);  //EnableXposedHook 找不到定义

ArtMethod定义在android源码中

class MANAGED ArtMethod FINAL : public Object

看dvm的实现

Method* method = dvmSlotToMethod(declaredClass, slot);  //return &clazz->virtualMethods[slot];

保存原先的method副本到XposedHookInfo中。

method->nativeFunc = &hookedMethodCallback

method->insns = (const u2*) hookInfo;  //表示让dvm判为内部native方法 = DalvikNativeFunc  =  typedef void (*DalvikNativeFunc)(const u4* args, JValue* pResult);

method->registersSize = method->insSize;

最主要的一个操作是 nativeFunc 指向自己的方法

完成HOOK

Method结构

struct Method {

ClassObject*    clazz;

u4              accessFlags;

u2             methodIndex;  //在虚方法表中的下标

508    u2              registersSize;  /* ins + locals , 需要的寄存器数量  smali: .register */

509    u2              outsSize;

510    u2              insSize;

513    const char*     name; //方法名

523    DexProto        prototype;  //方法签名  smali: (I[I)V     = void xxxxx(int,int[])

525    const char*     shorty;  /* short-form method descriptor string */

535    const u2*       insns;          /* 1.指令,在内存中映射的.dex   2.JNI 会把这里用作方法指针。 3.内部本地方法这里是null*/

536

537    /* JNI: cached argument and return-type hints */

538    int             jniArgInfo;

547    DalvikBridgeFunc nativeFunc;  //Jni方法指针,可以是具体方法或者JNIbridge 。DalvikBridgeFunc / DalvikNativeFunc ,insns == null 代表Jni方法(DalvikBridgeFunc ),否则等于内部方法(DalvikNativeFunc),

。。。

577    const RegisterMap* registerMap; //方法中用到的寄存器

。。。

581};

触发

之后当这个方法被虚拟机调用时会调用 hookedMethodCallback()

然后会调用 java层的 handleHookedMethod()方法。

然后的主要流程是取出在hook时给的additionalInfo.callbacks 中的所有XC_MethodHook,调beforeHookedMethod(),invokeOriginalMethodNative()调原来的方法,然后是调用afterHookedMethod(),最后返回方法返回值。

invokeOriginalMethodNative() 通过 dvmInvokeMethod()调用原生方法

Art是 用 InvokeMethod() 调用原生方法

android_art/runtime

EableXposedHook  等 ArtMehtod 修改后的方法在这个修改后的 art 虚拟机工程里

用xposedInstaller 安装框架的时候,除了下载xposedBrage.jar 更换 app_Process 等,还从这个项目中下载 libart.so

1.挂载入口

xposedInitLib = dlsym(xposedLibHandle, "xposedInitLib") //根据 dvm 或 art 动态加载函数地址

xposedInitLib()

xposed->onVmCreated = &onVmCreatedCommon;

2.根据生命周期进入

虚拟机onVmCreated()

Xposed::onVmCreated() -》 onVmCreatedCommon()

onVmCreatedCommon()

initXposedBridge()

register_natives_XposedBridge()-》 注册hookMethodNative native方法

xposed 原理分析的更多相关文章

  1. Xposed原理分析

    目录 安卓系统启动 什么zygote? 安卓应用运行? Xposed介绍 Xposed构成 Xposed初始化大体工作流程 源码分析 初始化 app_main#main app_main#initia ...

  2. 阿里系产品Xposed Hook检测机制原理分析

    阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...

  3. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  4. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  5. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  6. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  7. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  8. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  9. NOR Flash擦写和原理分析

    NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...

随机推荐

  1. start_udev 是不是会写磁盘头

    遇到一个案例,在这里记录一下 一套Oracle 11.2.0.4 RAC环境,操作系统是RHEL 6.5,共享磁盘是通过UDEV实现RAW绑定设备名,如下 [root@rac1 opt]# ll /d ...

  2. 关于华为模拟器(eNSP)添加路由器启动后一直打印#号的原因

    操作系统为win10 专业版 1903:1.首先打开控制面板,找到windows defender防火墙,在“允许应用通过防火墙”中把和espn相关的两个的专网和公网都勾选上,最后确定:然后重启华为模 ...

  3. xampp配置二级域名通过不同端口访问不同网站

    首先需要在xampp\apache\conf\extra\httpd-vhost.conf中写入配置的二级域名 <VirtualHost *:8081> // 该网站通过监测8081端口 ...

  4. Redux API

    Redux API ​ Redux的API非常少.Redux定义了一系列的约定(contract),同时提供少量辅助函数来把这些约定整合到一起. ​ Redux只关心如何管理state.在实际的项目中 ...

  5. LeetCode 5126. 有序数组中出现次数超过25%的元素 Element Appearing More Than 25% In Sorted Array

    地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/element-appearing-more-than-25-in-so ...

  6. QT debug执行exe文件 应用程序无法正常启动0xc000007b

    遇到这种错,发现并不是因为缺失dll文件,因为我把需要的DLL都放到Debug文件下了,但还是有这问题: 解决方法: 右键点击-- >我的电脑--属性-->高级系统设置-->环境变量 ...

  7. USACO Max Flow

    洛谷 P3128 [USACO15DEC]最大流Max Flow 洛谷传送门 JDOJ 3027: USACO 2015 Dec Platinum 1.Max Flow JDOJ传送门 Descrip ...

  8. Codeforces Round #594 (Div. 1) D. Catowice City 图论

    D. Catowice City In the Catowice city next weekend the cat contest will be held. However, the jury m ...

  9. css兄弟选择器,+ ~选择器的区别

     壹 ❀ 引 实习生在写搜索框下拉提示时,遇到了不知道怎么解决的问题,所以来问我.效果不难,鼠标选中输入框(focus)时,展示搜索关键字相关提示,看了眼dom结构是这样的: 在她的理解里面,选中父元 ...

  10. Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]

    科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345 ...