我可以更改 uname 吗?

我可以更改 uname 吗?

我想安装 Discovery Studio Visualizer,但预编译的二进制文件会检查系统的操作系统版本。当它发现我没有运行 RHEL 时,安装程​​序就会退出。

有没有办法改变或欺骗调用 uname 的程序来显示不同的信息?

答案1

您无法自定义uname的输出,但您可以通过让系统运行自定义脚本而不是“真正的”脚本来欺骗安装程序/bin/uname

首先,您需要检查安装程序正在运行的确切命令来检查您的系统信息;在这个例子中,为了方便起见,我假装一个可执行文件~/tmp/check正在运行uname -n,并且的输出uname -n应该是ubuntu为了~/tmp/check打印“通过!”。

~/tmp/check的来源(这当然是不相关的,只是为了展示测试可执行文件的功能):

#include <stdio.h>
#include <string.h>

#define MAX_STRING_LENGTH 32

int main(void) {
    FILE* output = popen("/bin/uname -n", "r");
    char expected[] = "ubuntu";
    char hostname[MAX_STRING_LENGTH];
    fgets(hostname, MAX_STRING_LENGTH, output);
    pclose(output);
    if(hostname[strlen(hostname) - 1] == '\n')
        hostname[strlen(hostname) - 1] = '\0';
    if(strcmp(expected, hostname) == 0) {
        printf("Passed!\n");
        return 0;
    }
    return 1;
}
user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$ 

使用以下命令可以轻松跟踪可执行文件运行的确切命令strace

user@debian:~/tmp$ strace -f ./check 2>&1 > /dev/null | grep execve
execve("./check", ["./check"], [/* 34 vars */]) = 0
[pid 13122] execve("/bin/sh", ["sh", "-c", "/bin/uname -n"], [/* 34 vars */] <unfinished ...>
[pid 13122] <... execve resumed> )      = 0
[pid 13123] execve("/bin/uname", ["/bin/uname", "-n"], [/* 34 vars */]) = 0

因此,为了解决这个问题,应该输出uname -nubuntu最简单的解决方案就是移动/bin/uname并创建一个链接/bin/uname到自定义脚本的符号链接(它将忽略任何参数并只输出ubuntu):

cat ~/tmp/spoofer.sh

#!/bin/bash
echo ubuntu
exit 0
user@debian:~/tmp$ sudo mv /bin/uname /bin/uname1
user@debian:~/tmp$ sudo ln -s ~/tmp/spoofer.sh /bin/uname

让我们看看这是否有效:

user@debian:~/tmp$ uname -n
ubuntu
user@debian:~/tmp$ ./check
Passed!
user@debian:~/tmp$ 

宾果!(记得随后移除/bin/uname并移/bin/uname1回:)/bin/unamesudo rm /bin/uname && sudo mv /bin/uname1 /bin/uname

答案2

别名 uname'uname \!*|sed s/Ubuntu/RHEL/'

这是 c-shell 格式的别名,您可能需要根据您所使用的 shell 稍微更改一下。

相关内容