logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C++] lancement de processus
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C++] lancement de processus  (Lu 6500 fois)
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« 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
« Dernière édition: 17 Novembre 2008 à 14:10:07 par the lsd » Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
_o_
Relecteur

Profil challenge

Classement : 42/54285

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #1 le: 05 Novembre 2008 à 16:41:04 »

Any idea ?

Ouais : lire le blog d'IvanLeFou.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #2 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
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
_o_
Relecteur

Profil challenge

Classement : 42/54285

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #3 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).
« Dernière édition: 06 Novembre 2008 à 15:43:10 par _o_ » Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #4 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 

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

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #5 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
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
lilxam
Profil challenge

Classement : 130/54285

Membre Complet
***
Hors ligne Hors ligne
Messages: 154


Voir le profil WWW
« #6 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.
Journalisée

Pourquoi faire simple quand on peut faire compliquer ?
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #7 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é

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). 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/
« Dernière édition: 08 Novembre 2008 à 14:54:24 par the lsd » Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
lilxam
Profil challenge

Classement : 130/54285

Membre Complet
***
Hors ligne Hors ligne
Messages: 154


Voir le profil WWW
« #8 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 et tu peux également trouver un autre exemple sur le blog d'Overclok ici.
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 et tu trouveras aussi ici, 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.
Journalisée

Pourquoi faire simple quand on peut faire compliquer ?
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #9 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
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
lilxam
Profil challenge

Classement : 130/54285

Membre Complet
***
Hors ligne Hors ligne
Messages: 154


Voir le profil WWW
« #10 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.
Journalisée

Pourquoi faire simple quand on peut faire compliquer ?
the lsd
Administrateur

Profil challenge

Classement : 190/54285

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #11 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
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
lilxam
Profil challenge

Classement : 130/54285

Membre Complet
***
Hors ligne Hors ligne
Messages: 154


Voir le profil WWW
« #12 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.
Journalisée

Pourquoi faire simple quand on peut faire compliquer ?
Pages: [1]
  Imprimer  
 
Aller à: