Android5.1.1源码 - zygote fork出的子进程如何权限降级

Android内存防护深度解析:BlackDex与VmCore的攻防对抗 在移动安全领域,内存防护是Android应用安全的核心机制之一。其原理基于Linux进程隔离和Android沙箱模型,通过权限控制和运行时检测来保护应用内存不被非法访问。这项技术的价值在于保护核心算法、用户数据和知识产权免受逆向工程与恶意篡改,广泛应用于金融支付、游戏反作弊和版权保护等场景。本文聚焦于BlackDex工具及其VmCore组件,深入探讨其如何利用ART虚拟机内部机制实现内存转储,涉及热词如内存dump和反调试技术,揭示了在对抗高度加固应用时的技术实现路径。 阅读详情

前言

​如果不知道zygote是什么,或者好奇zygote如何启动,可以去看老罗的文章: 

Android系统进程Zygote启动过程的源代码分析


所有Android应用进程都是zygote fork出来的,新fork出来的应用进程还保持着root权限,这显然是不被允许的,所以这个fork出来的子进程的权限需要被降级,本文说的就是Android源码在什么地方执行了权限降级的操作。


执行路径


下面的runSelectLoop方法是类ZygoteInit的成员方法,它在文件”frameworks/base/core/java/com/android/internal/os/ZygoteInit.java”中,下面是它的源码:



zygote会在这个方法中等待客户端通知启动一个新的应用程序,详情可以看前言部分列出的文章。现在我们关心的是done = peers.get(index).runOnce();语句,这个语句调用了runOnce方法启动了一个新的应用进程,runOnce方法是ZygoteConnection类的成员方法,下文从runOnce方法开始分析。


ZygoteConnection.runOnce方法在文件”frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java”中,下面是它的源码:



parsedArgs中保存了要启动的应用的信息,它的类型是Arguments,Arguments是ZygoteConnection的内部类。

runOnce方法中调用了Zygote.forkAndSpecialize方法,这个方法在文件”frameworks/base/core/java/com/android/internal/os/Zygote.java”中,下面是它的源码:



在这个方法中调用了nativeForkAndSpecialize方法。

nativeForkAndSpecialize是一个native方法,在native代码中它的函数名是com_android_internal_os_Zygote_nativeForkAndSpecialize,这个函数在文件”frameworks/base/core/jni/com_android_internal_os_Zygote.cpp”中,下面是它的源码:



在这个函数中调用了ForkAndSpecializeCommon函数。


子进程权限降级函数


ForkAndSpecializeCommon函数在文件”frameworks/base/core/jni/com_android_internal_os_Zygote.cpp”中,在这个函数中调用了fork函数,并且fork出的子进程将自身权限降级,下面是它的源码:



在这个函数中子进程分别调用了SetGids、SetRLimits、setresgid、setresuid,设置了组ID和用户ID将自身权限降级。


作者:寻禹@阿里移动安全,更多安全技术博客,请点击阿里聚安全博客


【Android FrameWork】Zygote Zygote做为一个孵化器,会提前加载一些系统资源、创建Java虚拟机、注册JNI等等,这样子进程就可以直接使用,避免重复加载。比如Zygote中的JNI函数、主题资源等等。 阅读详情

相关推荐

揭秘Android启动机制:Zygote如何优化内存

如果每个 App 启动都要重新加载 Android 框架(如几千个类、系统图标等),手机内存会迅速爆满。理解 Android 应用的启动和资源共享,本质上是在理解 Linux 的底层机制如何被 Google “魔改”以适应移动端的内存限制。在 Linux 系统中,UID 通常代表一个“用户”;Zygote 进程启动时,会预先加载几千个 Java 类(如。这是 Linux 内核的一项神技。你可以把 Zygote 理解为一个“内存镜像仓库”。Fork 出来的一定是进程。“受精卵(Zygote)”

新时代农民工 47

对Android系统权限的认识

Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制 Android系统权限相关的内容 (一)linux文件系统上的权限 -rwxr-x--x system system 4156 2012-06-30 16:12 test.apk. 代表的是相应的用户/用户组及其他人对此文件的访问权限,与此文件运行起来具有的...

weixin_34104341的博客 512

【AI】使用Cursor和AI编程生成的VUE前端框架

本项目是一个基于VUE.js的前端框架,结合了登录、图形验证码、权限校验等常用功能模块。通过与Cursor AI交互生成的代码,展示了AI在编程中的潜力与效率。

清欢渡的博客 9862

Android系统的心脏-Zygote进程如何fork一个新的应用进程

在Android系统中,所有的应用程序进程都是有Zygote进程创建的。那么,到底是如何创建出来的呢?本节来分析一下这个创建流程。

记录和分享程序人生的点点滴滴 2414

Vivado静态时序分析学习笔记(1)

静态时序分析分为片内时序分析(寄存器与寄存器之间的时序关系)和片外时序分析(IO时序分析)。(1)建立时间 setup time在时钟事件(上升沿/下降沿)发生之前数据信号应保持稳定的时间。把实际电路抽象成前级D触发器+组合逻辑+后级D触发器。

Fantaasky的博客 4377

Tecplot进阶:巧用公式与多Frame对比,实现CFD多工况数据差异的可视化分析

本文详细介绍了如何利用Tecplot进行CFD多工况数据差异的可视化分析,通过公式计算和多Frame对比,实现变量差值自动计算、多视图同步展示和差异量化统计。文章还提供了数据准备、基础操作、实战技巧和常见问题解决方案,帮助工程师高效完成CFD后处理工作。

weixin_29227425的博客 530

Android Framework 常见解决方案(23)三方应用APP启动绑核setAffinity设置

一般来说这个需求主要是为了应用启动时设定绑核相关操作,但是如果没有三方应用的源码想要让其绑定再其他核心上就要修改framework源码了。framework源码修改的原理是:在zygote创建应用子进程(Fork操作)时做白名单处理,针对不同的应用APP进程进行可以有不同的绑核策略。关于Zygote的初始化以及创建APP进程的流程这里就不多说了,最终创建进程回调用到这里:com_android_internal_os_Zygote.cpp中的。

wangdsh的博客 1250

集成学习综述—bagging/随机森林/adaboost/GBDT/XGBoost/LightGBM/catboost 原理和代码介绍

集成学习介绍 文章目录集成学习介绍1 基本概念1.1 定义基本定义集成学习类别参考链接1.2 基学习器(CART)介绍公式介绍例子讲解代码实践参考链接1.3 偏差(bias)和方差(var)公式推导图解参考链接2 Boosting类2.1 原理2.2 AdaBoost2.2.2 公式推导2.2.3 优点与不足优点不足应用2.2.4 代码实践2.2.5 参考链接2.3 GBDT原理介绍代码实践参考...

fzl的博客 4619

Android FrameWork(二)SystemServer(上)

上次在写init和zygote的时候,说起过,SystemServer是Android系统的系统服务模块,主要功能是管理Android的system service。system_server进程是zygote进程通过fork方法创造出来的第一个子进程,而且当system_server进程启动失败时会导致zygote进程自杀重启。今天,看一下SystemServer的启动过程。 一.Zy...

zhaojun的博客 2万+

腾讯WeKnora开源了!手把手教你用Docker+Ollama本地部署多模态知识库(附避坑指南)

本文详细介绍了腾讯开源的多模态知识库工具WeKnora的本地部署方法,通过Docker和Ollama实现完全离线运行。文章包含环境准备、核心组件配置、Ollama模型集成、系统启动验证及高级性能调优等实战内容,特别适合需要构建私有化知识库的中小团队和个人开发者。

weixin_30664051的博客 479

基于DNN神经网络的多输入多输出数据回归预测(附带Matlab代码)

假设我们的输入数据包含n个特征,输出数据包含m个特征。在本文中,我们将介绍如何使用DNN(深度神经网络)实现多输入多输出数据回归预测,并提供相应的Matlab代码。需要注意的是,上述代码中的DNN模型是一个简化的示例,您可以根据实际任务的复杂程度和要求进行相应的调整和优化。综上所述,我们介绍了如何使用DNN神经网络实现多输入多输出数据回归预测,并提供了相应的Matlab代码。函数对DNN模型进行训练,其中输入数据需要转置,以适应网络的输入要求。最后,我们使用训练好的模型对测试数据进行预测,并打印预测结果。

DevWizard的博客 1068

Java权限降级_Android5.1.1源码 - zygote fork出的子进程如何权限降级

前言如果不知道zygote是什么,或者好奇zygote如何启动,可以去看老罗的文章:Android系统进程Zygote启动过程的源代码分析所有Android应用进程都是zygote fork出来的,新fork出来的应用进程还保持着root权限,这显然是不被允许的,所以这个fork出来的子进程的权限需要被降级,本文说的就是Android源码在什么地方执行了权限降级的操作。执行路径下面的runSele...

weixin_35964787的博客 317

21、深入了解SELinux安全系统与/proc文件系统

本文深入探讨了SELinux安全系统与/proc文件系统的原理及实际应用。详细介绍了SELinux的安全上下文、域转换、运行模式、角色管理以及策略查看工具seinfo的使用;同时解析了/proc文件系统的结构与功能,涵盖进程信息查看、系统资源监控及性能优化方法。结合SELinux与/proc的协同应用,提供了系统问题排查流程与安全管理最佳实践,帮助用户提升Linux系统的安全性与稳定性。

ik678901234的博客 62

STM32F767与DRV8818步进电机驱动控制:从选型到现场调试的完整实践

步进电机作为工业运动控制的核心执行元件,其驱动电路的设计直接影响设备的定位精度与运行稳定性。在现代自动化设备中,微步驱动技术与脉冲控制策略是解决低速平稳性和高速响应矛盾的关键。集成双H桥驱动器配合高性能主控芯片,可大幅简化硬件设计,同时提升系统的抗干扰能力与可靠性。此类方案广泛应用于机器人、自动装配及多轴运动控制场景,尤其适合对成本和可维护性有要求的工业现场。本文以TI DRV8818PWPR驱动器和STM32F767BI主控为例,深入拆解从电源设计、微步细分配置到软件加减速算法、故障保护机制的实施要点,并

weixin_33912638的博客 331

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[实践] Android5.1.1源码 - 让某个APP以解释执行模式运行

本文简单讲解让某个APP以解释执行模式运行原理,在“实践”一节讲了具体做法。

AliMobileSecurity的博客 1175

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓启动流程与期间核心组件工作原理

本文以实际工作中出现的启动相关各种千奇百怪的bug为钩子,讲解了安卓app冷启动过程中核心组件的工作原理,pms -> packageParser/androidmanifest.xml -> context -> ams -> application -> activity -> layoutInflater资源加载过程 -> wms /window/WM -> view与viewgroup绘制原理 -> 渲染阶段。理供解决问题的思路,看业务框架代码能看懂他们改的哪块源码,跟他们扯皮能扯赢

mix39的博客 337

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Service Options init.rc文件 init进程的功能 Zygote进程 main AndroidRuntime::start AndroidRuntime::startVm AndroidRuntime::sta

美丽心情 1210

Android 系统开发_启动阶段篇 -- 深入钻研 SystemServer

前言 SystemServer进程是zygote进程启动后,主动“分裂”的第一个进程。它负责启动大量的Android系统核心服务,其重要性不言而喻。一旦该进程崩溃,整个Android系统将重新启动。 开篇 核心源码 关键类 路径 com_android_internal_os_Zygote.cpp frameworks/base...

weixin_34260991的博客 258

如何打开疯狂的android讲义源码_【Smith】Riru框架源码阅读

终于更换了一个封面阅读本文,切勿错过《【Smith】Riru框架原理介绍》。阅读本文,切勿错过《【Smith】Riru框架原理介绍》。阅读本文,切勿错过《【Smith】Riru框架原理介绍》。通过上一篇文章介绍,我们已经知道,Riru是一个Android注入框架。本篇我们来仔细其源码,以便了解其具体做了哪些事情。Riru源码地址:https://github.com/RikkaApps/...

weixin_39684960的博客 998

Android学习 - Android权限机制总结与常见权限不足问题分析

Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制,很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下面是我总结的Android系统权限相关的内容,作为这段时间对android权限学习的总结,也希望能对大家有所帮助,不正确之处请指出。 首先分清两个概念: 要区分apk运行时的拥有的权限与在文件系统上

wolflz的专栏 718

Android系统篇之----Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)...

一、前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的。那么咋们今天闲来说说Android中...

chupu2979的博客 252

Framework篇 - SystemServer 进程详解

本文源代码基于 Android 7.0。 SystemServer 由 Zygote fork 生成,进程名为 system_server,该进程承载着 Framework 的核心服务。关于 Zygote 的启动流程,到 SystemServer 的启动入口,可以参考这篇文章:Framework篇 - zygote 进程分析 目录: SystemServer 进程创建流程 S...

u014294681的博客 1413
上一篇: 编译可在Android上运行的依赖库:glib库
下一篇: Linux堆内存管理深入分析(上)
阿里安全
博客等级 码龄11年 260粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值