我可以更改 uname 吗?

j0h*_*j0h 2 software-installation

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

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

kos*_*kos 9

您无法自定义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;
}
Run Code Online (Sandbox Code Playgroud)
user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$ 
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

cat ~/tmp/spoofer.sh

#!/bin/bash
echo ubuntu
exit 0
Run Code Online (Sandbox Code Playgroud)
user@debian:~/tmp$ sudo mv /bin/uname /bin/uname1
user@debian:~/tmp$ sudo ln -s ~/tmp/spoofer.sh /bin/uname
Run Code Online (Sandbox Code Playgroud)

让我们看看这是否有效:

user@debian:~/tmp$ uname -n
ubuntu
user@debian:~/tmp$ ./check
Passed!
user@debian:~/tmp$ 
Run Code Online (Sandbox Code Playgroud)

答对了!(记得删除/bin/uname和移动/bin/uname1/bin/uname算账:sudo rm /bin/uname && sudo mv /bin/uname1 /bin/uname