Android与Linux中从uid到用户名的映射
2015-12-06 15:18
471 查看
整理自
Android 从uid到用户名的映射分析
理解 /etc/passwd 文件
/etc/passwd 文件是系统的主要文件之一。该文件中包含了所有用户登录名清单;为所有用户指定了主目录;在登录时使用的 shell 程序名称等。该文件还保存了用户口令;给每个用户提供系统识别号。
/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式:name:password:uid: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
pw = getpwuid(stats.st_uid);
if(pw == 0) {
sprintf(user,"%d",(int)stats.st_uid);
} else {
strcpy(user,pw->pw_name);
}
pw的结构如下
[html] view
plaincopy
struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
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源码。
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,文件所在组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
pw = getpwuid(stats.st_uid);
if(pw == 0) {
sprintf(user,"%d",(int)stats.st_uid);
} else {
strcpy(user,pw->pw_name);
}
pw的结构如下
[html] view
plaincopy
struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
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源码。
相关文章推荐
- [Linux基础环境/软件]Linux下安装mysql
- Linux autojump命令
- linux下安装vsftp
- Linux命令-压缩解压命令
- centos配置nfs服务详细步骤(centos开启nfs服务)
- linux 信号设计 --不断补充--欢迎指正讨论
- 深入理解linux i节点
- Linux命令-权限设置
- 从linux和ucos的比较中来看进程这个概念
- linux ip 命令
- linux文件系统初学
- linux内存管理初学
- linux初学习之正则表达式和通配符
- 【Unix/Linux编程实践】从零做起:编写who命令
- Linux-4.3在mini6410上的移植
- linux下elf重定位理解
- Linux下C语言编程
- centos7没有安装ifconfig命令的解决方法
- 基于mini2440的裸机led程序及其链接脚本分析
- centos安装caffe python接口时候可能出现错误