Xposed框架原理深入研究
Xposed框架核心思想在于将java层普通函数注册成本地JNI方法,以此来变相实现hook机制(放在文章开头的话很重要哦,记住!)。
Xposed框架的技术核心建立在Jvm原生的JNI机制之上,为了对Xposed框架进行深入分析,同时方便大家理解,我们从以下三个问题着手:
1.Dalvik虚拟机在执行java层代码时如何识别JNI方法?
先来了解一下类的加载过程:当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:
(1)方法代码存于何处,
(2)它有哪些参数,
(3)方法的描述符(public、native之类),etc...
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。下面来看看方法描述符的样子。
注意:方法描述符实际上是一个结构体!
主要到上面的accessFlags了吗,它标记着该方法的类型,public、native等等,所以,要是想把一个方法注册成本地方法,这个标记是必须要改的!
我们知道了accessFlags的作用还不够的,最好还是再了解一下它在执行过程中是怎么发挥作用的,追本溯源吗!
这里简要的描述一下Dalvik虚拟机执行代码基本过程:
一个类在执行之前先会被装载,之后要进行字节码验证(dvmVerifyCodeFlow(),感兴趣的去查查源码),检验完成之后虚拟机会紧接着调用FindClass()来查找并装载main的方法类。此后JNIEnv类调用成员函数CallStaticVoidMethod执行main方法,程序开始运行。来看下面这张函数调用流程图。
找到应用的入口函数(main),依次调用执行。
最终会调用到dvmCallMethodV这个方法,下面是这个方法的实现。
调用了一个关键的函数dvmIsNativeMethod,这个方法的作用就是判断函数的类型,通过比对方法描述符中的accessFlags与ACC_NATIVE(常量)是否相等来识别该方法是否是NATIVE方法。如下图。
我们现在已经了解了java层方法执行的流程,以及识别Native方法的机理,下面就来具体研究一下如何将一个普通方法注册成一个Native方法。
第二个问题:怎样才能将java层普通方法注册成JNI方法?
上面是xposed.cpp中将普通方法注册为NATIVE方法时所执行的关键一步。将method描述符中的accessFlags修改为NATIVE方法FLAG.
nativeFunc存储该方法实际调用的本地方法的执行位置(注意,考虑到跨平台的问题这里存储的可能是JNIbridge代码执行的位置,在分析xpose框架时暂不需要关注此细节,有Dalvik自行处理),将要hook的java层方法注册成本地方法,Native层方法统一的入口点设置为xposedCallHander。继续往下看。
insns存储该方法真实执行地址(没有注册成Native方法前的执行位置)。
为注册的nativeFunc方法参数列表分配的空间,与java自带方法的等大小即可。
上面两个问题都弄清楚了,下面该来具体研究一下Xposed框架具体做了什么工作。
第三个问题::Xposed框架做了什么?
Xposed修改了app_process程序,在执行第一个java程序(com.android.internal.os.ZygoteInit)之前进行截获,改变执行流程,进入到自身的main函数体内,这部分java层代码都写在了XposedBridge.jar中。执行的入口点在XposedBridge.jar包中的XposedBridge.java。main函数执行体内主要完成了下面四个部分功能,我们来逐条研究。
initNative是本地方法,完成了Xposed框架的初始化工作。
为了方便Xpsoed框架的native方法对上层java方法的调用,在该部分对相关native方法进行了初始化工作。刚才提到的native层方法xposedCallHander回调的handleHookedMethod真正实现体就放在java层。同时将invokeOriginalMethodNative注册为本地方法,初始化了hook资源文件时用到的对象等。
比较重要。
initXbridgeZygote()主要hook了几个涉及到应用进程创建、启动的关键类。新的应用进程创建时会调用这几个类的特定方法(调用其中的一种,与应用进程创建模式有关系),Xposed框架通过截获应用进程创建时的相关信息来决定对其处理逻辑(是否加载开发人员所写的hook模块,有感兴趣的应用,如微信、相机等创建时,去注册hook模块中所指定的相关方法为本地方法)。
第一处,
下面一段代码是执行自定义代码的示例,
下面这几行代码是hook了xposedInstaller(Xposed框架提供给用户的管理工具)的getActiveXposedVersion方法,如果系统中的Xposed框架没有正常启动,显示的版本号不正确。
第二处,
第三处,
这一处用于处理资源文件hook。
共有三种,常用的IXposedHookLoadPackage
Xposed框架加载完毕后执行将执行权还给com.android.internal.os.ZygoteInit,完成正常的系统启动流程。Xposed框架加载完毕,系统正常启动。
最后,简单总结一下,Xposed框架执行流程:
(不同hook模块可设置优先级,根据优先顺序来执行)
Xposed框架原理深入研究相关推荐
- Xposed框架开发入门(一)
最近在学习Android逆向的时候涉及到了Hook方面的知识,所以研究了下Xposed和Cydiasubstrate框架,虽然最后还是成功搞起了,但是一路下来感觉还是有很多不顺的,所以在学习的时候就把 ...
- Xposed框架开发入门
最近在学习Android逆向的时候涉及到了Hook方面的知识,所以研究了下Xposed和Cydiasubstrate框架,虽然最后还是成功搞起了,但是一路下来感觉还是有很多不顺的,所以在学习的时候就把 ...
- python xposed_GitHub - twqdev/CPWechatXposed: 使用Xposed Hook微信等APP
使用Xposed Hook微信等APP CPWechatXposed 是笔者折腾Xposed插件的一些记录,Xposed通过Hook应用相关的方法来为应用添加一些附加的 功能.本项目仅用于技术研究学习 ...
- 万物皆可 Hook,探究 Xposed 框架 Hook 原理
作者 |俞家欢 低头需要勇气,抬头需要实力 引言 平时用着 Android 手机,喜欢折腾的同学或多或少都接触过 Xposed 框架,解锁.Root.刷包,一气呵成.本文将从原理和实践两部分带大家了解 ...
- Android 玩机指南详细汇总(刷机、root、Xposed等)
点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 目录 Android 系统简介 Android 系统版本 Android API 等级 基 ...
- Android挂逼修炼之行---微信摇骰子和猜拳作弊器原理解析
一.前言 在之前的一篇文章中我们已经详细介绍了Android中Hook工作的一款神器Xposed工具:Xposed框架原理解析和使用案例分析 在那一篇文章中我们介绍了如何安装Xposed框架,以及如何 ...
- Android挂逼修炼之行---微信摇骰子和猜拳作弊器原理解析 (转载)
该文章是我觉得当中的逆向方式以及使用工具的方式非常值得学习,转载只为记录下来,若侵则删. 一.前言 在之前的一篇文章中我们已经详细介绍了Android中Hook工作的一款神器Xposed工具:Xpos ...
- 安卓逆向常用面试题(更新)
1.项目里静态分析和基于xposed动态工具介绍一下,如果不使用xposed,怎么实现动态分析工具? 2.安卓上的加固,脱壳技术介绍一下? 3.如何从海量app找出一个二次打包的应用呢,有几种思路?( ...
- 研究Xposed相关二:如何root android模拟器(android4.3.1)
从上一篇文章 研究Xposed相关一:Xposed框架的安装 了解了Xposed框架的安装过程,但是Xposed的使用有一个基础前提,那就是设备的Root权限已经获取的状态下:那这一篇文章就来讲述下如 ...
- 微信公众号抓取研究----使用xposed程序hook
前言: 最近在学习点安卓的知识,发现了Xposed的安卓程序,想着之前搞个微信公众号抓取的研究,所有的聊天记录都会保存在手机本地,每接收或者发送一条消息,都要通过程序代码写入到本地的数据库文件里,要想 ...
最新文章
- 经典排序算法python回顾之一 交换排序
- 转子接地保护原理_发电机转子一点接地保护的研究
- Everest 0.6 添加开机自启动程序
- Gitlab 10.1.4 (汉化版) for CentOS 7.4安装
- 深度学习笔记:利用numpy从零搭建一个神经网络
- YbtOJ-森林之和【dp】
- 【转】Java删除文件夹和文件
- Log 日志的使用与重要性
- 服务器zip解压php,服务器端解压缩zip的脚本
- text-indent的用法
- php程序设计简明教程
- (王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想、代码、演示、答题规范)
- 在新版本caffe里添加新的一层(向旧格式中加)
- mysql 复制权限不够_解决不能mysqldump备份权限不够的问题
- discuz开发经验discuz x3 怎么在帖子列表显示论坛板块图标
- [论文阅读笔记47]ZEN-BERT-based Chinese (Z) text encoder Enhanced by N-gram representations
- 图神经网络(10)- knowledge graph(知识图谱)
- 执行shellcode一直提示illegal instruction
- REUSE_ALV_GRID_DISPLAY_LVC函数输入参数属性的应用
- 栈展开(stack unwinding)在destructors中的exceptions
热门文章
- 【2022年】浙江省专升本数学全面总结-(空间解析几何与向量代数)
- 计算机定期备份用什么程序,推荐的电脑定时自动备份软件!
- 在virtual box虚拟机上下载sniffer pro
- asp 文件上传(ASPUpload组件上传)
- android toast样式 最新,Android 五种不同样式Toast
- Windows系统日志分析工具-- Log Parser
- linux中查看resin进程,resin安装
- 百度网盘提取码_百度网盘提取码查询工具,老菜建议大家收藏备用!
- 水晶易表Xcelsius 2008安装指南 支持WIN10 64位 + office2016
- 思科ccnp认证网络工程师关于NAT64协议概述一定要看