Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2008, 20h17   #1
Invité régulier
 
Inscription : juin 2002
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 16
Points : 9
Points : 9
Par défaut Changer version du Kernel dynamiquement (dans un chroot)

Bonsoir,

Est-il possible, à votre avis, de faire croire aux applications qu'ils tournent sous une version du Kernel différente, sans pour autant booter sous cette version ?

Pour être moins vague, j'aimerais faire cela dans mon environnement chrooté: modifier à la volée la version du kernel, afin de faire croire aux applications lancées dans cette cage que le Kernel est différent (pour être précis, mon système hôte est Ubuntu et le système dans le chroot est Debian. Quand je lance un programme sous Debian chrooté, j'aimerais qu'il croit qu'il est sous le kernel de Debian, le 2.6.18 et pas celui d'Ubuntu, le 2.6.22).

J'ai un peu cherché et j'ai découvert dans un forum /proc/sys/kernel/osrelease, que des personnes ont pu modifier par le passé (mais qui est en lecture seule désormais en tout cas, chez moi). J'ai essayé de modifier les droits de ce fichier avec chmod, sans succès (opération non permise, même en tant que root).

Donc, si quelqu'un a une idée, proposition, indice, je le remercie à l'avance

PS: je ne suis pas intéressé par les vraies machines virtuelles, chroot est le moyen le plus intéressant pour ce que je veux faire
asher256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 03h03   #2
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
Tu peux peut-être faire quelque chose en surchargeant la fonction uname via la variable LD_PRELOAD.
Cela dit, je ne vois pas bien l'intérêt, si c'est pour ces soucis de compatibilité, c'est plutôt le programme en question qu'il faudrait modifier.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 12h09   #3
Invité régulier
 
Inscription : juin 2002
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 16
Points : 9
Points : 9
Bonne idée. Je pourrais en effet faire un petit programme (lancé par LD_PRELOAD) destiné à modifier à la volée tout ce qui pourrait retourner la version du kernel (peut-être que cela existe déjà ? Qui sait... Je chercherai en tout cas).

Merci pour ta réponse. Si tu as d'autres idées, elle seront les bienvenues.
asher256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 15h39   #4
Invité régulier
 
Inscription : juin 2002
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 16
Points : 9
Points : 9
Re,

Je m'apprêtais à créer mon propre programme, jusqu'à ce que je tombe sur fake-uname[1] !

J'ai décidé de le publier ici car il se peut qu'il soit utile pour quelqu'un un de ces jours :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 * Pour compiler :
 *     gcc -shared -fPIC -ldl fake-uname.c -o fake-uname.so
 *
 * Tester :
 *     UTS_RELEASE=0.0.0 LD_PRELOAD=$PWD/fake-uname.so uname -a
 *
 */
 
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#include <stdlib.h>		/* for EXIT_FAILURE */
#include <unistd.h>		/* for _exit() */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/utsname.h>
#include "linux/version.h"
 
#ifndef RTLD_NEXT
#define RTLD_NEXT      ((void *) -1l)
#endif
 
typedef int (*uname_t) (struct utsname * buf);
 
static void *get_libc_func(const char *funcname)
{
	void *func;
	char *error;
 
	func = dlsym(RTLD_NEXT, funcname);
	if ((error = dlerror()) != NULL) {
		fprintf(stderr, "I can't locate libc function `%s' error: %s",
				funcname, error);
		_exit(EXIT_FAILURE);
	}
	return func;
}
 
int uname(struct utsname *buf)
{
	int ret;
	char *env = getenv("UTS_RELEASE");
 
	uname_t real_uname = (uname_t) get_libc_func("uname");
	ret = real_uname((struct utsname *) buf);
 
	if(env != NULL)
		strncpy(buf->release, env, 65);
 
	return ret;
}
J'ai fait mes premiers tests, ça marche. Je vais activer "résolu" dans le sujet.

Merci encore.

À+ !

[1] j'ai légèrement modifié le programme car il ne se compilait pas bien.
asher256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h43.


 
 
 
 
Partenaires

Hébergement Web