网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
09月07日
漏签
0
天
c4droid吧
关注:
42,881
贴子:
262,775
看贴
图片
吧主推荐
游戏
4
回复贴,共
1
页
<<返回c4droid吧
>0< 加载中...
求助各位大神
只看楼主
收藏
回复
杨文485
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
由于我的手机是vivo x7plus 。现在已经root。。但vivo内核限制了只有root用户才能启动su。。,其他用户无权限运行。所以需要授权的软件无法授权。现在将su改名能正常切换到root用户。。。我的理解是既然我其他方式切换到root。。能不能用root将需要启动的程序直接以root用户运行,这样就能直接启动su而不会被内核拦截。正好我在网上看到了用c4自动运行root的程序。。本人是c小白。那个代码编译会出错。不知道什么原因。。所以咨询下各位大神我的想法是否能够实现。
杨文485
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
杨文485
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
/*Lib#su_run 自动以超级用户SU执行main函数
*来自百度C4droid吧
*HC TECH 2015
*如无特殊情况请不要使用本函数库
*/
#pragma message "Warning" /*如无特殊需要请不要包含本头文件*/
/* C4droid 导出获取root权限 */
/* 仅需要包含次头文件即可 */
/* 此头文件会替换main(...) 为 main(int argc ,char **argv) */
/* 需要将main返回值设置为整形(int) */
/* 包含较多注解以便新手理解 大神可以略过 */
/* 代码略渣 */
/* by 扛AK逛银行 */
#include <unistd.h>
/* 需要函数 execl() getuid() setuid() */
#include <stdio.h>
/* 标准输出输入 不解释 */
#include <stdlib.h>
/* 需要函数 setenv() getenv() */
#include <string.h>
/* 需要函数 strchr() strtok() strcat() strcpy() */
#include <limits.h>
/* 获取一些宏 PATH_MAX ARG_MAX */
#ifdef __cplusplus
extern "C" {
#endif
/* C++扩展C语言标志 */
/*
思路
首先建立一个真实的入口函数(main)
然后用宏替换原入口(main=>main_root)
最后完成root获取后调用替换后入口(main_root)
*/
int main_root(int argc ,char **argv);
/* 替换函数名原型*/
/* 真实入口(main) */
int main(int argc ,char **argv)
{
char *p;
/* PATH_MAX 的值是可支持的 '目录的最大字节数' */
/* ARG_MAX 的值是可支持的 'execl的参数的最大字节数' */
char su[PATH_MAX] ,buf[ARG_MAX];
int i;
/* getuid() 用于获取当前用户ID */
/* setuid() 用于尝试修改用户ID */
/* root的用户ID为0 */
if ( getuid() == 0 || setuid(0) == 0 )
{
/* 如果ID为0 或成功设置ID为0则执行 */
/* 调用原main */
return main_root(argc ,argv);
}
/* 为了防止死循环的可能 获取环境变量"already_executable_su" */
p = getenv("already_executable_su");
if ( p != NULL && strchr(p ,'1') != 0 )
{
/* 如果不存在变量或值不为1时执行 */
fprintf(stderr ,"Cannot run as root");
return 1;
}
/* strtok() 为分割字符串 */
/* 接受两个参数 一个指向字符串的指针 和 一个分割符合集(字符串) */
/* 在这里将环境变量 PATH 分割 并把第一个字符串传入p */
p = strtok( getenv("PATH") ,":");
/* PATH 是 Linux 下的一个重要环境变量
用于搜索命令
一般在终端输入命令时搜索这些目录(除了相对路径或绝对路径)
类似 include 目录
例如 /system/xbin
各个目录直接用 ':' 隔开 */
while ( p != NULL )
{
/* 使用了两个函数
strcpy() 用于将分割到的数据写入 su
strcat() 用于将 "/su" 接入 su
最终成一个类似 /system/xbin/sh 的路径
*/
strcat(strcpy(su ,p) ,"/su");
/* access() 用于判断是否有权限执行操作
接受两个参数
第一个是字符串 指向 路径
第二个是验证的操作
R_OK 是否可读
W_OK 是否可写
X_OK 是否可执行
F_OK 是否存在
*/
if ( access(su, X_OK) == 0 )
break;
/* strtok 传入第一个参数如果是NULL 则继续上一次分割
可重新指定分隔符合集*/
p = strtok(NULL ,":");
}
if ( p == NULL )
{
/* 如果 PATH 中没有发现 su 则执行 */
fprintf(stderr ,"Cannot executable 'su'");
return 1;
}
else
{
/* 否则 */
/* 构建参数列表 */
/* 将要构建格式为 "su -c "exec 程序路径(argv[0]) 参数(argv[n])""
大概含义为
su为切换用户二进制
执行su 用于执行命令
"exec ....."
exec 命令为结束当前进程并启动程序
*/
strcpy(buf ,"exec ");
/* 防止死循环 设置环境变量 */
setenv("already_executable_su" ,"1" ,1);
for ( i = 0 ; i < argc ; i++ )
{
/* 构建参数列表 */
/* 程序路径 参数... */
strcat(buf ,"\"");
strcat(buf ,argv[i]);
strcat(buf ,"\" ");
}
printf("%s" ,p);
/* 结束进程并启动程序执行命令su */
execl(su ,"su" ,"-c" ,buf ,NULL);
/* execl()
exec家族函数
execl 参数为可变列表
第一个参数为程序路径
接下来就是参数agrv[0] argv[1] argv[2] ...
*/
/* 如果执行失败时执行
如果执行成功
进程已被替换
就不会执行以下语句
*/
fprintf(stderr ,"Cannot execitable 'su'");
return 1;
}
}
/* C++兼容C标准 */
#ifdef __cplusplus
}
#endif
/* 替换 main */
#define main(...) main_root(int argc ,char **argv)
长羲
哈啰沃德
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
大佬 求分享root教程
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示