я могу изменить uname?

Я хочу установить Studio Исследования Visualizer, но предварительно скомпилированный двоичный файл проверяет систему на версию ОС. Когда это находит, что я не выполняю RHEL, выходы установщика.

Существует ли способ изменить или обмануть программы, которые называют uname в отображение другой информации?

2
задан 22 July 2015 в 05:41

2 ответа

Вы не можете настроить 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 -n вывод ubuntu: самое легкое решение состояло бы в том, чтобы просто переместиться /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/uname впоследствии: sudo rm /bin/uname && sudo mv /bin/uname1 /bin/uname)

9
ответ дан 2 December 2019 в 01:28

исказите uname 'uname \! * | sed s/Ubuntu/RHEL /'

Это - псевдоним формата c-оболочки, Вам, возможно, придется изменить его немного на основе того, какую оболочку Вы используете.

1
ответ дан 2 December 2019 в 01:28

Другие вопросы по тегам:

Похожие вопросы: