Newsgroup: it.comp.os.linux.development
Titolo: Uname e valore di ritorno

Buongiorno a tutti i partecipanti di questo proficuo NG,
mi trovo nella necessità di cambiare il valore di ritorno del programma
uname, dal momento che nella mia rete gli utenti sembrano non aver nulla da
fare a parte racimolare informazioni sui server e relativi kernel.
Avrei bisogno di sapere quali header modificare nel kernel di linux prima di
compilarlo affinche' io riesca ad inibire o cambiare a piacere la stringa di
ritorno di "uname -a".
Grazie in anticipo.

 ha scritto nel messaggio
news:99scv6$ekg$1...@pinco.nettuno.it...

Sostituisci il comando uname con uno script fatto da te.
Pero' non so se qualche altro comando fondamentale lo utilizzi. Mi pare
proprio di si' (login?).

Infatti Davide, grazie per la risposta, la necessita' era proprio quella di
evitare di creare un nuovo programma: un fake di uname. Le modifiche avrei
bisogno di farle sul kernel onde risolvere il problema alla radice.

ritorno di "uname -a".
La pagina di manuale di "uname()" dice che:
SYNOPSIS
       #include <sys/utsname.h>
Omettendo gli output non significativi e supponendo una architettura x86:
[zefram]:/usr/src/linux>strace uname -a
execve("/bin/uname", ["uname", "-a"], [/* 33 vars */]) = 0
uname({sys="Linux", node="localhost.localdomain", ...}) = 0
write(1, "Linux localhost.localdomain 2.2."..., 80Linux
localhost.localdomain 2.2.16 #1 Sat Feb 24 19:12:33 CET 2001 i586
unknown
) = 80
Cercando uname tra i sorgenti del kernel, viene fuori che sono definite:
sys_uname
sys_olduname
sys_newname
Cercando sys_uname:
[zefram]:/usr/src/linux>find . -type f -exec grep sys_uname {} -il \;
./include/linux/sys.h
./arch/i386/kernel/entry.S
./arch/i386/kernel/sys_i386.c
e in sys_i386.c :
asmlinkage int sys_uname(struct old_utsname * name)
...
        err=copy_to_user(name, &system_utsname, sizeof (*name));
...
        return err?-EFAULT:0;
...
e di seguito sys_olduname(), che pero' non ci interessa [sono definite 3
possibili versioni di dati restituiti da uname(), vedi utsname.h e come
sys_olduname lavori sulla struct con 5 elementi]
Ovviamente ora e' forte la curiosita' di sapere dove sia definita
sys_newuname, e in kernel/sys.c c'e':
asmlinkage int sys_newuname(struct new_utsname * name)
...
        if (copy_to_user(name,&system_utsname,sizeof *name))
                errno = -EFAULT;
...
La mia idea e' che si debba mettere mano al contenuto di system_utsname.
Che e' definita in init/version.c
struct new_utsname system_utsname = {
        UTS_SYSNAME, UTS_NODENAME, UTS_RELEASE, UTS_VERSION,
        UTS_MACHINE, UTS_DOMAINNAME
};
a questo punto trovi dove sono definiti i vari UTS_QUALCOSA e stai a
buon punto.
Nota che sono definiti in vari punti diversi, per esempio UTS_MACHINE e'
nel Makefile principale, UTS_SYSNAME in sys/utsname.h
Cio' detto, potresti:
a) Modificare questi valori come meglio credi
b) Riscriverti la chiamata sys_uname(). A patto di sapere cosa stai
facendo (nota che ci sono dei semafori), la cosa e' piu' semplice ed
anche piu' elegante, e metti mano ad una porzione sola del kernel. 
Tutto questo detto, la domanda sorge spontanea:
Ma perche' gli utenti sarebbero cosi' morbosamente interessati a
lanciare uname? 
In ogni caso, tieni presente che modificare il funzionamento del tuo
sistema in questo senso e' una idea poco buona, ci sono programmi bene
educati che usano "uname" per motivi serissimi, e sopratutto se la
sicurezza del tuo sistema si basa sulla non conoscenza di quale versione
del kernel stai usando, allora questa NON e' la strada da seguire per
renderlo piu' sicuro, e analoga obiezione se la questione e' che ci sono
tante chiamate ad uname() da causare un DoS.

 ha scritto nel messaggio
news:99sja0$gdr$1...@pinco.nettuno.it...

Io veramente pensavo ad uno script di 2 righe, non a un programma. Tipo
#!/bin/bash
echo quello che vuoi
Nell'altro caso non so aiutarti. L'unica cosa che so e' che il numero di
versione lo trovi nelle prime righe del Makefile del kernel.

Grazie e 1000,
opero la modifica andandomi a spulciare un po' le parti di kernel
suggeritemi, cambiando i #define al fine di non mettere mano a semafori o
segnali.
Ho le mie buone ragioni per dover modificare il valore di ritorno della
chiamata, non si tratta ne' di DoS, ne' di sicurezza legata all'occultamento
del valore del kernel.
Grazie ancora.