就是模拟setuid seteuid setreuid setresuid,感觉代码比书上大段的文字好记,就写成代码形式了。

// setuid.cc: 模拟<unistd.h>中的设置用户ID的方法的作用
#include <stdio.h>
#include <errno.h> int real = 0; // 实际用户ID
int effective = 0; // 有效用户ID
int saved = 0; // 保存的设置用户ID void showid(); // 打印所有ID inline bool hasPrivilege() { return effective == 0; }
#define EINVAL_RETURN { errno = EINVAL; return -1; }
#define EPERM_RETURN { errno = EPERM; return -1; } int setuid(int uid) // 修改所有用户ID
{
if (uid < 0)
EINVAL_RETURN;
if (!hasPrivilege() && uid != real && uid != saved)
EPERM_RETURN;
if (hasPrivilege())
real = effective = saved = uid;
else
effective = uid;
return 0;
} int seteuid(int euid) // 修改有效用户ID
{
if (euid < 0)
EINVAL_RETURN;
if (!hasPrivilege() && euid != real && euid != saved)
EPERM_RETURN;
effective = euid;
return 0;
} int setreuid(int ruid, int euid) // 修改实际/有效用户ID
{
if (ruid < -1 || euid < -1)
EINVAL_RETURN;
if (!hasPrivilege())
{
if (ruid != -1 && ruid != real && ruid != effective)
EPERM_RETURN;
if (euid != -1 && euid != real && euid != effective && euid != saved)
EPERM_RETURN;
}
real = (ruid != -1) ? ruid : real;
effective = (euid != -1) ? euid : effective;
if (ruid != -1 || effective != real)
saved = effective;
return 0;
} // 非SUSv3规范, 其他UNIX实现对其也鲜有支持
int setresuid(int ruid, int euid, int suid) // 修改实际/有效/保存用户ID
{
if (ruid < -1 || euid < -1 || suid < -1)
EINVAL_RETURN;
if (!hasPrivilege())
{
if (ruid != -1 && ruid != real && ruid != effective && ruid != saved)
EPERM_RETURN;
if (euid != -1 && euid != real && euid != effective && euid != saved)
EPERM_RETURN;
if (suid != -1 && suid != real && suid != effective && suid != saved)
EPERM_RETURN;
}
real = (ruid != -1) ? ruid : real;
effective = (euid != -1) ? euid : effective;
saved = (suid != -1) ? suid : saved;
return 0;
} int main()
{
real = 1000;
// 下面4句只能执行其中1句
// setuid(2000);
setreuid(-1, 2000);
// seteuid(2000);
// setresuid(-1, 2000, 3000); showid();
return 0;
} void showid()
{
printf("实际用户ID: %4d\n", real);
printf("有效用户ID: %4d\n", effective);
printf("保存的设置用户ID: %4d\n", saved);
}

main函数是TLPI第9章习题第1道的运行结果,然后模拟了一遍功能,后面几道也很简单就能做出来了。以后忘记的话看遍代码就能很快记起来了。

模拟Linux修改实际、有效和保存设置标识的更多相关文章

  1. Windows上模拟Linux环境的软件Cygwin

    Windows上模拟Linux环境的软件Cygwin 2010-10-11 15:19      我要评论(0) 字号:T|T Cygwin是一个用于在Windows上 模拟Linux环境的软件.它可 ...

  2. 以Qemu模拟Linux,学习Linux内核

    文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/29 ...

  3. Linux - 修改系统的max open files、max user processes (附ulimit的使用方法)

    目录 1 问题说明 2 修改max open files 3 修改max user processes 4 附录: ulimit命令说明 1 问题说明 Linux 系统默认的max open file ...

  4. Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)【转载】

    Linux - 修改系统的max open files.max user processes(附ulimit的使用方法)目录 1 问题说明2 修改max open files3 修改max user ...

  5. 转: 深入理解Linux修改hostname

    from: http://www.cnblogs.com/kerrycode/p/3595724.html 写的相当详细!!! 深入理解Linux修改hostname 2014-03-12 10:17 ...

  6. linux修改主机名的方法

    linux修改主机名的方法 用hostname命令可以临时修改机器名,但机器重新启动之后就会恢复原来的值. #hostname   //查看机器名#hostname -i  //查看本机器名对应的ip ...

  7. linux修改网卡名称

    本文转载自江一<linux修改网卡名称> 终端输入:vi /etc/udev/rules.d/70-persistent-net.rules 出现以下文件 # This file was ...

  8. Linux修改系统以及pip更新源

    Linux修改系统以及pip更新源 时间:2015-08-01来源:csdn 作者:henulwj 修改系统更新源 你是否跟我一样在刚看时接触Linux时被系统更新源问题搞得晕头转向,不同的Linux ...

  9. linux修改挂载目录

    linux修改挂载目录   修改扩展磁盘默认的挂载点/home到/data   [root@localhost ~]# df -h 文件系统       容量  已用  可用 已用%% 挂载点 /de ...

随机推荐

  1. C++:创建线程初试

    1.使用CreatThread创建 #include <iostream> #include <Windows.h> using namespace std; /* 创建一个线 ...

  2. C++进阶1模板的使用

    C++进阶1模板的使用 20131010 C++中,我们自己编程虽然不会怎么使用模板,包括函数模板和类模板,但是在大型的项目开发中函数模板和类模板是非常重要的.笔者在**面试的时候忙问道过这个问题,迷 ...

  3. 平衡二叉树(AVL)的实现,附可运行C语言代码

    最近几月一直在自学C语言和数据结构,先是写了排序二叉树,觉得平衡二叉树作为一个经典数据结构,有必要实现一下. 网上看了些资料,在AVL和红黑树之间考虑,最后个人还是倾向于AVL. 不同于标准AVL的是 ...

  4. intellij 出现“Usage of API documented as @since 1.6+”的解决办法(转)

    原文链接:http://www.cnblogs.com/cxj20160928/p/5954196.html intellij 出现“Usage of API documented as @since ...

  5. java语言基础-变量

    一丶变量的基本概念 1.什么是变量 (1).内存中的一个存储区域 (2).该区域有自己的名称(变量名),和类型(数据类型) (3.)该区域的数据可以在同一类型范围内不断变化(定义变量的主要目的是因为数 ...

  6. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  7. Python中函数练习

    练习1:编写一个函数,接收一个字符串参数,返回一个元组(第一个元素为大写字母的个数,第二个元素为小写字母的个数) 解析:  练习二:编写函数,计算字符串匹配的准确率(orginStr为原始内容,use ...

  8. GreenPlum的Primary和Mirro切换恢复

    gp节点出现了acting as primary change tracking错误,判断是节点primary和mirror发生了切换 1.没有配置gp的日志,无法获取为什么切换了,待会儿看看默认日志 ...

  9. 浅析C#中ASP.NET页面的生存周期

    一般来说,页要经历下表概述的各个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 阶段 说明 页请求 页请求发生在页生命周期开始之前.用户请求页时,ASP.NET ...

  10. 缺少所需的CD/DVD驱动器设备驱动程序

    公司买了个服务器想把自带系统win10 改成windows server 2008 于是,我就用我的u盘做了个系统盘(用UltraISO或者别的,网上很多在此不在赘述) 然后改了启动项,进入到系统安装 ...