xposed 原理分析
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 原理分析的更多相关文章
- Xposed原理分析
目录 安卓系统启动 什么zygote? 安卓应用运行? Xposed介绍 Xposed构成 Xposed初始化大体工作流程 源码分析 初始化 app_main#main app_main#initia ...
- 阿里系产品Xposed Hook检测机制原理分析
阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
- 转载:AbstractQueuedSynchronizer的介绍和原理分析
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
- Camel运行原理分析
Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...
- NOR Flash擦写和原理分析
NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...
随机推荐
- Shell—各种括号的用法
括号的种类 小括号,圆括号 ( ) 中括号,方括号 [ ] 大括号.花括号 { } 一.单小括号 () 1.另开命令组——小括号中的命令将会新开启一个子shell独立顺序运行,所以括号中的变量不能够被 ...
- X短期项目总结
刚退出了一个项目,简称为X项目.这个项目中,还是遇到了不少问题,也解决了部分问题,还是挺有收获的,所以总结一下. 虽然标题说是短期项目总结,但其实这个项目并不短, 持续了约3年时间. 所谓的短,只是我 ...
- 使用python对整个网页进行截图
方法一.使用PyQt4的QtWebKit组件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- Day10 - Python基础10 socketserver 实现并发
本节内容: 1.实例tcp的并发 2.看源代码继承关系 3.详解:ThreadingTCPServer的过程 4.tcp和udp的request 不同 5.基于udp的并发实现 1.实例tcp并发 s ...
- 设计模式-State(行为模式)-很好的实现了对象的状态逻辑与动作实现的分类,状态逻辑在State的派生类实现,动作可以放在Context类中实现。
以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Context.h #pragma once class State; class Context { public: C ...
- 解决Fiddler在win7系统下的安全证书问题
如果电脑win7系统,一直解决不了Fiddler的证书安装问题,可以试试下面的办法. 在安装证书的时候一直遇到这个问题. 这是因为win7系统的在.net Framework4.0上面的bug引起的. ...
- 【总结】《氨基酸新晋管理者领导力培训》第一次课_Day2_学习心得
7月26日第二天学习心得: 今天主要学习了执行贯彻和绩效反馈两大块内容,我的心得有: 一.执行层面有两大原则:--理解员工需求: 回顾了一下自己以往的经历,一般这块我用的最多的一般是在接到一个新项目的 ...
- ansible命令参数介绍
-m:要执行的模块,默认为command -a:模块的参数 -u:ssh连接的用户名,默认用root,ansible.cfg中可以配置 -k:提示输入ssh登录密码.当使用密码验证的时候用 -s:su ...
- OpenGL入门1.7:摄像机
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经知道了何为观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点) OpenGL本身没有摄像机(Camera)的概 ...
- MySQL UNION 查询
UNION 用来合并多个 SELECT 结果. 考察如下两个表: # t1 +----+---------+ | id | pattern | +----+---------+ | 1 | Divot ...