posso mudar o uname?

2

Eu quero instalar o Discovery Studio Visualizer, mas o binário pré-compilado verifica o sistema para a versão do sistema operacional. Quando descobre que não estou executando o RHEL, o instalador sai.

Existe uma maneira de alterar ou enganar programas que chamam o uname para exibir informações diferentes?

    
por j0h 22.07.2015 / 04:41

2 respostas

9

Você não pode personalizar a saída de uname , mas pode falsificar o instalador fazendo o sistema executar um script personalizado em vez do "real" /bin/uname .

Primeiro, você precisará verificar o comando exato que o instalador está executando para verificar as informações do seu sistema; neste exemplo, por uma questão de facilidade, vou fingir que um executável ~/tmp/check está executando uname -n e que a saída de uname -n deve ser ubuntu para que ~/tmp/check imprima "Passado!". / p> A fonte de

~/tmp/check (isso, obviamente, não é relevante, e serve apenas para mostrar o que o executável de teste faz):

#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] = '
user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$ 
'; if(strcmp(expected, hostname) == 0) { printf("Passed!\n"); return 0; } return 1; }
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

É fácil rastrear o comando exato executado pelo executável usando strace :

#!/bin/bash
echo ubuntu
exit 0

Portanto, para contornar este, deve-se fazer uname -n output ubuntu : a solução mais fácil seria mover /bin/uname e criar um link simbólico /bin/uname vinculando a um script personalizado (que ignorará qualquer argumento e apenas a saída ubuntu ):

cat ~/tmp/spoofer.sh :

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$ 

Vamos ver se funcionou:

#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] = '
user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$ 
'; if(strcmp(expected, hostname) == 0) { printf("Passed!\n"); return 0; } return 1; }

Bingo! (lembre-se de remover /bin/uname e mover /bin/uname1 de volta para /bin/uname depois: sudo rm /bin/uname && sudo mv /bin/uname1 /bin/uname )

    
por kos 22.07.2015 / 09:48
1

alias uname 'uname \! * | sed s / Ubuntu / RHEL / '

Este é o alias do formato c-shell, você pode ter que alterá-lo um pouco com base no shell que está usando.

    
por Saurabh 26.01.2017 / 21:23