Newsgroup: it.comp.programmare.win32
Titolo: Killare un processo non killabile

Ciao
Come si fa a killare un processo che non ne vuole sapere di essere killato,
nemmeno con "kill -f"?
Non riesco a trovare documentazione a tal proposito.
Ciao
GG

Dimenticavo...
Opero su un Win2000 Server con diritti di amministratore, quindi con i
privilegi di debug richiesti per killare qualunque cosa (a detta dell'MSDN).
Unica soluzione attuale: spegnere fisicamente la macchina e ripartire.
I processi da killare sono Access + il programma che accede allo stesso
database via ADO.
Cosa sta succedendo che si pianta tutto in questo modo?!?!
Grazie
Ciao
GG

 wrote in message
news:aece1v$b1o$1...@fe2.cs.interbusiness.it...

Hai provato con TerminateProcess()?
Se proprio non ne volesse sapere io lo farei auto-killare iniettandogli del
codice e facendogli eseguire un bel ExitProcess()!
Kiuhnm

 wrote in message
news:Z1lO8.33932$TS.9...@news1.tin.it...


 dove iniettarlo)?
Non è facilissimo...prima proverei ugualmente a usare TerminateProcess (non
si sa mai).
Programmando su Win98 non ho mai avuto a che fare con diritti di accesso e
cose varie, ma essendo l'amministratore, non dovresti proprio avere
problemi.
Io proverei in questo modo:
FindWindow() -> finestra del programma (anche se nascosta dovrebbe averne
una)
GetWindowThreadProcessId() -> ottieni il ProcessId
OpenProcess() -> ottieni l'handle nel tuo contesto
TerminateProcess() -> termini il processo
Se il progamma non ha una finestra, puoi usare le funzioni ToolHelp per
ottenere il ProcessId.
(le funzioni tool help sono poco documentate, nella guida Win32 della
Borland cerca "Accessing the Tool Help Functions")
Per iniettare codice invece puoi usare  SetWindowsHookEx. Questa funzione
carica una tua DLL (che contiene l'hook function) nel contesto del processo
di cui specifichi il thread (con GetWindowThreadProcessId ottieni anche il
ThreadId).
La tua hook func non dovrà fare altro che chiamare ExitProcess (visto che
termina il processo corrente e la tua dll viene eseguita nel processo da
killare)
Puoi iniettare codice anche con WriteProcessMemory, ma qui devi sapere dove
iniettare il codice e come scriverlo. Per semplificare mostruosamente le
cose, potresti ottenere l'indirizzo di ExitProcess con GetProcAddress() dal
tuo programma [se compili il prg. con Visual C/C++ in versione DEBUG,
GetProcAddress ritorna l'indirizzo di un jmp alla funzione ExitProcess!!! In
versione RELEASE funziona correttamente.].
ExitProcess si trova in Kernel32 e quindi è accessibile da qualsiasi
contesto (almeno in Win98).
A questo punto fermi il processo che vuoi terminare (partendo da
DebugActiveProcess()??? Dagli un'occhiata...), guardi dove si è fermata
l'esecuzione (cs:eip) e
sovrascrivi le istruzioni che dovrà eseguire appena verrà risvegliato, con
un codice tipo:
    xor    eax, eax        ; 0
    push    eax
    mov    eax, ExitProcess_Address
    call    eax
here: jmp    here
ExitProcess_Address è l'indirizzo ottenuto con GetProcAddress() (prima
ovviamente usi LoadLibrary() per ottenre l'handle del kernel32).
Il codice sopra è codificato come segue (numeri esadecimali):
33 c0
50
b8 [dword_ExitProcess_Address]    ; 1+4 bytes
ff d0
eb fe            ; ciclo infinito
Spero di esserti stato utile, purtroppo non ho molto tempo e non ho codice
d'esempio alla mano :-(
Puoi anche fare un loader! Chiami il tuo loader come il prg. da terminare e
rinomini quest'ultimo. Il tuo loader caricherà l'originale (con
CreateProcess()) e quando avrà voglia lo terminerà con TerminateProcess().
Il tuo loader può avere una finestra invisibile, che se riceve un certo
messaggio (stabilito da te e inviato con SendMessage() da un altro programma
[MyKill.exe, per esempio]) termina il programma.
Potresti anche cercare su Internet delle applicazioni per terminare
(gestire? Task Managers?) i processi. Può darsi che una di queste funzioni
meglio di "kill".
Kiuhnm

 Puoi iniettare codice anche con WriteProcessMemory
...



vai a 
www.sysinternals.com
 e fra le utility c'e' un pskill, prova con
quello.
ciao
Vincenzo 'lo sciamano'   Bologna (ITALIA-ITALY)
Homepage  
http://www.geocities.com/vincesalsero/
Membro Fondatore del CSM (Club Seghe Mentali)
http://www.seghementali.org

 nemmeno con "kill -f"?
L'unico metodo pressoche` infallibile che ho trovato e` quello di
avviare una sessione di debug sul processo e poi interromperlo da li`.
Se hai Visual C++ (o un altro ambiente dotato di debugger) lancia il
Task Manager e scegli la voce "Debug" per il processo che ti interessa,
poi stoppalo da dentro il debugger.
In questo modo puoi fermare persino i processi di sistema, ma non te lo
consiglio. ;-)
--
Lorenzo

 wrote in message
news:3d0a296b...@powernews.iol.it...


Non funziona neppure questo.
Qualunque operazione io faccia mi dice accesso negato.
Funziona solo il pulsante di reset!
"Lorenzo Lutti" <lorenz...@DOHtiscalinet.it> wrote in message
news:CeFO8.18320$j65.4...@twister1.libero.it...
