[讨论]如何挂住reboot?
发表于:2007-05-26来源:作者:点击数:
标签:
现在想不然任何用户重起机器,做在内核层,开始以为挂住reboot系统调用就可轻松实现,但一试却不行: [code:1:5c6c0300bd] asmlinkageintmy_rebootintmagic1,intmagic2,unsignedintcmd,void*arg structlogreboot_log; ifpolicy==GLOBAL_DISABLE returno_rebo
现在想不然任何用户重起机器,做在内核层,开始以为挂住reboot系统调用就可轻松实现,但一试却不行:
[code:1:5c6c0300bd]
asmlinkage int my_reboot(int magic1, int magic2, unsigned int cmd, void * arg){
struct log reboot_log;
if(policy == GLOBAL_DISABLE)
return o_reboot(magic1,magic2,cmd,arg);
return -EA
CCES;
}
[/code:1:5c6c0300bd]
这里实现一个策略,如果GLOBAL_DISABLE策略起作用那么就调用原来的reboot,其他情况就返回权限不允许。
所以我分别strace了/sbin/reboot,/sbin/shutdown,/sbin/init
几个和重起有关的命令,竟然无法跟踪到reboot调用,奇怪的很!这里我把strace的报告贴出来,大家帮我分析讨论一下,如何准确挂住reboot?
/sbin/reboot:
[code:1:5c6c0300bd]
execve("/sbin/reboot", ["reboot"], [/* 21 vars */]) = 0
uname({sys="
Linux", node="redhat73", ...}) = 0
brk(0) = 0x804adc0
...
open("/halt", O_RDWR|O_CREAT, 0644) = 4
close(4) = 0
execve("/sbin/shutdown", ["shutdown", "-r", "now"], [/* 21 vars */]) = 0
uname({sys="Linux", node="redhat73", ...}) = 0
brk(0) = 0x804c8a4
...
--- SIGCHLD (Child exited) ---
execve("/sbin/init", ["/sbin/init", "6"], [/* 21 vars */]) = 0
uname({sys="Linux", node="redhat73", ...}) = 0
brk(0) = 0x804e6b4
...
[/code:1:5c6c0300bd]
/sbin/shutdown
[code:1:5c6c0300bd]
execve("/sbin/shutdown", ["shutdown", "-r", "now"], [/* 20 vars */]) = 0
uname({sys="Linux", node="redhat73", ...}) = 0
brk(0) = 0x804c8a4
...
--- SIGCHLD (Child exited) ---
unlink("/etc/nologin") = -1 ENOENT (No such file or directory)
sync() = 0
execve("/sbin/init", ["/sbin/init", "6"], [/* 20 vars */]) = 0
uname({sys="Linux", node="redhat73", ...}) = 0
brk(0) = 0x804e6b4
...
[/code:1:5c6c0300bd]
/sbin/init:
[code:1:5c6c0300bd]
execve("/sbin/init", ["/sbin/init", "6"], [/* 20 vars */]) = 0
uname({sys="Linux", node="redhat73", ...}) = 0
brk(0) = 0x804e6b4
...
[/code:1:5c6c0300bd]
这里我省略了很多不必要的信息,大致可以看出最终都是调用/sbin/init,但还是看不出到底调用了哪个系统调用,我如何挂住reboot??
流氓无产者 回复于:2003-07-17 09:55:52
|
/sbin/shutdown,halt,reboot都是调用reboot(),所以修改reboot应该对重起有效,但是使用init改变系统级别,可能就无法控制
|
menp9999 回复于:2003-07-17 10:34:42
|
未必就是有这么个系统调用.而且我个人觉得,关机器有必要内核做什么事情么?他只不过做一系列动作而已.
譬如,init 6,只是在init 程序内部启动执行6应该做的事情而已,如杀灭一些进程,UMOUNT系统文件等等.因此我认为init根本就没有直接调用哪个系统调用,也无需要.
|
e4gle 回复于:2003-07-17 13:13:48
|
[quote:5d97048b44="流氓无产者"]/sbin/shutdown,halt,reboot都是调用reboot(),所以修改reboot应该对重起有效,但是使用init改变系统级别,可能就无法控制[/quote:5d97048b44]
我贴的strace的报告可以看出,这几个命令就没吊reboot(),而是都去执行init了
|
e4gle 回复于:2003-07-17 13:16:08
|
[quote:984956f1f1="menp9999"]未必就是有这么个系统调用.而且我个人觉得,关机器有必要内核做什么事情么?他只不过做一系列动作而已.
譬如,init 6,只是在init 程序内部启动执行6应该做的事情而已,如杀灭一些进程,UMOUNT系统文件等等.因此我认为ini..........[/quote:984956f1f1]
reboot系统调用是有的,关键是我挂住了不管用,依然可以重起,也从strace报告里也同样证明了那几个和重起相关的命令根本没有调用reboot,这样的话,要达到我的目的应该怎样简单点的实现呢?
|
yikaikai 回复于:2003-07-17 13:35:31
|
[quote:49a56f483d="e4gle"]
reboot系统调用是有的,关键是我挂住了不管用,依然可以重起,也从strace报告里也同样证明了那几个和重起相关的命令根本没有调用reboot,这样的话,要达到我的目的应该怎样简单点的实现呢?[/quote:49a56f483d]
把reboot命令和shutdown 改个名字 
|
e4gle 回复于:2003-07-17 14:24:03
|
楼上的,如果是这种方法的话,我就不用发这个贴子了,我需要的是不可绕过的挂住reboot
|
qjlemon 回复于:2003-07-17 15:12:24
|
怀疑是不是reboot只是整个重启过程中的并不关键的一步,内核只是用它来通知一些子系统“准备重启”。从reboot出来以后是不是才到了真正的重启过程?
|
menp9999 回复于:2003-07-18 07:58:30
|
能说说是怎么挂REBOOT的么?
|
e4gle 回复于:2003-07-18 14:16:45
|
[quote:eb7fadc593="menp9999"]能说说是怎么挂REBOOT的么?[/quote:eb7fadc593]
你啥意思?我都被你搞糊涂了,我现在是在问你怎么挂住reboot,我代码里是挂住了reboot()调用,但init 6好像不吊这个
|
流氓无产者 回复于:2003-07-18 14:37:06
|
启动关闭肯定是reboot()调用,只是sync,起停服务,mount和umount等活动是在reboot()调用前或者后,你说你修改reboot()后不生效,哦想是看到依然在关闭服务,umount文件系统,这对呀,因为还没有到reboot()调用,至于init,也依然是调用reboot(),你可以参见sysvinit的源包
|
e4gle 回复于:2003-07-18 15:20:35
|
嗯,看来只有替换init程序了,从内核是无法做了
|
qjlemon 回复于:2003-07-18 15:35:57
|
内核也还是要做吧?如果编个程序直接调reboot的系统调用呢?
|
紫枫猪猪 回复于:2003-07-25 14:11:42
|
斑竹。你是不是在搞什么黑客工具啊????
|
原文转自:http://www.ltesting.net
|