2009-10-19 8 views
0

Je suis en train de mettre l'appel de sortie sys à une variable parsys_call_table dans le noyau linux 2.6.18

extern void *sys_call_table[]; 
real_sys_exit = sys_call_table[__NR_exit] 

cependant, lorsque je tente de faire, la console me donne l'erreur

error: ‘__NR_exit’ undeclared (first use in this function) 

Des conseils seraient appréciés :) Merci

Répondre

4

Puisque vous êtes dans le noyau 2.6.x, sys_call_table n'est plus exporté. Si vous voulez éviter l'erreur de compilation essayez ceci inclut

#include<linux/unistd.h> 

Cependant, il ne fonctionnera pas. Ainsi, le travail autour de « jouer » avec le sys_call_table est de trouver l'adresse de sys_call_table à SystemXXXX.map (situé à/boot) avec cette commande:

grep sys_call System.map-2.6.X -i 

cela donnera les addres, alors ce code devrait permettre vous de modifier la table:

unsigned long *sys_call_table; 
sys_call_table = (unsigned long *) simple_strtoul("0xc0318500",NULL,16); 


original_mkdir = sys_call_table[__NR_mkdir]; 
sys_call_table[__NR_mkdir] = mkdir_modificado; 

espérons que cela fonctionne pour vous, je viens de tester sous le noyau 2.6.24, doivent donc travailler pour 2.6.18

également vérifier ici, est un très bon http://commons.oreilly.com/wiki/index.php/Network_Security_Tools/Modifying_and_Hacking_Security_Tools/Fun_with_Linux_Kernel_Modules

+1

... pourquoi utilisez-vous 'strtoul' sur une valeur statique? Pourquoi ne pas simplement utiliser un '0xc0318500' littéral? En outre, cela échouera sur un noyau relocalisable. – bdonlan

2

Si vous n'avez pas inclus le fichier syscall.h, vous devriez le faire avant la référence à __NR_exit. Par exemple,

#include <syscall.h> 
#include <stdio.h> 

int main() 
{ 
    printf("%d\n", __NR_exit); 
    return 0; 
} 

qui retourne:

$ cc t.c 
$ ./a.out 
60 

Quelques autres observations:

  1. Si vous avez déjà inclus le dossier, les raisons habituelles __NR_exit ne seraient pas définies sont que la définition était ignorée en raison de la compilation conditionnelle (#ifdef ou #ifndef au travail quelque part) ou parce qu'elle est supprimée ailleurs h #undef. Si vous écrivez le code pour l'espace noyau, vous avez un ensemble d'en-têtes complètement différent à utiliser. LXR (http://lxr.linux.no/linux) L'archive consultable de la source du noyau est consultable.

+0

J'ai, et en fait pour une raison quelconque, c'est réellement linux/syscalls.h dans cette version du noyau ... :(peut-être que je me trompe? – hahuang65

+0

Désolé pour la réponse inutile. Je dois deviner beaucoup de choses sur votre environnement de compilation pour répondre à la question. Par exemple, je ne sais toujours pas: quelle version du noyau Linux, quelle version du compilateur, drapeaux du compilateur, si le code est pour la compilation croisée, et si vous essayez de compiler un module noyau ou quelque chose pour l'espace utilisateur. Pouvez-vous fournir d'autres informations sur votre projet? –

+0

Son noyau linux 2.6.18 Compiler avec Makefile (gcc dunno quelle version) obj-m + = file.c Faire un module noyau pour intercepter les appels système. J'ai regardé le lxr, et il a énuméré un tas de syscall.h pour ma version de Linux, mais c'est un noyau patché, donc je peux juste demander à mon professeur. J'ai essayé quelques-uns des en-têtes du lxr, et ils manquaient, pour la mauvaise architecture, ou ne fonctionnaient pas. – hahuang65

Questions connexes