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 :

[Processus] Faire un Hash sur un programme en mémoire


Sujet :

Windows

  1. #1
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut [Processus] Faire un Hash sur un programme en mémoire
    Bonjour tout le monde, voici ce que je souhaite faire :

    1 Lister les processus actifs sur l'os
    2 Calculer pour chaque processus le Hash de sa partie executable ( MD5 par exemple... ici se situe le problème )

    Le but, est de detecter les processus "hookés", c'est à dire modifiés à la volée par un autre programme à un instant T, ou des programmes interdits chargés en mémoire.

    Pour cela, je souhaite calculer leur Hash MD5 par rapport à l'occupation mémoire du processus (pour la partie executable...), mais je ne sais pas du tout comment faire... Avez-vous une idée ? Est-ce possible, avec une fonction système, d'obtenir le "contenu" binaire de la partie executable d'un processus en mémoire ? ..

    Ca me parrait extrêmement dur, mais peut-être avez-vous une solution à me suggérer, ou un lien qui parlerait de la chose.

    Merci d'avance pour toute réponse !

  2. #2
    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,

    1) Récupération des processus :

    - CreateToolhelp32SnapShot() avec TH32CS_SNAPPROCESS

    - puis Process32First() et Process32Next() pour obtenir la liste.

    2) Récupération des modules :

    Le premier module d'un processus est l'exécutable

    - CreateToolhelp32SnapShot() avec TH32CS_SNAPMODULE.

    - puis Module32First() [et optionellement Module32Next()]

    3) Récupération de l'ImageBase :

    la structure MODULEENTRY32 (cf. 2) contient un champ pour l'ImageBase (la base de l'exécutable une fois mappé en mémoire) :

    Une fois qu'on a ce champ, il faut y aller à coup de ReadProcessMemory (on à déjà le hProcess).

    4) lire le PE header

    ReadProcessMemory sur le process désiré avec une taille de 0x1000 octets.

    5) trouver la section de code du processus cible:

    On travaille d'abord avec la structure du PE header que l'on a "dumpé" à l'étape 4.

    2 possibilités :

    5-1) on prend le champ du PE header nommé AdressOfEntryPoint, on ajoute l'ImageBase puis Bitwise AND 0x0FFF.

    5-2) on prend le champ du PE header nommé BaseOfCode, on ajoute l'imageBase, on a l'adresse virtuelle de la section code.

    6) Obtenir la taille de la section code :

    2 possibilités : (on travaille toujours sur le dump du PE header)

    6-1 ) on prend le champ SizeOfCode du PE header.

    6-2) plus compliqué, on va sur le IMAGE_SECTION_HEADER qui est un tableau regroupant les différentes sections de l'exécutable. Avec l'adresse de la section code obtenue précédemment, on regarde où est le tableau de la section code en comparant avec le champ VirtualAdress.

    Quand on a trouver la bonne section on regarde le champ VirtualSize et on l'indexe sur le champ SectionAlignement du PE header.

    Si VirtualSize <= (inférieur ou égal à) SectionAlignment alors la taille du code est = à SectionAlignment

    Si VirtualSize > SectionAlignment, alors taille du code est un mutliple de SectionAlignment, supérieur à VirtualSize.

    Ex:
    VirtualSize = 0x2455
    SectionAlignment = 0x1000 (constant)

    alors taille du code = 0x3000.

    Cette technique à l'avantage de pouvoir détecter les injections de processus...

    7) Vérification de l'intégrité :

    ReadProcessMemory avec Base du code pour l'adresse (cf. 5), et taille du code (calculé en 6).

    On vérifie l'intégrité sur le code que l'on a dans le buffer passé à ReadProcessMemory.

    Personellement j'aurais penché pour un CRC32 moins gourmand en terme de ressource et de calcul pour une vérification d'intégrité.

    Finalement, ne pas oublier que la vérification exclusive du code ne permet pas de trouver un malware injecté par CreateRemoteThread si celui ci s'injecte dans un partie quelconque de l'espace d'adressage d'un processus...

    A ce niveau là seul une technique de hooking sur les API natives (en "system global" donc) en Ring0 permet d'éviter l'injection.

  3. #3
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    Merci énormément pour ta réponse !! Génial !

    Je compte faire même plutôt un hash Whirlpool plutot qu'un MD5, mais peut-être que je pousse la paranoia à l'extrême

    Encore merci pour ton aide Neitsa ! Bonne continuation !

    Jean

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2010, 12h41
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. Si vous voulez faire un site sur la programmation
    Par BrYs dans le forum Mon site
    Réponses: 3
    Dernier message: 01/11/2009, 17h57
  4. faire un test sur un programme externe
    Par marieheraud dans le forum Windows
    Réponses: 3
    Dernier message: 02/09/2004, 18h32
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

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