小研究 - Android 字节码动态分析分布式框架(三)

安卓平台是个多进程同时运行的系统,它还缺少合适的动态分析接口。因此,在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架,无法为实现更加灵活、通用的动态分析工具的开发提供支持。此外,很多研究只是针对单进程的分析,在安卓平台多个应用进程协作完成事务的情境下,则无法进行很好的分析。

目录

3  系统设计

3.1 系统架构

3.1.1 架构因素

3.1.2 架构设计

 3.2 基于事件的分析模型

 3.2.1 虚拟机事件

3.2.2 异步分析事件

 3.2.3 Binder 事件

3.3 支持并发的事件队列

3.4 分析与注入配置

3.5 本章小结


3  系统设计

分布式动态分析框架是如何设计的。首先,通过介绍该框架的系统架构,来介绍本系统的宏观的分布式结构以及运作的原理;然后介绍本框架基于动态程序分析的编程模型,展示了本系统基于事件驱动的语言特性。

3.1 系统架构

已有的ShadowVM框架,在其上进行了功能的拓展和语义的补充,使得它能够支持 DVM 不同的字节码架构以及安卓平台多进程的运作模型。本文的设计继承了原有研究的高覆盖率和以及高隔离性的优点,能够使得安卓平台上的动态分析开发变得更加简单,功能也更加强大;分布式的分析模型还能够提高分析的功能性并节约移动设备上分析消耗的计算资源;新增的对多进程分析以及Binder IPC 事件的支持也大大提高了分析程序对安卓特有功能的支持,使得对多个进程进行同时分析成为可能。下面会通过介绍本文框架的总体结构来说明系统的主要模块以及功能。接着,通过介绍系统的运作方式来介绍本框架的使用方法。

3.1.1 架构因素

安卓系统是一个资源十分有限的系统。尽管安卓已经利用很多方式来节约匮乏资源(如内存、处理器的使用),比如第二章提出的采用 Zygote 的共享系统库机制、采用 Ashmem 进行内存共享、采用 DVM 寄存器格式的字节码等,资源一直都是安卓平台设计的重要考虑因素。除了上述以外,移动设备的耗电量也是关系用户体验的重要标准,一个尽可能的减少安卓上的高功耗的运算也是重要的考虑点。本文框架,采取的将分析从原程序中抽离出来的方法,在安卓以外的服务器上执行,而应用程序只需要通过往分析服务发送分析关注的事件以及远程异步发送分析需要的数据即可。

3.1.2 架构设计

本文安卓进行了如下设计,图 3-1 是本文动态分析框架的架构:左边的大方框表示的是目标系统,即 Android 操作系统,右边的两个方框分别表示安卓系统以外的注入以及分析服务器。从图中可以看出,安卓采用Linux 作为操作系统。图中展示了本文关心的进程,包括:

1) 分析通信服务(Analysis Communication Service,简称 ACS)。它被用于安卓系统内进程与外部系统的通信服务,包括注入请求以及分析请求;

2) Zygote 进程。它是所有安卓应用程序的父进程,它在安卓系统启动时注入并预加载了安卓系统需要的所有 Java 类库以及 SDK 库;

3) 应用程序进程。它从 Zygote 进程 fork 产生,其程序在程序启动时被注入后加载到内存。

4) System server 进程。它是一个特殊的 DVM 实例,它实现了安卓系统的很多管理功能,比如权限控制、应用调度等。它包含了许多管理器,比如ActivityManager、PackageManager 等,用于进行用户进程的管理。

从图 3-1 可以看到,在安卓外的 JVM 上,用户可以自定义如何进行字节码注入,并在分析端定义响应应用程序的分析逻辑。此外,在安卓系统上,Zygote、System Server 以及所有应用进程都运行在修改过的 DVM 上。

 3.2 基于事件的分析模型

用户在分析中可以使用的分析事件包括异步分析分析事件、虚拟机生命周期相关的事件以及进程间通信的 Binder 事件。其中异步分析事件是用户通过注入产生的,而虚拟机以及 Binder 事件则是框架产生的。在分析中用户注入的这些分析事件是以类似远程 RPC 调用的方法传送到服务器端,而对系统产生的事件来说,分析需要实现相应的事件接口来“订阅”。下面就根据这三种事件来介绍本框架的分析模型。

 3.2.1 虚拟机事件

虚拟机事件,包括虚拟机的开始、结束,对象的分配、释放,线程的创建、释放等虚拟机内部的事件,一些程序分析可能会需要这些事件来分析一些虚拟机的行为,比如垃圾回收(Garbage Collection,简称 GC)等。DVM 上这些事件并没有被提取出来提供给分析使用。为此,本文通过修改 Dalvik 虚拟机,人工的加入了一些挂钩函数,并针对分析的需要,利用这些挂钩函数,成功的把事件通过ACS 通信服务发送给了远程的分析服务器。

这个 object tag 中包含了对象的 id(一个自增长的整型变量)以及该对象的类型对应的类对象(ClassObject)的标签。从而在分析服务器端,可以为在分析中所有出现的对象维护一个 ShadowObject 的表。

public final class Context {public int processId();public String processName();public Collection <ShadowObject> shadowObjects();public static Collection <Context> contexts();
}

框架还内置支持虚拟机的 fork 事件。前面介绍过,应用程序进程都是通过 Zygote 进程 fork 产生的。针对这个特殊的例子,本框架内置支持 onFork 事件,该事件通过修改 DVM 产生。在 DVM 发生 fork 后,两个 DVM 进程各自开始了自己的新的执行,基于 fork 之前父进程的状态。为此,在分析端也类似,每次fork 事件以后,分析端会把父进程维护的 context 进行一次拷贝,并作为子进程的context。这样在发生 fork 事件以后,在服务器端依然能够精准得维护不同虚拟机的状态。

由于安卓应用始于 fork Zygote 进程,且并不一定会有虚拟机终止事件,因此有时候需要用户通过异步分析接口自定义不同组件开始或终止事件。

interface ObjectFreeListener {void onObjectFree (ShadowObject object, Context ctx);
}
interface ThreadStartListener {void onThreadStart (ShadowThread parent,ShadowThread thread, Context ctx);
}
interface ThreadExitListener {void onThreadExit (ShadowThread thread, Context ctx);
}
interface VmStartListener {void onVmStart (Context parent, Context ctx);}interface VmExitListener {void onVmExit (Context ctx);
}
3.2.2 异步分析事件

在注入端:与一般 RPC 远程调用库类似,都是需要分为两步来进行。首先注册远程分析方法,接着在调用时候指定分析方法并发送对应的参数。下面就一个简单例子,来描述在本文框架下,用户如何定义一个分析的注入部分。

DiSLClass 是用户基于 DiSL 语言写的一个注入配置类。从DiSLClass里可以看到,用户在TargetClass.main方法体的最后注入了对AnalysisRE的 test 方法的调用。(@After 是 DiSL 用于标记方位的注解,marker 属性表明注入的基本元素是方法体,scope 则用来在注入时候匹配方法名称,更多的 DiSL 语言特性,可以参考 DiSL 官方文档)。

public class DiSLClass {@After(marker = BodyMarker.class, scope = "TargetClass.main")public static void test() {AnalysisRE.test (true, (byte) 125, 's', (short) 50000,100000, 10000000000L, 1.5F, 2.5, "Str", Object.class);}
}

AnalysisRE 是用户封装的分析类,它主要的作用是用来注册远程方法,通过调用本文框架提供给用户的 AREDispatch 工具类的 registerMethod 方法,用户可以注册一个远程服务器上的一个分析方法,registerMethod 方法的返回值是这个方法的 id,在调用远程方法时,需要利用这个 id 作为参数以区分不同的分析。

默认同一个进程内不同线程的所有事件会按照发生顺序依次发送。此外,用户定义的分析还可以自定义运行的并发性。通过在 analysisStart 时额外指定一个队列号,从而允许分析事件一定程度的“乱序”。

public class AnalysisRE {static short rpcId = AREDispatch.registerMethod("remote.Analysis.test");public static void test (boolean b, byte by, …, double d,String str, Object obj) {AREDispatch.analysisStart(rpcId);AREDispatch.sendBoolean(b);AREDispatch.sendByte(by);AREDispatch.sendChar ……AREDispatch.sendDouble(d);AREDispatch.sendObjectPlusData(str);AREDispatch.sendObject(obj);AREDispatch.analysisEnd();}
}

需要说明的是,AREDispatch 扩展自原 ShadowVM 的 REDispatch 类,里面包含了一系列用户望在注入中使用的 native 方法,为了实现系统库的全覆盖,所有的类都能访问到该类,框架会将该类注入到系统第一个加载的类库 core.jar 中。在表 3-1 中,列出了 AREDispatch 类提供主要的 API。其中一些接口是为了方便用户调试提供的辅助 API,比如 nativeLog 就是利用安卓 native 层日志系统打印日志的接口。

 3.2.3 Binder 事件

框架除了支持 DVM 虚拟机事件,还支持跨进程调用的事件。Binder 为安卓应用提供了强大的 IPC 支持,在应用程序里,用户可以使用基于 Intent 的消息、RPC 调用等构建在 Binder 上的 Java 库来完成跨进程调用。

一次完整的 Binder 调用称为一次 Binder 事务。Binder 事务分为同步和异步两种,异步的 Binder 调用会产生两个事件:客户端发送与服务器端接收。而同步调用,则包含四个事件:客户端发送、服务器接收、服务器端发送返回值、客户端接收返回值。因此框架为分析提供了四个 Binder 事件。如下图所示。

interface RequestSentListener {void onRequestSent(TransactionInfo transaction,NativeThread client, Context ctx);
}
interface RequestReceivedListener {void onRequestReceived(TransactionInfo transaction,NativeThread client, NativeThread server, Context ctx);
}
interface ResponseSentListener {void onResponseSent(TransactionInfo transaction,NativeThread server, Context ctx);
}
interface ResponseReceivedListener {void onResponseReceived(TransactionInfo transaction,NativeThread server, NativeThread client, Context ctx);
}

3.3 支持并发的事件队列

ShadowVM 支持如下的事件顺序配置:

1)全局顺序,即所有事件加入同一个事件队列,在服务器端则按照这唯一的事件队列顺序响应,这种方式是最保守的,所有事件会与 JVM 中的事件按相同顺序还原,虚拟机的事件都会放在这个全局队列中;

2)线程顺序,即分析事件只需要保证线程内有序。在 JVM 执行中,每个线程都有自己的事件队列,而分析服务器在响应这些事件的时候,会为不同的线程分配额外的线程来执行队列中的事务;

3)指定顺序,最灵活的配置方式,用户可以为分析事件指定一个序号,不同序号的事件运行在各自序号对应的队列中。

3.4 分析与注入配置

为了实现类似 DiSL 的动态注入功能,本文修改了 DVM,使得字节码加载到内存之前,会被发送到注入服务器进行注入。由于 DVM 与 JVM 的字节码格式有区别,本文利用开源的库 dex2jar 将 DVM 字节码从 DVM 格式转换成 JVM 格式,再利用 DiSL 进行注入,注入后的 JVM 字节码再由工具转换回 dex 字节码。

3.5 本章小结

通过分析架构因素,解释了这样设计的原因。其后按照分类,依次介绍本框架事件模型包含的三种事件:虚拟机事件、RPC 分析事件以及 Binder 事件。然后,介绍了这些事件是如何组织和实现并发的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五款拿来就能用的炫酷表白代码

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 五款炫酷表白代码 1、无限弹窗表白2、做我女朋友好吗&#xff0c;不同意就关机3、…

无涯教程-PHP - XML GET

XML Get已用于从xml文件获取节点值。以下示例显示了如何从xml获取数据。 Note.xml 是xml文件&#xff0c;可以通过php文件访问。 <SUBJECT><COURSE>Android</COURSE><COUNTRY>India</COUNTRY><COMPANY>LearnFk</COMPANY><PRICE…

c#设计模式-结构型模式 之 桥接模式

前言 桥接模式是一种设计模式&#xff0c;它将抽象与实现分离&#xff0c;使它们可以独立变化。这种模式涉及到一个接口作为桥梁&#xff0c;使实体类的功能独立于接口实现类。这两种类型的类可以结构化改变而互不影响。 桥接模式的主要目的是通过将实现和抽象分离&#xff0c;…

excel 核心快捷键用法

1、wps怎样只复制公示计算出来的数据 1.1、按下快捷键“CtrlC”&#xff0c;复制该单元格。 1.2、按下快捷键“ShiftCtrlV”&#xff0c;即“粘贴为数值”&#xff0c;即可只复制数字而不复制该单元格的公式 1.3、wps怎样只复制公示计算出来的数据_百度知道https://zhidao.baid…

数据结构之并查集

并查集 1. 并查集原理2. 并查集实现3. 并查集应用3.1 省份数量3.2 等式方程的可满足性 4. 并查集的优缺点及时间复杂度 1. 并查集原理 并查表原理是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0…

如何将图片应用于所有的PPT页面?

问题&#xff1a;如何快速将图片应用到所有PPT页面&#xff1f; 解答&#xff1a;有两种方法可以解决这个问题。第一种用母板。第二种用PPT背景功能。 解决有时候汇报的时候&#xff0c;ppt中背景图片修改不了以及不知道如何查找&#xff0c;今天按照逆向过程进行操作 方法1…

尚硅谷css3笔记

目录 一、新增长度单位 二、新增盒子属性 1.border-box 怪异盒模型 2.resize 调整盒子大小 3.box-shadow 盒子阴影 案例&#xff1a;鼠标悬浮盒子上时&#xff0c;盒子有一个过度的阴影效果 三、新增背景属性 1.background-origin 设置背景图的原点 2.background-clip 设置背…

【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群&#xff08;图文解说详细版&#xff09;https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…

STM32 定时器复习

12MHz晶振的机器周期是1us&#xff0c;因为单片机的一个机器周期由6个状态周期组成&#xff0c;1个机器周期6个状态周期12个时钟周期&#xff0c;因此机器周期为1us。 51单片机常用 for(){__nop(); //执行一个机器周期&#xff0c;若想循环n us&#xff0c;则循环n次。 }软件…

Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用

文章目录 1 前言2 API获取3 官方文档的调用代码4 Streamlit 网页的搭建4.1 代码及效果展示4.2 Streamlit相关知识点 5 结语 1 前言 科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2.0&#xff0c;这是一款集跨领域知识和语言理解能力于一体的新一代认知智能大模型。前日&a…

Stable Diffusion原理详解

Stable Diffusion原理详解 最近AI图像生成异常火爆&#xff0c;听说鹅厂都开始用AI图像生成做前期设定了&#xff0c;小厂更是直接用AI替代了原画师的岗位。这一张张丰富细腻、风格各异、以假乱真的AI生成图像&#xff0c;背后离不开Stable Diffusion算法。 Stable Diffusion…

java 微信小程序授权获取用户手机号码 (完整demo)

1. 前端获取动态令牌 code https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 2. 后端接收令牌code, 调用微信获取手机号接口 POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_tokenACCESS_TOKEN 3. con…

[附源码]计算机毕业设计-JAVA火车票订票管理系统-springboot-论-文-ppt

PPT论文 文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计三、功能截图总结 前言 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想…

ORB-SLAM2学习笔记7之System主类和多线程

文章目录 0 引言1 整体框架1.1 整体流程 2 System主类2.1 成员函数2.2 成员变量 3 多线程3.1 ORB-SLAM2中的多线程3.2 加锁 0 引言 ORB-SLAM2是一种基于特征的视觉SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;系统&#xff0c;它能够从单个、双目或RBG…

线性代数的学习和整理7:各种特殊矩阵(草稿-----未完成)

目录 1 单位矩阵 为什么单位矩阵I是 [1,0;0,1]T 而不是[1,1;1,1]T 2 旋转矩阵 3 伸缩矩阵 放大缩小倍数矩阵 4 镜像矩阵 5 剪切矩阵 1 矩阵 1.1 1维的矩阵 行向量列向量 1.2 2维的矩阵 一般2维表都可以看作矩阵。矩阵的每个维度可以是1个数字&#xff0c;也可以是多个…

Appium-移动端自动测试框架,如何入门?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 1、为什么要使用Appium&#xff1f; 2、如何搭建Appium工具环境?(超详细&#xff09; 3、通过demo演示Appium的使用 4、Appium如何…

通讯录的实现

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1…

深入理解分布式架构,构建高效可靠系统的关键

深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构&#xff1f;分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…

[国产MCU]-W801开发实例-GPIO输入与中断

GPIO输入与中断 文章目录 GPIO输入与中断1、硬件准备2、软件准备3、驱动实现4、驱动测试W801的GPIO支持软件配置中断,中断触发方式包含:上升沿触发、下降沿触发、高电平触发、低电平触发。本文在前面[ 国产MCU]-W801开发实例-按键与GPIO输入的基础上实现GPIO中断配置。 1、硬…

分布式 | 如何搭建 DBLE 的 JVM 指标监控系统

本篇文章采用 Docker 方式搭建 Grafana Prometheus 实现对 DBLE 的 JVM 相关指标的监控系统。 作者&#xff1a;文韵涵 爱可生 DBLE 团队开发成员&#xff0c;主要负责 DBLE 需求开发&#xff0c;故障排查和社区问题解答。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&a…