浅谈su临时切换用户的实现方法
最近开发Android app需要用到root权限去调用一些shell程序,接触过Linux的同学知道用su这个命令,su的意思是switch user,切换用户。然而在我调用su的时候,授权管理器总会弹出确认提示,更操蛋的是我手机安装的授权管理器即使设置了自动授权所有请求都不起作用!火了!干脆自己找su源码去改写个来用。
搜索了一下,发现superuser的su源码:
int main(int argc, char **argv){ int uid = 0; int gid = 0; if(setgid(gid) || setuid(uid)) { printf("permission denied!"); return 1; } char *exec_args[argc + 1]; exec_args[argc] = NULL; exec_args[0] = "sh"; int i; for (i = 1; i < argc; i++) { exec_args[i] = argv[i]; } execv("/system/bin/sh", exec_args); return 1;}就这样就OK?!不行呢~编译出来的su程序setuid()一直不成功呢~PS:代码是绝对可行的呀!
好吧,点睛之笔来了!
原来要想调用setuid()是需要root权限的,但是我根本没有root权限又如何调用这个呀?很矛盾。
还漏了设置su文件的权限哦!
先感叹下,Linux的权限控制确实是复杂哦!
chmod 755 su
悲剧,还不行。
其实,Linux的文件权限还有组特殊权限的,要我的su能正常运行必须要设置两个特殊权限!这两权限的名称就叫setuid、setgid!
setuid权限就是让程序进程在特殊情况下可以使用该文件所有者的权限!我表达的有点别扭!
就是我su程序运行之后,
我想调用setuid(),
但是进程现在不是root用户的,
那么看看有没设置特殊权限setuid?
哎哟,有哦!
那么su文件的所有者是谁?
是root哦!
系统说:OK,你被批准了!
哦耶,setuid()设置成功!(setgid()同理)
setuid()和setgid()执行成功了!我们的进程就正式切换成root的了哦!调用execv()去创建我们新的sh进程!拿着root权限各种为所欲为!!!
文笔不好,关于文件特殊权限写得好像云里雾里的感觉!抛出参考文献吧!
点击打开链接 关于Linux特殊权限的一些知识。
- 1楼coast123昨天 14:52
- 请教下博主。superuser的源码用什么编译?编译后如何替换原有的SU?