IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Recuperation des valeurs envoyé par PTRACE


Sujet :

Linux

  1. #1
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut Recuperation des valeurs envoyé par PTRACE
    Voila, je crée un programme récupérant les appels systéme d'un autre programme, et en utilisant la fonction PTRACE_PEEKDATA pour récupérer les paramétres de la fonction (ebx, ecx,edx,...), je n'obtient qu'une suite de chiffre.

    Comment puis je faire pour obtenir les données (ebx,ecx,edx,..) sous forme de chaine de caractéres ???

    MERCI

  2. #2
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Salut dragonfly,

    Est-ce que tu pourrais être beaucoup beaucoup plus précis s'il te plait ? Je vois difficilement comment nous pourrions t'aider avec les nombreuses informations que tu nous donnes.

    Merci.

    Marco85

  3. #3
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut Précision
    Ca me parrait clair pourtant.

    Quand tu récupére des informations sur une fonction, tu recois les informations ebx,ecx,edx,... Mais ces informations ne sont qu'une suite de chiffre.

    Avec la fonction PTRACE_PEEKDATA(...), il est possible de rcupérer les informations tel que ebx,ecx,edx..., mais je voudrais récupérer les données envoyé par la fonction.

    Par exemple, lors de l'envoie de la fonction "open(exemple.c,w+)", ebx contient exemple.c , et ecx "w+".
    Ce sont ces informations que je voudrais récupérer et pas ebx ="1786544564' et ecx="554646".

    As tu compris ???

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Précision
    Citation Envoyé par dragonfly
    Ca me parrait clair pourtant.
    Non, parce que plusieurs mots que tu utilises ne font pas partie du langage C :
    ebx
    ecx
    edx
    PTRACE_PEEKDATA(...)
    Explique le sens que tu donnes à ces mots, et on y verra peut être un peu plus clair...

  5. #5
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut OK
    Soyons plus clair.

    Tout d'abord la fonction ptrace(PTRACE_PEEKDATA,...) existe en C

    Ensuite les paramétres ebx,ecx,edx sont les paramétres que l'ont peut trouver dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct user x;
    x.regs.ebx;
    x.regs.ecx;
    x.regs.edx;
    lors de l'envoi d'informations du fils (créé lors du fork) vers le pére.
    Si tu ne comprends pas ce que je veut dire, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <sys/ptrace.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <linux/user.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "SyscallNames.cc"
     
    int main()
    {
     
     
    int res=0;
    int pid;
    struct user data;
    struct user_regs_struct regs;
    if((pid=fork())==0){
    	printf("je suis le fils\nTracage de test ->\n");
    	ptrace(PTRACE_TRACEME,NULL,NULL);
    	execve("Test",NULL,NULL);
    	}
    else{
     
    	printf("Je suis le pere\n");
    	while(1){
    		wait(&res);
    		traitement_signal(res,pid);
    	}
    }
     
    }
     
    int traitement_signal(int res, int pid){
     
    int signal,param;
    struct user contexte;
     
    if(WIFSTOPPED(res)){
    	signal=WSTOPSIG(res);
    	switch(signal){
    		case SIGTRAP:
    		ptrace(PTRACE_GETREGS,pid,NULL,&contexte);
    		param=contexte.regs.orig_eax;
    		printf("%s,%d,%d\n",getSyscallName(param),param,signal);
    		param=contexte.regs.ebx;
    		recupDonn(pid,res,param,"ebx");
    		param=contexte.regs.ecx;
    		recupDonn(pid,res,param,"ecx");
    		ptrace(PTRACE_SYSCALL,pid,NULL,NULL);
    		break;
    		default:
    		ptrace(PTRACE_GETREGS,pid,NULL,&contexte);
    		printf(" flag : %d\n",contexte.regs.eflags);
    		printf("le processus recoit un signal: %d, et un res %d\n",signal,SIGTRAP);
     		ptrace(PTRACE_DETACH,pid,NULL,NULL);
    		perror("error");
    		}
    	}
    else{
    	printf("terminé\n");
    	exit(0);
    	perror("close...");
    }
    }
     
    int recupDonn(int pid, int res, int param, char *nom){
     
    struct user contexte;
    printf("%s  ",nom);
    char data[256];
    int *datat=(int *)data;
    int j=0,i=0;
     
     
    while(j<(256/sizeof(int))){
    datat[j]=ptrace(PTRACE_PEEKDATA,pid,param+i,NULL);
    i+=4;
    j++;
    }
     
    for (i=0;i<sizeof(data);i++)
    printf("%c",data[i]);
    printf("\n");
     
    }
    Voila et mon probléme est dans la fonction recupDonn , lors de l'utilisation de PEEKDATA, les données sont incorrectes et des erreurs surviennent.

    PS: le fichier Test de la fonction execve est un simple programme de C compilé

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: OK
    Citation Envoyé par dragonfly
    Tout d'abord la fonction ptrace(PTRACE_PEEKDATA,...) existe en C
    Non. Ou alors, prouve le.

    http://emmanuel-delahaye.developpez....m#c_vs_systeme
    Ensuite les paramétres ebx,ecx,edx sont les paramétres que l'ont peut trouver dans :

    struct user x;
    x.regs.ebx;
    x.regs.ecx;
    x.regs.edx;
    Je ne suis pas sûr d'avoir ça sur ma machine Power PC... Il faut que tu prennes conscience que le monde n'est pas fait que de machines Intel ou d'un système X ou Y. Il est beaucoup plus vaste, et si tu parles de C non standard, il faut décrire le contexte précisément. Alors quel est ton système ? Ta plateforme ?
    lors de l'envoi d'informations du fils (créé lors du fork) vers le pére.
    Et là, tu vas me dire que 'fork()', c'est du C ? Ben non. Cest une fonction système unixoide. (Unix, BSD, Linux Mac OS/X...)
    Si tu ne comprends pas ce que je veut dire,
    Ben non, avec mon QI d'huitre...
    voici le code :
    Merci de lire les regles du forum...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <sys/ptrace.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <linux/user.h>
    #include <stdio.h>
    #include <stdlib.h>
    C'est clairement une application Linux. Le bon forum est donc "Développement Linux"

  7. #7
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut
    DSL de te contredire mais fork(), c'est du C
    Tout comme l'appel ptrace.
    Je programme en C et ces fonctions marche trés bien , aprés en ce qui concerne l'importation de fichier je suppose que chaque systéme à ces propores librairies.

    Merci, je vais voir sur l'autre forum si je peut obtenir une réponse

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par dragonfly
    DSL de te contredire mais fork(), c'est du C
    Je suis désolé, le C dont il est question dans le forum C est résumé dans cette page : C Standard Library. Ainsi que les bibliothèques dans le genre GTK+. Bref ce qui est standard ou portable !
    Ce code est clairement orienté Linux : ptrace est un appel système!

    Par conséquent, zouuu vers le forum Linux

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par dragonfly
    DSL de te contredire mais fork(), c'est du C
    Tout comme l'appel ptrace.
    Non, et visiblement, malgré ma précédente invitation à le faire, tu n'as pas lu mon article sur le sujet (attention, l'encre n'est pas encore sèche).

    Rappel :

    http://emmanuel-delahaye.developpez....m#c_vs_systeme

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/07/2011, 14h11
  2. Réponses: 4
    Dernier message: 14/12/2010, 21h58
  3. [AJAX] json recuperer des donneés envoyé par php
    Par karimphp dans le forum AJAX
    Réponses: 1
    Dernier message: 14/05/2010, 11h13
  4. recupere un valeur envoyé par une url
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/12/2005, 05h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo