NewbieContest

Programmation => Langages compilés => Discussion démarrée par: the lsd le 05 Novembre 2008 à 15:12:47



Titre: [C++] lancement de processus
Posté par: the lsd le 05 Novembre 2008 à 15:12:47
Plop all

J'ai un souci à propos des processus. Il faudrait que je puisse détecter quand un processus windows est lancé et par qui. Je m'explique :

Windows donc virus à la c**. En l'occurence ces virus lancent IE pour afficher des pages de pub.
L'antivirus est très bien (quoi que... mais c'est une autre histoire) sauf que j'ai envie de m'amuser un peu donc je me suis dit pourquoi pas étudier ca à la main. Après réflexion, IE est forcément lancé par quelque chose et comme ce n'est pas moi, c'est forcement un processus (ca se tient je trouve :))

Donc j'aurais bien voulu pondre un prog qui écoute les processus lancés et qui me préviennent quand un processus (en l'occurrence IE7) est lancé, et par qui.

Vu que le processus IE7 n'est pas lancé à la base, je suppose qu'il faut que je vérifie tous les X millisecondes si il a été lancé (à moins qu'il n'y aie une autre solution ???), mais c'est pas ca qui me fait de la peur, c'est plutot savoir par qui a été lancé le processus IE7.

Any idea ?

Enjoy

The lsd


Titre: Re : [C] lancement de processus
Posté par: _o_ le 05 Novembre 2008 à 16:41:04
Any idea ?

Ouais : lire le blog d'IvanLeFou (http://www.ivanlef0u.tuxfamily.org/).


Titre: Re : [C] lancement de processus
Posté par: the lsd le 06 Novembre 2008 à 13:51:04
En fait je parlais plus d'idée humaines... Le blog d'Ivanlef0u il pique un peu trop pour l'instant...

Mais bon si il n'y a pas d'autre solution je ferais avec.

So, any human idea ?

Enjoy

The lsd


Titre: Re : [C] lancement de processus
Posté par: _o_ le 06 Novembre 2008 à 14:11:53
C'est toi qui voit. Mais dans mon souvenir, il a écrit des billets qui portent justement sur la façon dont est modélisé un processus dans le système d'exploitation, et décrit les structures qui vont bien. Donc, évidemment, ça demande un peu de recherche, mais au final, tu devrais avoir toutes les informations utiles à ce processus (et pas seulement son nom ou son propriétaire).


Titre: Re : [C] lancement de processus
Posté par: the lsd le 06 Novembre 2008 à 14:14:22
La recherche me fait pas peur, c'est surtout la différence de niveau entre ivanlf0u et moi  =D

Je vais aller faire un (gros) tour dessus, voir les billets qui peuvent m'interesser.

Enjoy

The lsd


Titre: Re : [C] lancement de processus
Posté par: the lsd le 07 Novembre 2008 à 11:24:31
Me revoila  avec un bon début de réponse :

http://www.ivanlef0u.tuxfamily.org/?p=15

Pour ceux qui veulent savoir :

En gros, on a une fonction qui liste les processus (CreateToolhelp32Snapshot) dans des structures. Ces structures contiennent des infos sur les process (nom, pid...) dont le pid du père, pile ce qu'il me faut !

Une fois le snapshot des processus effectué, on regarde chaque process un par un par rapport au nom du process cible.
Quand on trouve le processus qu'on veut, ben on récupère les infos dont on a besoin.

Voilou !

Enjoy

The lsd


Titre: Re : [C] lancement de processus
Posté par: lilxam le 07 Novembre 2008 à 19:52:09
Salut,
en effet tu peux utiliser CreateToolhelp32Snapshot() ainsi que ses deux compagnons Process32First() et Porcess32Next() pour lister les processus et tu obtiendras ainsi des infos sur chaque processus via la structure PROCESSENTRY32. Le champ th32ParentProcessID te permet d'obtenir l'ID du processus qui a lancé l'actuel et tu peux ensuite récupérer son nom avec GetModuleBaseName().

Vu que le processus IE7 n'est pas lancé à la base, je suppose qu'il faut que je vérifie tous les X millisecondes si il a été lancé (à moins qu'il n'y aie une autre solution ???)

Je pense que la solution la plus simple est bien de rafraichir ta liste régulièrement mais tu peux également faire un hook global sur tous les processus de l'API CreateProcess() et tu sauras donc très facilement quel est ce processus mystérieux. Moi j'opterais pour la première solution quand même.


Titre: Re : [C] lancement de processus
Posté par: the lsd le 08 Novembre 2008 à 14:37:34
Ouais j'ai croisé un code a toi sur cppfrance (dump de prog je crois) en suivant quelques liens a partir du blog d'ivanlef0u. Il m'a d'ailleurs bien aidé :D

Merci pour le GetModuleBaseName. Pour récuperer le nom, je relancais un CreateToolhelp32Snapshot() avec tout le reste. Un peu lourd à mon gout.

Pour savoir quand est lancé le process, en fait, j'avais pas pensé a faire un hook de CreateProcess().

Ca tombe bien je commence a me pencher la dessus, on va voir ca un peu plus.

Sans aller dans le inline au autre, le IAT hooking me tente bien (osef d'être grillé, c'est sur mon ordi) mais je calle pas trop. J'ai trouvé de la doc la dessus, mais certaines docs parlent de hook avec IAT, d'autre non (par exemple : http://tcharles.developpez.com/simul/#hooks (http://tcharles.developpez.com/simul/#hooks)). Je comprends pas la différence, lequel faut il utiliser... ?

Enjoy

The lsd

Edit : w00t, juste ce dont j'ai besoin : http://fyury.blogspot.com/ (http://fyury.blogspot.com/)


Titre: Re : [C] lancement de processus
Posté par: lilxam le 08 Novembre 2008 à 20:01:06
Hmmm je crois que le lien que tu donnes ne montre pas comment hooker une API. Sinon je pense que le mieux c'est bien de rediriger l'adresse de la fonction dans l'IAT du processus cible comme tu disais. J'ai fais ça une fois sur mon blog avec un hook global de TerminateProcess() ici (http://lilxam.blogspot.com/2008/03/api-hooking-by-iat-patching-hook-global.html) et tu peux également trouver un autre exemple sur le blog d'Overclok ici (http://0vercl0k.blogspot.com/2007/11/api-hooking-iat-patching.html).
Comme tu as surement dû le voir la façon la plus simple je pense est d'injecter une dll dans le processus. Sur mon blog je montre un exemple ici (http://lilxam.blogspot.com/2008/01/injection-de-dll-dans-un-processus.html) et tu trouveras aussi ici (http://joe-is-a-rocknroll-star.blogspot.com/2008/07/inject-your-dll.html), sur le blog de _JoE_, plusieurs méthodes pour faire ça. Une fois la dll injectée tu rediriges l'API vers une fonction de ta dll.
Voilà je pense qu'avec ça tu pourras te débrouiller.
Si t'as des questions n'hésites pas.
Lilxam.


Titre: Re : [C] lancement de processus
Posté par: the lsd le 08 Novembre 2008 à 21:42:07
Je suis deja tombé sur les liens des trois blogs en cherchant :)

J'avais deja regardé ca en sauvegardant les pages, mais le manque de batterie m'a empêché de continuer (et aussi mon arrivée en gare, mais bref :))

Je vais continuer la dessus.

Pour info, a quoi sert le hooking mis en place sur developpez.com dans ce cas ?

Enjoy

The lsd


Titre: Re : [C] lancement de processus
Posté par: lilxam le 09 Novembre 2008 à 11:22:42
Sur developpez.com c'est un type de hooking qui n'a rien à voir. C'est expliqué dans le tableau, tu peux intercepter les messages du clavier, de la souris, les messages envoyés à une application... Ca concerne juste la gestion des messages de windows.
Et il y a encore plein d'autres types de hook possible donc toi fais bien attention à préciser dans tes recherches que c'est un hook d'API.
Lilxam.


Titre: Re : [C] lancement de processus
Posté par: the lsd le 17 Novembre 2008 à 11:57:58
Reuh

Bon j'ai réussi à pondre un truc, mais ca me parait un peu louche l'histoire du GetModuleBaseName. On est obligé d'ouvrir le process avant ?

Toute critique est bonne à prendre (surtout que la prog win32, je connais pas grand chose...) donc je suis ouvert à vos suggestions.

Code:
#include <windows.h>
#include <iostream>
#include <tlhelp32.h>
#include <Psapi.h>
using namespace std;

class trouve_process
{
    public: // on mets les var en public pour que ca fasse beau avec la POO
PROCESSENTRY32 liste ;
HANDLE photo ;
HANDLE hproc ;
TCHAR szName[MAX_PATH];


/*
typedef struct tagPROCESSENTRY32 {  plus de détails : http://msdn.microsoft.com/en-us/library/ms684839(VS.85).aspx
  DWORD dwSize;
  DWORD cntUsage;
  DWORD th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD th32ModuleID;
  DWORD cntThreads;
  DWORD th32ParentProcessID;
  LONG pcPriClassBase;
  DWORD dwFlags;
  TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32,
 *PPROCESSENTRY32;
*/


    double chercher (char name[]) //méthode chercher : arguments nom du process à trouver
    {
        int trouve = 0 ;
        int resultat ;

/*
Le principe ici est de prendre une "photo" des process avec CreateToolhelp32Snapshot, le tout enregistré dans
des structures (cf plus haut).
une fois la "photo" prise, on fait défiler les process un par un avec Process32First et Process32Next, et on vérifie
le nom du process cible par rapport au nom donné en argument.
*/
        photo = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ;
        resultat = Process32First (photo, &liste) ;
        while (resultat)
        {
// Si on a trouvé le process
                if (strstr (liste.szExeFile, name))
                {
                    trouve = 1 ;
                    cout << liste.dwSize ;
                    cout << liste.cntUsage;
                    cout << endl;
                    cout << liste.th32ProcessID;
                    cout << endl;
                    cout << liste.th32DefaultHeapID;
                    cout << endl;
                    cout << liste.th32ModuleID;
                    cout << endl;
                    cout << liste.cntThreads;
                    cout << endl;
cout << liste.th32ParentProcessID;
                    cout << endl;
cout << liste.pcPriClassBase;
                    cout << endl;
cout << liste.dwFlags;
                    cout << endl;
cout << liste.szExeFile;
                    cout << endl;
                    cout << endl;
                    // On ouvre le process père pour récupere son nom avec GetModuleBaseName
                    hproc = OpenProcess(PROCESS_ALL_ACCESS , FALSE , liste.th32ParentProcessID);
cout << "processus pere : " ;
GetModuleBaseName(hproc, NULL, szName, MAX_PATH) ;
cout << szName ;
                    cout << endl;
CloseHandle (hproc) ; // fermuture du handle donc du process (ben ui on fait ca propre hein !)

                    break;
                }
                resultat = Process32Next (photo, &liste) ; // on passe au process suivant si on a rien trouvé
        }
        if (trouve != 1)
        {
                cout << "pas trouve" ;
        }
CloseHandle (photo) ;
            return liste.th32ParentProcessID ;
    }
};

int main()
{
    /*
    ouvrir la liste des process avec un CreateToolhelp32Snapshot
    vérifier le process par rapport au nom
    obtenir son pere dans l'arborescence
    affichage
    */
int parent ;

trouve_process test ; // on crée l'instance de l'objet
parent = test.chercher("cmd.exe") ; // et on fait une recherche sur cmd.exe

return 0;
}

Enjoy

The lsd


Titre: Re : [C++] lancement de processus
Posté par: lilxam le 19 Novembre 2008 à 14:56:54
Salut, bon je vois que ça avance :). Pour le GetModuleBaseName() c'est normal qu'il faille utiliser OpenProcess(). En effet GetModule... va se servir du handle qu'on lui passe en argument pour faire appel à ReadProcessMemory() et ainsi récupérer le nom du processus.
Maintenant je pense que tu devrais arriver à finir ton code, alors bon courage.
Lilxam.