Я хочу установить Studio Исследования Visualizer, но предварительно скомпилированный двоичный файл проверяет систему на версию ОС. Когда это находит, что я не выполняю RHEL, выходы установщика.
Существует ли способ изменить или обмануть программы, которые называют uname в отображение другой информации?
Вы не можете настроить 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
)
исказите uname 'uname \! * | sed s/Ubuntu/RHEL /'
Это - псевдоним формата c-оболочки, Вам, возможно, придется изменить его немного на основе того, какую оболочку Вы используете.