Newsgroup: it.comp.lang.delphi
Titolo: Terminazione PULITA di un processo REMOTO

Come più volte e angustamente ripetuto l'api win32 ExitProcess termina 
un processo e tutti i suoi thread
procedure ExitProcess(uExitCode: Cardinal); stdcall;
La funzione consente di specificare un codice di uscita come parametro: 
tale valore può essere poi prelevato da un qualsiasi processo che 
detiene un handle al processo terminato, chiamando l'api win32 
GetExitCodeProcess. 
Entrando più nel dettaglio, riguardo al comportamento di ExitProcess, si 
ha:
Tutti gli handles aperti dal processo, vengono chiusi
Tutti i thread nel processo, fatta eccezione per il thread che esegue la 
chiamata all'api ExitProcess, terminano la loro esecuzione. Inoltre (e 
questa è una cosa molto importante) viene chiamato l'entry-point di 
tutte le dll caricate nello spazio di memoria del processo chiamante, 
usando come parametro il valore DLL_PROCESS_DETACH. A questo punto viene 
terminato il processo corrente, incluso naturalmente il thread chiamante.
Lo stato del processo viene settato a Signaled, sbloccando quindi 
l'esecuzione di tutti i thread in attesa della terminazione del processo 
medesimo (ad esempio tramite l'api win32 WaitForSingleObject)  
Lo stato di tutti i thread nel processo viene settato a Signaled, 
sbloccando quindi l'esecuzione di tutti i thread in attesa della 
terminazione di uno o più di essi (ad esempio tramite l'api win32 
WaitForSingleObject)
Lo stato di terminazione del processo viene modificato dal valore 
STILL_ACTIVE al valore specificato come parametro della ExitProcess.
Il comportamento della ExitProcess è quindi molto più certosino rispetto 
all'api win32 TerminateProcess che provoca una terminazione 
incondizionata di qualsiasi processo (tralasciando ad esempio la 
chiamata all'entrypoint delle dll caricate nello spazio di memoria del 
processo che si vuole terminare). Mentre la ExitProcess coinvolge solo 
il processo chiamante, la TerminateProcess coinvolge qualsiasi processo. 
TerminateProcess è però rischioso perchè il processo terminato non potrà 
più avere l'opportunità per eseguire la propria SEH o le funzioni DLL 
DllMain.
L'obiettivo è estendere la ExitProcess a tutti i processi e 
l'implementazione si baserà sulla code injection
La seguente procedura che ho messo a puntino proprio in questi 
giorni,consente di chiamare la ExitProcess su qualsiasi processo remoto
function RemoteExitProcess(PID: Cardinal; //PID del processo remoto
           var outValue: Cardinal; //valore importante ottenuto dalla 
funzione remota
           var codError: Cardinal; //errore riscontrato dalla funzione 
remota
           synch: Boolean): Boolean; //esecuzione sincrona del thread 
remoto
type
  TRemoteExitProcessData = record
    errorcod: Cardinal; //codice di errore rilevato nella funzione remota
    output: Cardinal; //risultato significativo nella funzione remota
    //Indirizzi delle API usate: elenco puntatori a funzioni; N.B. 
rigorosamente stdcall
    //Es. pLoadLibraryA: function(pLibFileName: PAnsiChar): Cardinal; 
stdcall;
    pExitThread: procedure (dwExitCode: Cardinal); stdcall; //API 
obbligatoria
    pExitProcess: procedure (uExitCode: Cardinal); stdcall;
    //Puntatori a dati; Es. tutte le stringhe vanno messe qui dentro
    //Es. pNomeDll: Pointer;
  end;
var
  hProcess: Cardinal; //handle al processo remoto
  RemoteExitProcessData: TRemoteExitProcessData;
  //indirizzo del record nello spazio di memoria del processo remoto
  pRemoteExitProcessData: Pointer; 
  //indirizzo della funzione del thread nello spazio di memoria del 
processo remoto
  pRemoteExitProcessThread: Pointer; 
  output_value: Cardinal;
  error_code: Cardinal;
  functionSize, parameterSize: Cardinal;
  procedure RemoteExitProcessThread(lpParameter: pointer); stdcall;
  //var
  //qui posso definire delle variabili locali
  begin
    with TRemoteExitProcessData(lpParameter^) do
      begin
        //implementazione: tutte le API vengono chiamate tramite i 
puntatori nel record
        pExitProcess(1);
        pExitThread(1);
        //N.B. chiamare sempre pExitCodeThread per definire il codice di 
uscita del thread
        //Es. pExitThread(1) significa successo
        //    pExitThread(0) significa fallimento
      end;
  end;
  //dealloco la memoria in remoto
  function RemoteExitProcessUnloadData(): Boolean;
  begin
    Result := False;
    with RemoteExitProcessData do
      begin
        //chiamo UnloadData su tutti i puntatori a dati inclusi nel 
record
      end;
    //deallocazione spazio per il parametro
    UnloadData(hProcess, pRemoteExitProcessData);
    //deallocazione spazio per la funzione
    UnloadData(hProcess, pRemoteExitProcessThread);
    Result := True;
  end;
  //definisco i valori dei campi del record e copio i dati in remoto
  function RemoteExitProcessInjectData(): Boolean;
  begin
    Result := False;
    try
      //inizializzazione valori campi del record:
      with RemoteExitProcessData do
        begin
          errorcod := 0;
          output := 0;
          //assegno i valori ai puntatori a funzione 
          //(tramite GetModuleHandle e GetProcAddres)
          //Es. pLoadLibraryA := GetProcAddress(GetModuleHandle
('kernel32'), 
                                                'LoadLibraryA');
          pExitThread := GetProcAddress(GetModuleHandle('kernel32'), 
                                        'ExitThread'); //API Obbligatoria
          pExitProcess := GetProcAddress(GetModuleHandle('kernel32'), 
                                        'ExitProcess'); //API 
Obbligatoria
          //assegno i valori ai puntatori ai dati (tramite InjectData);
          //N.B. se una InjectData ritorna False allora bisogna chiamare 
Exit
        end;
      //copio il parametro
      parameterSize := SizeOf(RemoteExitProcessData);
      if not InjectData(hProcess,
                        @RemoteExitProcessData,
                        parameterSize,
                        False,
                        pRemoteExitProcessData) then
        begin
          Exit;
        end;
      //copio la funzione
      functionSize := SizeOfProc(@RemoteExitProcessThread);
      if not InjectData(hProcess,
                        @RemoteExitProcessThread,
                        functionSize,
                        True,
                        pRemoteExitProcessThread) then
        begin
          Exit;
        end;
      Result := True;
    finally
      if not Result then
        begin
          RemoteExitProcessUnloadData;
        end;
    end;
  end;
begin
  //inizializzo a zero le variabili locali
  hProcess := 0;
  pRemoteExitProcessData := nil;
  pRemoteExitProcessThread := nil;
  output_value := 0;
  error_code := 0;
  try
    hProcess := OpenProcessEx(PROCESS_CREATE_THREAD +
                            PROCESS_QUERY_INFORMATION +
                            PROCESS_VM_OPERATION +
                            PROCESS_VM_WRITE +
                            PROCESS_VM_READ,
                            False,
                            PID
                            );
    if hProcess = 0 then
      begin
        ErrStr('OpenProcessEx');
        Exit;
      end;
    if not RemoteExitProcessInjectData() then
      Exit;
    if not InjectThread(hProcess,
                        pRemoteExitProcessThread,
                        pRemoteExitProcessData,
                        output_value,
                        error_code,
                        synch) then
      Exit;
    //output_value e error_code sono stati inizializzati a 0.
    //sono stati modificati dalla InjectThread solo se synch = true;
    //se synch=false sono rimasti uguali a zero
    outvalue := output_value;
    codError := error_code;
    Result := True;
  finally
    if synch or (not Result) then
      begin
        RemoteExitProcessUnloadData;
      end;
    if hProcess <> 0 then
      begin
        if not CloseHandle(hProcess) then
          begin
            ErrStr('CloseHandle');
          end;
      end;
  end;
end;
 
EVENTUALMENTE POSSO POSTARE l'intero programmino in Delphi completo e 
ben funzionante.
Attendo MAIL.
Ciao
--- posted by geoForum on 
http://www.delphiedintorni.it

 ben funzionante.
Non è necessario postare l'intero programmino, possiamo benissimo 
scaricarcelo tutti dalla pagina da cui hai copiato di sana pianta quello 
che hai scritto:
http://pasotech.altervista.org/delphi/articolo64.htm
Che tristezza di "troll"... ;-)
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Ciao Marco,
Pensavo che almeno tu fossi intelligente.... Questa roba funziona molto 
bene e scalza una volta per tutte l'uso ERRATO di TerminateProcess.
Tu scusa non hai mai fatto copia e incolla di procedure o simili ??
Questa procedura dimostra le CAZZATE che avete detto e cioè di usare 
TerminateProcess e in sintesi che siete solo ARROGANTI nel sostenere le 
vostre TESI e che non capite un CASSU di API.
Volete un consiglio ? Abbassate le ALI e mettetevi a lavorare seriamente 
con umiltà. Chi si loda si imbroda, chi vuole aver ragione a tutti i 
costi ancora peggio.... E voi lo fate quotidianamente.
Avete l'atteggiamento del DIPLOMATO spocchioso che nasconde una forte 
insicurezza nei confronti della cultura e che ha spirito di rivalsa 
mosso dalla pura volontà di autoidentificarsi e basta.
E'come la differenza tra i veri signori e i contadini burinotti 
arricchiti. Il vero professionista non scende mai a tali compromessi e 
non inserisce mai se stesso in un discorso tecnico.
Forse non avete ancora imparato l'umiltà che accompagna ogni vero 
professionista. Parlo soprattutto per Andrea Laforgia, ma a tuo modo 
anche tu ci sei dentro con il sorriso distaccato di chi in fondo fa 
finta di scappare.
Crescete ragazzi, siete ancora giovani. Uscite dalla schiera degli 
ignoranti ed entrate nel mondo dei professionisti. Abbandonate le 
logiche narcisiste del ruolo d'azienda, fatto di poveri cretini che si 
scannano come stupide galline.
Nel vedervi postare non provo mai e per niente pena, ma solo 
preoccupazione e dispiacere nel vedervi buttar via così, ormai 
pienamente istituzionalizzati da un sistema aziendale crudele e senza 
scrupoli che vi ha tolto ogni libertà mentale. Siete fragili legati 
all'affermazione del vostro nome che il tempo brucerà via prestissimo e 
nulla di vero procede nel vostro cammino.
SALVATEVI vi prego.... Fermate questo strazio.


Il solito Fesso ha scritto:
.. boh! Non penserai che qualcuno legga ancora i tuoi post, vero?
Stai diventando una leggenda! 
Il troll più scarso del pianeta!
Ci ricorderemo di te per decenni!
Ma che vita di merda hai?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Cosa dobbiamo fare ? Lasciarvi nel vostro brodo e continuare a 
sopportarvi e sopportare anche il continuo calo delle adesioni a 
it.comp.lang dovuto alla presenza dei burinotti da piazza ?
Ditecelo....


Perchè i veri professionisti sono tutti su D&D ?
Questa è la giostra dei bambini. Guardate quante volte Laforgia è stato 
mandato a leggere il beccaccino su D&D. Ultimamente sta cercando di 
rientrarvi fino alla prossima mazzata che qualcuno gli darà.
Ma vi rendete conto oppure siete proprio convinti ?! La gente vi conosce 
e dice ecco i burinotti della piazza che fanno chiasso con i motorini...
SVEGLIA, vi prego... Fatelo per un senso di buon gusto, togliete la 
nausaea mentale che ci affligge ogni volta che leggiamo i vostri post 
arroganti.


 Tu scusa non hai mai fatto copia e incolla di procedure o simili ??
Si ma avevi scritto:
:La seguente procedura che ho messo a puntino proprio in questi
:giorni,consente di chiamare la ExitProcess su qualsiasi processo remoto
:function RemoteExitProcess...
Ma che ignobile svicolata dalla enorme figura di merda che hai fatto!
Ma cosa hai messo a puntino, tu? Ahahahahah....ROTFLOL.

 it.comp.lang dovuto alla presenza dei burinotti da piazza ?
E' una promessa o una minaccia? :-)
Magari è un altro "copia e incolla"... ;-)


 arroganti.
Beh, te ne puoi sempre andare... ma se ci tieni alla tua missione, 
mandaci un "troll" che sia almeno un po' più quotato e fantasioso, e che 
magari abbia più tempo a disposizione per elaborare un minimo i testi 
che trova con Google, variando un po' il "copia e incolla"...
Se il "troll" pensa a colombiane del tutto immaginare, dove lo trova il 
tempo da dedicare a noi? ;-)


:giorni
Infatti , se vuoi ti posto la versione messa da me a puntino....
Sei proprio poco intelligente...!


E' una promessa o una minaccia? :-)
Un constatazione....


OK allora ti chiedo tu useresti davvero TerminateProcess se rischissi il 
culo ?


E' ancor più incredibile che Laforgia non solo venga trollato come un 
povero agnellino indifeso. Ma anche prenda lezioni tecniche dallo stesso 
TROLL che gli fa fare una figuraccia sul piano tecnico.
Cioè una doppia batosta....
Leggi sotto risponderà per mischiare le acque che non intendeva così che 
l'aveva detto lui e cazzate varie per salvare la faccia. Tenterà di 
buttare fumo arrampicandosi sugli specchi.
Di fatto però la procedura postata funziona alla grande, mentre il suo 
TerminateProcess è veramente una cacata micidiale. Il che dimostra che 
non capisce nienete di API.


In definitiva al posto di spararsi nelle palle con questi qua, andate 
nel link sotto...
http://www.thesecretmachines.com/


 Infatti , se vuoi ti posto la versione messa da me a puntino....
Sei proprio uno spasso.
Peraltro quella funzione da ragione a Laforgia, che è stato il primo a 
parlare di code-injection.
Per quanto tempo intendi continuare a fare figure di merda in pubblico?

 l'implementazione si baserà sulla code injection
EEEEEEEEEEEEEEH ? COSA ???? CODE INJECTION ??? MA SE DICEVI CHE E' UNA
CAGATA! NOOOOOOOOOOOOOOOOOOOOOOOOOO TROLLINO!!!! TROLLINOOOOOO!!!! 
M'HAI DELUSOOOOOOOOOOOOO!!!! M'HAI DELUSO TROLLINOOOOOOOOOOOOOO!!!!
TROLLINOOOOOOOOOOOOOO !!! TROLLINOOOOOOOOOOOOOOOOOOO!!!!
MA LA CODE INJECTION LA SAPEVAMO ANCHE NOI !!!! NOOOOOOOOOOOOO!!!!
MA ALLORA DOV'E' STA SOLUZIONE STRABILIANTE CHE CI AVREBBE APERTO GLI
OCCHI????
NAAAAAAAAAAAAAAA TROLLINO NAAAAAAAAAAAAAAAAA !!!!
BUUUUUUUUUUUUUUUUU!!! BUUUUUUUUUUUUUUUUUUUUU!!!
DELUSIONE GRANDISSIMA!!! FAMMELO DIRE!!!
..la code injection, ragazzi, la code injection...
..GLI AVEVO DETTO *SENZA* la code injection che già l'abbiamo citata
noi.. e lui niente...
CHE DELUSIONE TROLLINO, CHE DELUSIONE... 
..almeno postare codice originale, e invece un misero cut&paste...
mi cadono le braccia... tutta sta fatica per niente...
BASTA VADO VIA DELUSO E ARRABBIATO. TROLLINO CON TE NON CI PARLO PIU'.


 parlare di code-injection.
Guarda, sono incazzatissimo. Avevo comprato anche quaderno e penna nuovi
per prendere appunti e invece nulla, dovrò tenermeli intonsi. M'aveva
promesso una signora soluzione e invece ecco qua che la montagna ti
partorisce il topolino: la code injection. Ragazzi, la code injection... 
TROLLINOOOOO LA CODE INJECTION LA SAPEVAMO ANCHE NOI !!!


 Un constatazione....
Vuoi una constatazione vera?
DIPLOMATI-TROLLINI   1-0


Pazzesco....
Senti amico, la colombiana ha una sorella... Se passi un giorno da 
Milano te la presento. Mi sembri un po' stressato.
Ma ti rendi conto della cacata che dici ? Scarica il codice ed effettua 
una chiusura di processo vedi che è tutto ok.
Ti mangi un bel pollo fritto e ti sorride la vita. Fidati.
PS Guarda qui.
http://www.delphiedintorni.it/geoxml/forumhistorythread
?
groupname=libero.delphi.winapi&messageid=
14ySG4N9...@w1.www1.dms.it


 PS Guarda qui.
Lo conosco, lo conosco Bertuccini e la sua opinione (che non hai neanche
interpretato) non comprova affatto le tue cagate.
Ora però, trollino, fai tesoro di questa esperienza. La prossima volta
voglio un bel trolleggio eh?... uno fatto bene, che non ti si sgami subito!
Dai, non è divertente sennò. Ue', prossima volta non mi deludere!
Dai, per questa volta ti perdono. Notte trollino ;-)


OK, leggi a pagina 5 di questo DOC dell'università di PADOVA cosa ne 
pensano di TERMINATEPROCESS.
Esempio per WCE
http://www.dei.unipd.it/corsi/so/no/store/u13aWinCE.pdf


Caro Laforgia sei fuori a difendere questa cacata di API, ma ti rendi 
conto ?
http://msdn2.microsoft.com/en-us/library/ms686714.aspx
Riporta:
The TerminateProcess function is used to unconditionally cause a process 
to exit. The state of global data maintained by dynamic-link libraries 
(DLLs) may be compromised if TerminateProcess is used rather than 
ExitProcess.
TerminateProcess initiates termination and returns immediately. This 
stops execution of all threads within the process and requests 
cancellation of all pending I/O. The terminated process cannot exit 
until all pending I/O has been completed or canceled.
A process cannot prevent itself from being terminated.
La miglior strada è EXITPROCESS con DLL INJ che funziona benissimo 
oppure TASKKILL.


pensano di TERMINATEPROCESS.
Curiosità: l'università di Padova ha una qualche competenza riguardo
l'API di Windows di cui dovremmo tenere conto? o forse è escluso che
chi ha scritto quella dispensa sia l'ennesimo scalzacane?
Purtroppo, vista anche la recente analisi di un tutorial C++ (scritto
da professori universitari) che abbiamo fatto su it.comp.lang.c++,
temo che questa seconda evenienza sia molto più probabile. A parte il
fatto che WinCE non supporta la tua amata ExitProcess(),
TerminateProcess() non è affatto una funzione da evitare. Se
ExitProcess() fosse stata oggettivamente "migliore" di
TerminateProcess(), mi spieghi perché MS avrebbe supportato la seconda
e non la prima in quel sistema operativo? Se per "da evitare" si
intende il concetto un po' più complesso di "cercare prima una
soluzione che assicuri le dovute procedure di clean-up" allora siamo
d'accordissimo e difatti l'ho detto dall'inizio (il metodo stesso
seguito dal Task Manager, quando si termina un'operazione (bada, non
un processo) è quello di cercare una via "pulita" di chiusura; se non
ci riesce usa TerminateProcess(). Quando si termina un processo, lui
usa TerminateProcess()). TerminateProcess(), se serve, svolge
egregiamente il suo compito ed è nella sua natura quello di tarpare un
processo indipendentemente dal suo stato. Il vantaggio è che
*sicuramente* il processo muore, garanzia che ExitProcess() non è
assolutamente in grado di dare.

oppure TASKKILL.
A parte che di code-injection ho parlato io per primo, mentre tu
sbraitavi, non esiste una strada "migliore". Taskkill, per tua
informazione, usa TerminateProcess(), non fa alcuna code-injection.
Ora basta. Ti ho mostrato fin troppe volte dove toppi. Fattene una
ragione. Trova un'altra fonte di trolleggio. Hai perso.

assolutamente in grado di dare.
Quoto al 100%.
Quindi prima provare con ExitProcess e poi con TerminateProcess.
Ma non subito con TerminateProcess.
Scusa ma TASKKILL non fa già tutto questo ? E allora ti chiedo perchè 
non usarlo ?


E' una utility molto potente se vogliamo è la versione non GRAFICA del 
TASKMANAGER.
http://commandwindows.com/taskkill.htm
Con TASKKILL poi usi i FILTRI. 
Examples of using filters in Taskkill
With filters, you can impose some specific set of conditions that must 
be met. Filters give Taskkill considerable versatility and allow you to 
fine-tune the target..Some examples are given below. Note that a 
specific image name or PID does not have to be included when using 
filters. 
Forcefully shut down all the processes that are not responding. Can be 
used to make a little batch file to shut down hung or frozen programs. 
taskkill /f /fi "status eq not responding" 
Forcefully shut down all programs using a specific DLL file 
named "some.dll". This should be used with care but one application 
might be to stop processes thought to be associated with a DLL from 
spyware or a Trojan. Use Tasklist to see what processes are using a 
given DLL. 
taskkill /f /fi "modules eq some.dll" 
Close down all programs using large amounts of memory, say 40 MB. Use 
with care. 
taskkill /f /fi "memusage gt 40000" 
Close down programs using more than 40 MB of memory but not Windows 
Explorer 
taskkill /f /fi "imagename ne explorer.exe" /fi "memusage gt 40000"


professionista. Parlo soprattutto per Andrea Laforgia, ma a tuo modo 
Di nuovo, ti stai perfettamente descrivendo. Saresti un caso 
psichiatrico veramente interessante...


ROTFL.....
