Android与Linux中从uid到用户名的映射

来源:互联网 发布:天津广电网络客服电话 编辑:程序博客网 时间:2024/05/16 15:56

整理自

Android 从uid到用户名的映射分析

理解 /etc/passwd 文件


 /etc/passwd 文件是系统的主要文件之一。该文件中包含了所有用户登录名清单;为所有用户指定了主目录;在登录时使用的 shell 程序名称等。该文件还保存了用户口令;给每个用户提供系统识别号。

/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式:name:password:uid:gid:comment:home:shell

它们的含义如下:

说明

name

用户登录名

password

用户口令。此域中的口令是加密的。当用户登录系统时,系统对输入的口令采取相同的算法,与此域中的内容进行比较。如果此域为空,表明该用户登录时不需要口令。

uid

指定用户的 UID。用户登录进系统后,系统通过该值,而不是用户名来识别用户。

gid

GID。如果系统要对相同的一群人赋予相同的权利,则使用该值。

comment

用来保存用户的真实姓名和个人细节。

home

指定用户的主目录的绝对路径。

shell

如果用户登录成功,则要执行的命令的绝对路径放在这一区域中。它可以是任何命令。



熟悉linux的系统的人都知道uid,android使用linux kernel,也有uid,但是anroid uid的概念和常见的linux系统的uid 概念不太一样。

linux文件系统中,每个文件都会保存属性信息,包括文件所有者uid,文件所在组gid,文件的可读可写可执行权限。这些信息称之为stat信息。

stat信息里只保存了uid,被没用用户名。熟悉ubuntu的朋友都知道,uid和用户名之间的对应关系保存在/etc/passwd目录下,有了uid,再去/etc/passwd文件里找,就能找到uid对应的用户名了。

好,我们进入adb 进入android手机,去找找/etc/passwd文件。Waht the f**k! 坑爹啊, 根本没有这个文件。

这个问题困扰了我很久,于是有一天,我决定看android源码来解决这个问题。

我从android原生shell命令ps入手。android的shell为toolbox,那么ps命令源码自然在toolbox项目下。源码路径为system/core/toolbox/ps.c。

ps命令主要是遍历/proc目录,找到所有数字开头的目录,数字开头的目录是对应pid的信息目录,目录的uid就是对应pid进程的创建者。ps中主要通过这些代码拿到用户名。

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. pw = getpwuid(stats.st_uid);  
  2. if(pw == 0) {  
  3.     sprintf(user,"%d",(int)stats.st_uid);  
  4. } else {  
  5.     strcpy(user,pw->pw_name);  
  6. }  
pw的结构如下

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. struct passwd {  
  2.                char   *pw_name;       /* username */  
  3.                char   *pw_passwd;     /* user password */  
  4.                uid_t   pw_uid;        /* user ID */  
  5.                gid_t   pw_gid;        /* group ID */  
  6.                char   *pw_gecos;      /* user information */  
  7.                char   *pw_dir;        /* home directory */  
  8.                char   *pw_shell;      /* shell program */  
  9.            };  

man 下getpwuid,了解到getpwuid返回uid对应的password database记录的部分信息,password database通常为/etc/passwd文件。

貌似我们又回到了原点,oh god help me。我打算getpwuid看看实现代码,看看它是如何从/etc/passwd文件中找对应的record。

我在google里输入关键字“android getpwuid” (一定要用google哦,百度是搜不到的哦),找到了getpwuid的实现源码,看到了bionic字样,这才恍然大悟。原来android没有用标准的c库,用了bionic库,标准的c库中getpwuid实现一般会到/etc/passwd文件中找uid对应的record,但是bioinc中所用的uid和用户名对应的关系都是在代码里写死的,代码文件为system/core/include/private/android_filesystem_config.h

看完代码后,有一种释然的感觉,困扰我许久的问题总算是有了答案。今后在分析android的时候,不要用传统的linux的角度去分析,尽量看android源码。

0 0
原创粉丝点击