android IPC通信中的UID和PID识别

AndroidIPC通信中的UIDPID识别 PCThreadState对象维护了2个变量             pid_t               mCallingPid;             uid_t               mCallingUid;     从变量名称来看,这2个变量保存了进程的PIDUID,并且由于这两个变量由IPCThreadState对象维护,可见它们是与IPC相关的。具体它们保 阅读详情
 android IPC通信中的UID和PID识别

    IPCThreadState对象维护了2个变量

            pid_t               mCallingPid;

            uid_t               mCallingUid;

    从变量名称来看,这2个变量保存了进程的PID和UID,并且由于这两个变量由IPCThreadState对象维护,可见它们是与IPC相关的。具体它们保存的是IPC发送方的PID和UID还是当前进程的IPD和UID,视情况而定。

    在IPC调用过程中,被调用方需要知道调用方的UID和PID,以便被调用方用于权限检测;所以需要一种方式来提供调用方的UID和PID,因此上述2个变量的主要作用就是用于权限检测。

    那么我们想象一下,下面描述的情况下,mCallingPid和mCallingUid又应该保存谁的UID和PID?假如有2个进程process A和process B,我们站在process B的角度来分析,process A IPC调用process B, 而process B 又调用同样处于process B的Service的接口(尽管此时实际上不是远程调用,并且开发者是知道的,但是对于Binder调用机制来说,它本身并不知道当前的调用是否为远程调用,前几篇文章中有分析系统如何确定是否为远程调用,这个过程是在binder driver中实现的),那么此时mCallingPid和mCallingUid是不是应该保存process B的UID和PID?

1.       process B在被process A IPC调用时, process B需知道process A的UID和PID,来检查process A的访问权限,此时mCallingUid和mCallingPid保存的是process A的UID和PID。

2.       在IPC远程调用process B的过程中,process B的方法调用了同进程中的service的接口,process B既是调用方也是被调用方,虽然这个过程比较无聊,但是鉴于IPC过程的不透明性,因此process B仍然需要进行权限检测。

 

    前面的文章中分析过,binder driver会判断当前的Binder调用是否为远程调用,如果是同进程调用的话,BD就不会再向应用提供进程的PID和UID。因此在process B中需要显示的设置当前的PID和UID。

    为实现以上case, android提供了一组函数

    public static final native long clearCallingIdentity();

    public static final native void restoreCallingIdentity(long token);

    process B的方法调用了同进程中的service的接口前,clearCallingIdentity()方法会清除process A的UID和PID,重置为process B的UID和PID。

    process B的方法调用了同进程中的service的接口后,此时仍然处在process A远程调用process B方法的过程中,此时需要restore  process A的UID和PID。

    本文描述的case,虽然在application 开发中并不常见,但是在system_server中很常见,比如client调用ActivityManagerService的方法,而ActivityManagerService又调用了PackageManagerService的方法,并且ActivityManagerService和PackageManagerService均会运行在system_server进程中。

2024年数字IC秋招-睿思芯科-IC验证工程师-笔试题 公司介绍:初创公司,做risc-v,公司位于深圳笔试题型:基础题(10个) + 选做题(5个)笔试平台:showmebug(电脑监控)笔试时间:1h个人感受:每年rsxk的题目好像是一样的,起码今年去年的题目是相同的,但是做完笔试题目就没有消息了。 阅读详情

相关推荐

SDR DDR 的区别

SDR DDR 的差别,最明显提现在传输速率频率上。DDR SDRAM与SDRAM的基本结构是相似的,最根本的区别在于DDR 支持在一个时钟周期内传输两次数据,,SDR 只能传输一次数据。

串起点滴 1920

Android源码的Binder权限控制

链接:https://www.zhihu.com/question/41003297/answer/89328987 一、源码分析 (1)clearCallingIdentity方法,最终调用如下: int64_t IPCThreadState::clearCallingIdentity() { int64_t token = ((int64_t)mCallingUid<

Liu的博客 1万+

Binder.clearCallingIdentity分析

Binder.clearCallingIdentity()Binder.restoreCallingIdentity()这两个方法,它的主要作用是暂时获得系统权限。为什么需要系统权限呢?

Android Binder权限检查之clearCallingIdentity

转自:https://www.zhihu.com/question/41003297 参考: https://blog.csdn.net/thinkinwm/article/details/18311211 https://blog.csdn.net/windskier/article/details/6921672//博主博客也很优秀 作者:Gityuan 链接:https://www.zhihu.com/question/41003297/answer/89328987 来源:知乎 ...

chuyouyinghe的专栏 1022

clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解

hi,粉丝朋友大家好:今天带大家来学习一个系统开发过程中大家即“熟悉”又陌生的两个方法,分别是clearCallingIdentityrestoreCallingIdentity,一般他们是成对出现在我们的framework代码中,但大家平时分析源码时候好像并没有在意他的真正作用是什么?为啥在框架代码分析时候可以看到他的大量出现?

liaosongmao1的专栏 802

android IPC通信中的UIDPID识别(远程调用/本地调用)

http://www.2cto.com/kf/201110/109648.html

brucexu1978的专栏 735

Binder IPC的权限控制

PS:个人理解:当进程1通过Binder调用组件2时,会将进程1的piduid赋给组件2,并检测进程1的piduid是否有权限调用组件2.而后组件2需要调用组件3,此时组件2保存的piduid为进程1的,但是其实际运行在进程2中。此时调用clearCallingIdentity将组件2的保存的piduid转换为进程2的piduid并return原来保存的进程1的piduid的t...

weixin_34377065的博客 316

Android源码的Binder权限是如何控制的?

token中解析出PIDUID,并赋值给相应的变量。该方法正好是clearCallingIdentity的反过程。到此,应该明白了从代码角度是如何实现的。上述过程主要在system_server进程的各个线程中比较常见(普通的app应用很少出现),比如system_server进程中的ActivityManagerService子线程,代码如下:@Override//获取远程Binder调用端的pid

2401_84149845的博客 1348

clearCallingIdentityrestoreCallingIdentity

IPC时,有些情况需要调用clearCallingIdentityrestoreCallingIdentity,原因在于: 假如有A进程B进程,A调用B,B需要知道A的UIDPID,用于权限检测,于是B就保存了A的UIDPID,当此时B调用本身的方法时,binder驱动会检测B调用的是远成进程还是本地进程,如果是本地进程就不会传UIDPID,但此时B保存的仍然是A的UIDPID,所...

xiangkezhu的博客 1001

Android中bindService的细节之三:多次调用bindService(),为什么onBind()只执行一次?

情况一: App A绑定App B的service,App A多次调用bindService(),而不调用unbindService(),此时App B的service的onBind()只执行一次 情况二: App A,App C绑定App B的service,App AApp C各调用一次或多次bindService(),而不调用unbindService(),此时App B的service...

weixin_41205419的博客 4571

smt植板机源码包括机器人流程框架、多任务流程、C#源码框架机器视觉源码框架的集成,适用于自动化生产机器视觉任务 集成相机SDK运动控制卡,提供灵活的硬件支持

视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入输出,有C#基础Halcon基础学习这个很好,是框架源码,可根据自己的理解改成自己想要的,目前该框架集成了halcon、海康威视、大恒、AVT等操作相机的sdk,运动控制卡 集成了雷塞Dmc1000b雷塞ioc0640等 本人的编译环境是visiual studio 2022企业版,halcon版本是20.11 steady版本登录密码 默认 都为admin

上一篇: Android锁Wake Lock
下一篇: Android RefBase类(sp,wp)
kobbee9
博客等级 码龄16年 26粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值