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

Windows Discussion :

[C] Obtenir la valeur d'une variable d'un autre programme


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Points : 52
    Points
    52
    Par défaut [C] Obtenir la valeur d'une variable d'un autre programme
    Lu,

    Je souhaiterais à titre d'exercice réussir à connaitre la valeur d'une variable depuis le programme A sur le programme B:

    * programme A défini la variable 'abc = 13654;'
    * programme B fait un jump mémoire (c'est bien ça ?) sur la zone mémoire du programme B et détermine la valeur de la variable 'abc' (=13654)

    Je sais évidement que Windows empêche ce genre de choses ! (logique, on est en mode protegé...) mais je suppose aussi qu'il doit bien y avoir une méhode de procéder puisque je sais que KAV à réussi à le faire dans leurs labos.

    L'utilisation de drivers kernel (et donc de l'api win32) ne me dérange pas, ça ne doit pas spécialement être portable.

    Merci

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je sais faire ça en Perl avec Win32::Process::Memory, je suppose qu'en lisant les sources (la partie en C) tu trouveras ce qui t'intéresse.

    --
    Jedaï

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Comme le dit justement Jedai il faut bien utiliser ReadProcessMemory() [lien MSDN], le tout étant d'avoir l'adresse de la variable (et c'est là que ça se complique) :


    Dans un premier temps, pour avoir l'adresse de la variable, il faut utiliser un désassembleur si le programme est compilé en natif,ce qui implique de connaître un minimum d'asm.

    Si le langage est interprété (type python, etc.) ou fonctionne via un moteur d'exécution (langage .NET, Java, etc.) là il faudra débugger le moteur en train d'exécuter le programme...

    Un autre complication intervient si la variable est locale à une fonction :

    Code C : 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
     
    include <stdio.h>
     
    /* variable globale */
    int var_glob = 42;
     
    int another_func(void);
     
    int main (void)
    {
         another_func();
     
         /* suite du prog */
     
         return 0;
    }
     
    int another_func(void)
    {
         /* variable locale à la fonction */
         int var_loc = 0;
     
         /* suite de la fonction */
     
         return 0;
    }

    La variable globale (var_glob) sera "facilement" lisible puisque sa durée de vie équivaut à celle du programme et son adresse restera constante.

    La variable locale (var_loc) à la fonction another_func aura une durée plus courte que la variable globale et sera en plus placée sur la pile du programme.

    Pour pouvoir la lire depuis un autre programme il faudra :

    1) débugger programme pour voir l'adresse de la variable sur la pile (en espérant qu'il n'y ai pas de randomisation de l'adresse de base de la pile, sinon ça se complique encore).

    2) Implémenter un débuggeur basique.

    3) Poser un point d'arrêt sur la fonction another_func à l'endroit précis où l'on veut la valeur de la variable locale.

    4) Lire la valeur et relancer le programme (ou s'en détacher).

    Bref, c'est faisable mais pas si simple que ça.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Points : 52
    Points
    52
    Par défaut
    Ouha, bah merci beaucoup

    Mais juste une dernière question:
    Si je veux pouvoir automatiser cela, es-ce possible ?

    Car le but était de pouvoir l'implenter sur mon AV pour pouvoir avoir une analyse heuristique plus puissante.
    Donc, est-ce faisable "en automatique" ou bien doit-on presque obligatoirement récupérer certaines infos "à la main" ?

    Merci =)

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 389
    Points : 20 489
    Points
    20 489
    Par défaut
    Citation Envoyé par pianopariss Voir le message
    Je sais évidement que Windows empêche ce genre de choses ! (logique, on est en mode protegé...) mais je suppose aussi qu'il doit bien y avoir une méhode de procéder puisque je sais que KAV à réussi à le faire dans leurs labos.
    qu'est ce que le mode protégé vient faire la dedans ?? Il ya grosse confusion .
    En programmation Windows on n'y touche pas les API de Windows proposent des fonctions comme celles données par Neitsa ; sinon il faut créer des sortes de Pipes entre processus faire une recherche dans le MSDN ou sur ce forum cela a déjà été abordé

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 389
    Points : 20 489
    Points
    20 489
    Par défaut
    Citation Envoyé par pianopariss Voir le message
    Donc, est-ce faisable "en automatique" ou bien doit-on presque obligatoirement récupérer certaines infos "à la main" ?

    Merci =)
    je ne comprends pas pourquoi tu veux faire cela automatique ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Points : 52
    Points
    52
    Par défaut
    Enfait je cherche à pouvoir faire comme un SandBox, mais ce n'est évidement pas simple alors je me suis dit, peut être que si j'execute le programme dans la même zone mémoire que mon executable, je pourrai réussir à le "contrôler" ?

    Merci et oui il y a confusion, je ne suis pas encore tout à fait au point dans ce domaine =)

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 389
    Points : 20 489
    Points
    20 489
    Par défaut
    Citation Envoyé par pianopariss Voir le message
    Enfait je cherche à pouvoir faire comme un SandBox, mais ce n'est évidement pas simple alors je me suis dit, peut être que si j'execute le programme dans la même zone mémoire que mon executable, je pourrai réussir à le "contrôler" ?

    Merci et oui il y a confusion, je ne suis pas encore tout à fait au point dans ce domaine =)
    ? Aie aie il y a vraiment confusion totale.
    Tu as posté dans le forum programmation Windows hors c'est pas la programmation Ms Dos.
    En général les exe sont logés en mémoire à l'adresse 0x40000 si je ne me trompe pas.
    Après l'OS selon les besoins peut déplacer le programme logé en mémoire
    Je conseille vivement de consulter le MSDN.
    Mais toute la programmation ASM et ms-dos il faut radicalement mettre cela de côté.

    C'est pour un anti virus ? Il faut faire de préférence un service Windows qui sera lancé automatiquement.
    Merci d'être explicite en bon français

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Points : 52
    Points
    52
    Par défaut
    Merci pour la réponse, oui c'est pour un antivirus déja en développement.

    Pour créer la base du service c'est ok, mais pour faire le SandBox (donc le contenu du service) je suis un peu planté.
    Il n'y a vraiment pas beaucoup d'informations sur cela.

    Tu as posté dans le forum programmation Windows hors c'est pas la programmation Ms Dos.
    Mais toute la programmation ASM et ms-dos il faut radicalement mettre cela de côté.
    Euh?

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/03/2015, 17h00
  2. Réponses: 1
    Dernier message: 01/05/2014, 17h25
  3. Réponses: 13
    Dernier message: 07/11/2011, 15h41
  4. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  5. Intercepter le changement de valeur d'une variable
    Par Captain_JS dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/01/2005, 08h04

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