免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4659 | 回复: 13
打印 上一主题 下一主题

[讨论]如何挂住reboot? [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-16 22:24 |只看该作者 |倒序浏览
现在想不然任何用户重起机器,做在内核层,开始以为挂住reboot系统调用就可轻松实现,但一试却不行:

  1. asmlinkage int my_reboot(int magic1, int magic2, unsigned int cmd, void * arg){
  2.         struct log reboot_log;

  3.         if(policy == GLOBAL_DISABLE)
  4.                 return o_reboot(magic1,magic2,cmd,arg);
  5.         return -EACCES;
  6. }
复制代码

这里实现一个策略,如果GLOBAL_DISABLE策略起作用那么就调用原来的reboot,其他情况就返回权限不允许。

所以我分别strace了/sbin/reboot,/sbin/shutdown,/sbin/init
几个和重起有关的命令,竟然无法跟踪到reboot调用,奇怪的很!这里我把strace的报告贴出来,大家帮我分析讨论一下,如何准确挂住reboot?

/sbin/reboot:

  1. execve("/sbin/reboot", ["reboot"], [/* 21 vars */]) = 0
  2. uname({sys="Linux", node="redhat73", ...}) = 0
  3. brk(0)                                  = 0x804adc0
  4. ...
  5. open("/halt", O_RDWR|O_CREAT, 0644)     = 4
  6. close(4)                                = 0
  7. execve("/sbin/shutdown", ["shutdown", "-r", "now"], [/* 21 vars */]) = 0
  8. uname({sys="Linux", node="redhat73", ...}) = 0
  9. brk(0)                                  = 0x804c8a4
  10. ...
  11. --- SIGCHLD (Child exited) ---
  12. execve("/sbin/init", ["/sbin/init", "6"], [/* 21 vars */]) = 0
  13. uname({sys="Linux", node="redhat73", ...}) = 0
  14. brk(0)                                  = 0x804e6b4
  15. ...
复制代码


/sbin/shutdown

  1. execve("/sbin/shutdown", ["shutdown", "-r", "now"], [/* 20 vars */]) = 0
  2. uname({sys="Linux", node="redhat73", ...}) = 0
  3. brk(0)                                  = 0x804c8a4
  4. ...
  5. --- SIGCHLD (Child exited) ---
  6. unlink("/etc/nologin")                  = -1 ENOENT (No such file or directory)
  7. sync()                                  = 0
  8. execve("/sbin/init", ["/sbin/init", "6"], [/* 20 vars */]) = 0
  9. uname({sys="Linux", node="redhat73", ...}) = 0
  10. brk(0)                                  = 0x804e6b4
  11. ...
复制代码


/sbin/init:

  1. execve("/sbin/init", ["/sbin/init", "6"], [/* 20 vars */]) = 0
  2. uname({sys="Linux", node="redhat73", ...}) = 0
  3. brk(0)                                  = 0x804e6b4
  4. ...
复制代码

这里我省略了很多不必要的信息,大致可以看出最终都是调用/sbin/init,但还是看不出到底调用了哪个系统调用,我如何挂住reboot??

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
2 [报告]
发表于 2003-07-17 09:55 |只看该作者

[讨论]如何挂住reboot?

/sbin/shutdown,halt,reboot都是调用reboot(),所以修改reboot应该对重起有效,但是使用init改变系统级别,可能就无法控制

论坛徽章:
0
3 [报告]
发表于 2003-07-17 10:34 |只看该作者

[讨论]如何挂住reboot?

未必就是有这么个系统调用.而且我个人觉得,关机器有必要内核做什么事情么?他只不过做一系列动作而已.
譬如,init 6,只是在init 程序内部启动执行6应该做的事情而已,如杀灭一些进程,UMOUNT系统文件等等.因此我认为init根本就没有直接调用哪个系统调用,也无需要.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-07-17 13:13 |只看该作者

[讨论]如何挂住reboot?

[quote]原帖由 "流氓无产者"]/sbin/shutdown,halt,reboot都是调用reboot(),所以修改reboot应该对重起有效,但是使用init改变系统级别,可能就无法控制[/quote 发表:
     

我贴的strace的报告可以看出,这几个命令就没吊reboot(),而是都去执行init了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-07-17 13:16 |只看该作者

[讨论]如何挂住reboot?

原帖由 "menp9999" 发表:
未必就是有这么个系统调用.而且我个人觉得,关机器有必要内核做什么事情么?他只不过做一系列动作而已.
譬如,init 6,只是在init 程序内部启动执行6应该做的事情而已,如杀灭一些进程,UMOUNT系统文件等等.因此我认为ini..........
   

reboot系统调用是有的,关键是我挂住了不管用,依然可以重起,也从strace报告里也同样证明了那几个和重起相关的命令根本没有调用reboot,这样的话,要达到我的目的应该怎样简单点的实现呢?

论坛徽章:
0
6 [报告]
发表于 2003-07-17 13:35 |只看该作者

[讨论]如何挂住reboot?

原帖由 "e4gle" 发表:
   

reboot系统调用是有的,关键是我挂住了不管用,依然可以重起,也从strace报告里也同样证明了那几个和重起相关的命令根本没有调用reboot,这样的话,要达到我的目的应该怎样简单点的实现呢?
   

把reboot命令和shutdown 改个名字

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-07-17 14:24 |只看该作者

[讨论]如何挂住reboot?

楼上的,如果是这种方法的话,我就不用发这个贴子了,我需要的是不可绕过的挂住reboot

论坛徽章:
0
8 [报告]
发表于 2003-07-17 15:12 |只看该作者

[讨论]如何挂住reboot?

怀疑是不是reboot只是整个重启过程中的并不关键的一步,内核只是用它来通知一些子系统“准备重启”。从reboot出来以后是不是才到了真正的重启过程?

论坛徽章:
0
9 [报告]
发表于 2003-07-18 07:58 |只看该作者

[讨论]如何挂住reboot?

能说说是怎么挂REBOOT的么?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2003-07-18 14:16 |只看该作者

[讨论]如何挂住reboot?

[quote]原帖由 "menp9999"]能说说是怎么挂REBOOT的么?[/quote 发表:
   
你啥意思?我都被你搞糊涂了,我现在是在问你怎么挂住reboot,我代码里是挂住了reboot()调用,但init 6好像不吊这个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP