PDA

Visualizza la versione completa : [C++] Distinguere i vari processi


kirakira93
22-04-2010, 20:55
Ciao ragazzi, io per terminare processi in C++ uso il seguente metodo:

incude, spero di non essermene dimenticato qualcuno :D


#include <windows.h>
#include <string>
#include <sstream>
#include <tlhelp32.h>
#include <psapi.h>


"Sniffa" i processi correnti.




BOOL SniffProcess(char * ProcessToSniff)
{
DWORD PiDProcess;
HANDLE hProcess = NULL;
PROCESSENTRY32 nProcess = {0};
PPROCESS_MEMORY_COUNTERS mProcess;
DWORD dProcess;
string s_NomeProcesso;
string s_ProcessToSniff;

s_ProcessToSniff.assign(ProcessToSniff);

hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcess != INVALID_HANDLE_VALUE)
{
nProcess.dwSize = sizeof(PROCESSENTRY32);
while(Process32Next(hProcess, &nProcess))
{
PiDProcess = nProcess.th32ProcessID;
s_NomeProcesso.assign(nProcess.szExeFile);

s_NomeProcesso = KillCapital(s_NomeProcesso);
s_ProcessToSniff = KillCapital(s_ProcessToSniff);

if(s_NomeProcesso == s_ProcessToSniff){
//if(MessageBox(NULL,s_NomeProcesso.c_str(),"Terminare?",MB_ICONQUESTION|MB_YESNO) == IDYES)
KillProcess(PiDProcess, DELETE); return TRUE;}
}

}


return FALSE;
}


questa funzione riduce a minuscoli i caratteri della stringa del nome del processo da terminare e di quello sniffato, in modo che se chiamo
SniffProcess(Firefox.exe); e il processo è firefox.exe me lo termina comunque



string KillCapital(string str)
{
for(int x = 0; x <= str.size()-1; x++)
if((str.at(x) >= 'A') && (str.at(x) <= 'Z'))
str.at(x) += 32;
return str;
}


infine il DISTRUTTURE di processi :sadico:



BOOL KillProcess(DWORD dwProcessId, UINT uExitCode)
{
DWORD dwDesiredAccess = PROCESS_TERMINATE;
BOOL bInheritHandle = FALSE;
HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
if (hProcess == NULL)
return FALSE;

BOOL result = TerminateProcess(hProcess, uExitCode);

CloseHandle(hProcess);

return result;
}


Ecco questo è il mio problema: se per esempio voglio terminare il processo di un'applicazione (poichè per svolgere ruoli sepecifici preferisco eseguire dei processi invece di creare tread (non sono ancora capace e penso che non sia ancora giunto il momento di imparare) ) e l'applicazione da terminare è stata rinominata es. da Firefox.exe a ciao.exe, avete qualche consiglio per terminare il processo? forse controllare la memoria che occupano, anche se sarebbe meglio analizzare il contenuto.... grazie in anticipo :D :D :D

oregon
22-04-2010, 21:14
Non ho capito il problema ... che vorresti fare? Qual è il fine ultimo? Cosa stai scrivendo?

kirakira93
22-04-2010, 21:23
Il fine ultimo è questo:

esempio piccolo programma in esecuzione:

Progetto1.exe


int main()
{
while(1);
return 0;
}



Se io chiamo la funzione di prima SniffProcess("Progetto1.exe"); esso verrà chiuso.
Ma se io rinomino Progetto1.exe in ldssfgnvs.exe e chiamo la SniffProcess("Progetto1.exe"); ldssnfgvs.exe non verrà terminato....
io vorrei trovare un modo di analizzare il contenuto dei processi e quando trovo


int main()
{
while(1);
return 0;
}


o comunque una cosa che fa capire che è quello, anche se con nome diverso, lo termina.

Spero di essere stato chiaro. :) :)

oregon
22-04-2010, 21:39
Originariamente inviato da kirakira93

Spero di essere stato chiaro. :) :)

Adesso sì ... ma non puoi.

MItaly
22-04-2010, 21:42
Se si tratta di un programma arbitrario, non puoi (o meglio, forse potresti ma con metodi piuttosto complessi).
Se invece vuoi comunicare ad una tua altra applicazione di terminare, puoi fare sì che questa si predisponga ad ascoltare messaggi tramite una mailbox, una named pipe, un socket o qualcos'altro a cui il "terminatore" possa collegarsi, identificando così il processo in maniera univoca.

oregon
22-04-2010, 21:50
Originariamente inviato da MItaly
Se si tratta di un programma arbitrario, non puoi (o meglio, forse potresti ma con metodi piuttosto complessi).

Direi che non potrebbe neanche con metodi complessi ... almeno non senza possibilità di errori ...


Se invece vuoi comunicare ad una tua altra applicazione di terminare, puoi fare sì che questa si predisponga ad ascoltare messaggi tramite una mailbox, una named pipe, un socket o qualcos'altro a cui il "terminatore" possa collegarsi, identificando così il processo in maniera univoca.

Beh ... questo è abbastanza ovvio ... :)

MItaly
23-04-2010, 00:50
Originariamente inviato da oregon
Direi che non potrebbe neanche con metodi complessi ... almeno non senza possibilità di errori ...

Escludere errori è impossibile, ma se è noto come è fatto l'eseguibile principale se ne può confrontare l'immagine in memoria con quella nota (escludendo naturalmente tutte le zone degli header PE sovrascritte dal loader); o più semplicemente, si può andare a pescare nelle risorse incorporate dell'immagine caricata in memoria il nome originale dell'eseguibile. Nulla di completamente sicuro, ovviamente, ma con una buona possibilità di riuscita.

Beh ... questo è abbastanza ovvio ... :)
Magari non lo sapeva. :)

kirakira93
23-04-2010, 13:15
Diciamo che non ho capito bene come applicare i due metodi in linguaggio C++... :)
potreste farmi qualche esempio per terminare l'applicazione col ciclo for perfavore :)

oregon
23-04-2010, 13:19
Originariamente inviato da kirakira93
Diciamo che non ho capito bene come applicare i due metodi in linguaggio C++... :)
potreste farmi qualche esempio per terminare l'applicazione col ciclo for perfavore :)

Che esempio? Ti abbiamo detto che non è affatto semplice (anzi, se parliamo di un codice come l'hai mostrato, senza risorse, senza distinzioni, è praticamente impossibile).

kirakira93
23-04-2010, 13:50
Allora... per un esempio che dovrebbe essere fattibile a tutti...
se i rinomino il file firefox.exe in qualcosaltro.exe, che codice dovrei scrivere?
firefox penso abbia caratteristiche abbastanza unusuali rispetto ad altri file

Loading