elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  TerminateProcessByName [VB6]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: TerminateProcessByName [VB6]  (Leído 4,950 veces)
The Swash

Desconectado Desconectado

Mensajes: 194


Programmer


Ver Perfil WWW
TerminateProcessByName [VB6]
« en: 11 Abril 2010, 00:32 am »

Código:
Option Explicit
'----------------------------------------------------------------------------------------
' Module     : TerminateProcessByName
' Purpose    : Finalize a process by name
' Author     : The Swash
' References : API-Guide and MSDN
' DateTime   : 10/04/2010
' Dedicated  : Karcrack, Cobein And Hacker_Zero
'----------------------------------------------------------------------------------------
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Constants
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const STILL_ACTIVE = &H103

'Type PROCESSENTRY32
Private 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

Public Function TerminateProcessByName(ByVal sProcess As String) As Long
Dim hCTHS As Long
Dim hProc As PROCESSENTRY32
Dim hBase As Long
Dim sBuff As String
Dim hPID As Long
Dim hOpen As Long
Dim hGECP As Long
Dim hTerminate As Long

 hCTHS = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
 hProc.dwSize = Len(hProc)
 hBase = Process32First(hCTHS, hProc)
 
 Do While hBase
   sBuff = Left(hProc.szExeFile, GetLongString(hProc.szExeFile))
   If InStr(1, sBuff, sProcess, vbTextCompare) > 0 Then hPID = hProc.th32ProcessID
   hBase = Process32Next(hCTHS, hProc)
 Loop
 
 Call CloseHandle(hCTHS)
 
 If hPID > 0 Then
   hOpen = OpenProcess(PROCESS_ALL_ACCESS, 0, hPID)
   hGECP = GetExitCodeProcess(hOpen, 0&)
   hTerminate = TerminateProcess(hOpen, hGECP)
   If hTerminate <> 0 Then
     TerminateProcessByName = 1
     Else
     TerminateProcessByName = 0
   End If
 End If

 Call CloseHandle(hOpen)
 
End Function

'Get Long of string
Public Function GetLongString(ByVal sData As String) As Long
 If InStr(1, sData, Chr(0)) > 0 Then
   GetLongString = InStr(1, sData, Chr(0)) - 1
   Else
   GetLongString = Len(sData)
 End If
End Function

Call:
Código:
Call TerminateProcessByName("msnmsgr.exe")

Con este modulo podemos finalizar procesos solo con su nombre =D de manera sencilla.
Provado en Windows XP Service Pack 3

Agradecimientos a Hacker_Zero por ayudarme a solucionar un error logico =P


En línea

fede_cp


Desconectado Desconectado

Mensajes: 527


"porque pensar nunca fue entender"


Ver Perfil WWW
Re: TerminateProcessByName [VB6]
« Respuesta #1 en: 11 Abril 2010, 01:18 am »

Mirá que bueno, me gusto.

felicitaciones, tendría que probarlo pero vb ya lo estoy dejando y me estoy tirando a otros (php, ajax) mas orientadio a web.


saludos!


En línea

somos lo que hacemos para cambiar lo que somos

http://elhackerblog.blogspot.com el blog de elhacker.net!!
skyweb07

Desconectado Desconectado

Mensajes: 122


The ghost of the network


Ver Perfil
Re: TerminateProcessByName [VB6]
« Respuesta #2 en: 11 Abril 2010, 13:01 pm »

Bueno aqui mejore un poco la función original por The Swash y le puse algunos detallitos como que pueda matar más de un proceso a la vez y organize un poco el code, saludos ;)

Código:

Option Explicit
'----------------------------------------------------------------------------------------
' Module     : TerminateProcessByName
' Purpose    : Finalize a process by name
' Author     : The Swash
' References : API-Guide and MSDN
' DateTime   : 10/04/2010
' Dedicated  : Karcrack, Cobein And Hacker_Zero
' Edited     : Skyweb07 - Add MultiProcess Kill and Comment Code.
'----------------------------------------------------------------------------------------
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Constants
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const STILL_ACTIVE = &H103
Const INVALID_HANDLE_VALUE As Long = -1

'Type PROCESSENTRY32
Private 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

Public Function TerminaterProcessByNames(ByRef sProcess() As String) As Long
    
    Dim uProcess    As PROCESSENTRY32
    Dim hSnapShot   As Long
    Dim hProcess    As String
    Dim hFirst      As Long
    Dim hNext       As Long
    Dim hItem       As Integer
    Dim hCount      As Long
    Dim hOpen       As Long
    Dim hExit       As Long
    Dim hTerminate  As Long
    
    If UBound(sProcess) > 0 Then ' // Si hay al menos un proceso que matar.
    
    uProcess.dwSize = Len(uProcess) ' // Asignamos el tamaño de la extructura.
    
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) ' // Toma una instantánea del proceso y devuelve el handle del mismo.
    
    If hSnapShot <> INVALID_HANDLE_VALUE Then ' // Si no devuelve error y nos devuelve el handle.
    
    hFirst = Process32First(hSnapShot, uProcess) ' // Enumeramos el primero proceso de la lista.
    
    Do
      
       hProcess = LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, Chr$(0)) - 1)) ' // Solo para separar los espacios en blanco que tiene el nombre del proceso y ponerlo todo en modo minuscula.
    
    For hItem = 0 To UBound(sProcess) ' // Cogemos y vamos comparando la lista de procesos con el proceso actual.
 
        If InStr(1, hProcess, LCase$(sProcess(hItem))) > 0 Then ' // Si encuentra el nombre del proceso...
            
            hOpen = OpenProcess(PROCESS_ALL_ACCESS, 0&, uProcess.th32ProcessID) ' // Abrimos el proceso.
            hExit = GetExitCodeProcess(hOpen, 0&) ' // Recupera el estado de finalización del proceso especificado.
            hTerminate = TerminateProcess(hOpen, hExit) ' // Terminamos el proceso.
            
            If hTerminate <> 0 Then ' // Si nos devuelve un valor desigual a 0 es que lo mato.
                hCount = hCount + 1 ' // Por lo que sumamos uno a la cuenta total de matados.
            End If
 
        End If
    
    Next hItem ' // Siguiente proceso de la lista.
    
    DoEvents ' // Para que no se cuelgue.
    
    Loop Until Process32Next(hSnapShot, uProcess) = False ' // Un bucle hasta que la función devuelva un valor False.
    
    End If
    
    End If
      
    CloseHandle hSnapShot ' // Cerramos el handle.
    CloseHandle hOpen ' // Cerramos el hanlde.
    
    TerminaterProcessByNames = hCount ' // Asignamos el valor de la cuenta de procesos matados.
    
End Function


El modo de uso es simple , solo tienen que crear un array con el listado de proceos y llamar a la función EJ:

PD: Provado en XP/Vista/7

Código:

Dim List(1) As String

List(0) = "notepad.exe"
List(1) = "charmap.exe"
 
Call TerminaterProcessByNames(List)

« Última modificación: 11 Abril 2010, 13:20 pm por skyweb07 » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: TerminateProcessByName [VB6]
« Respuesta #3 en: 11 Abril 2010, 19:37 pm »

 :rolleyes: :rolleyes: :rolleyes:

Hay un error muuuuy grave... Usar InStr()... Si el proceso que quiero matar se llama "plorer.exe" adivinad que pasará con el "explorer.exe" :laugh: Ademas, si hay mas de un proceso con el mismo nombre solo cerrara el ultimo

Como sabeis me gustan las cosas minimalistas, asi que lo he hecho lo mas corto posible (usando WMI) ;)
Código
  1. Private Sub CloseProcessesByName(ParamArray vNames() As Variant)
  2.    Dim vName           As Variant
  3.    Dim oProc           As Object
  4.    Dim oWMI            As Object
  5.  
  6.    For Each vName In vNames
  7.        For Each oProc In GetObject( _
  8.                            "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
  9.                            "SELECT * FROM Win32_Process WHERE Name = '" & vName & "'")
  10.            Call oProc.Terminate
  11.        Next oProc
  12.    Next vName
  13. End Sub

Ejemplo:
Código
  1. Call CloseProcessesByName("calc.exe", "notepad.exe", "winmine.exe", "wmplayer.exe")

Saludos ;D
En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: TerminateProcessByName [VB6]
« Respuesta #4 en: 11 Abril 2010, 22:20 pm »

Karcrack eres un genio...

decididamente estas a un nivel altisimo.

salu2!
En línea

Un byte a la izquierda.
skyweb07

Desconectado Desconectado

Mensajes: 122


The ghost of the network


Ver Perfil
Re: TerminateProcessByName [VB6]
« Respuesta #5 en: 11 Abril 2010, 23:11 pm »

:rolleyes: :rolleyes: :rolleyes:

Hay un error muuuuy grave... Usar InStr()... Si el proceso que quiero matar se llama "plorer.exe" adivinad que pasará con el "explorer.exe" :laugh: Ademas, si hay mas de un proceso con el mismo nombre solo cerrara el ultimo

Como sabeis me gustan las cosas minimalistas, asi que lo he hecho lo mas corto posible (usando WMI) ;)
Código
  1. Private Sub CloseProcessesByName(ParamArray vNames() As Variant)
  2.    Dim vName           As Variant
  3.    Dim oProc           As Object
  4.    Dim oWMI            As Object
  5.  
  6.    For Each vName In vNames
  7.        For Each oProc In GetObject( _
  8.                            "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
  9.                            "SELECT * FROM Win32_Process WHERE Name = '" & vName & "'")
  10.            Call oProc.Terminate
  11.        Next oProc
  12.    Next vName
  13. End Sub

Ejemplo:
Código
  1. Call CloseProcessesByName("calc.exe", "notepad.exe", "winmine.exe", "wmplayer.exe")

Saludos ;D


Si es cierto lo del Instr(), eso se podria arreglar cambiando la linea

Código
  1. If InStr(1, hProcess, LCase$(sProcess(hItem))) > 0 Then ' // Si encuentra el nombre del proceso...
  2.  

por....

Código
  1. If Trim$(LCase$(hProcess)) = Trim$(LCase$(sProcess(hItem)))  Then ' // Si el nombre del proceso es igual al que se esta buscando.
  2.  

Y si hay más de un proceso con el mismo nombre si que lo mataria ya que lista de proceso en proceso y va comparando con la lista ;) , pruevalo y veras  ;D ... Ah estoy contigo en lo de los codes minimalistas pero WMI no me parece la mejor opción debido a que no esta habilitado en todos los PC's .... Saludos  :xD

En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: TerminateProcessByName [VB6]
« Respuesta #6 en: 11 Abril 2010, 23:18 pm »

Si bueno, yo comente el codigo de Swash, ahora que miro el tuyo si que mataria a todos los del mismo nombre, el suyo no ;)

Respecto a WMI, es el mejor modo de asegurarse compatibilidad :P Aun asi sigo prefiriendo APIs... pero en este caso me quedo con WMI, porque es como 20 veces mas corto :xD

Ah! Si no me equivoco taskkill.exe trabaja con WMI, si este funciona asi... no creo que haya problemas al usarlo yo :xD

Saludos ;)
En línea

fede_cp


Desconectado Desconectado

Mensajes: 527


"porque pensar nunca fue entender"


Ver Perfil WWW
Re: TerminateProcessByName [VB6]
« Respuesta #7 en: 12 Abril 2010, 00:03 am »

Te gusta el minimalismo karcrack!!  1+

que bueno, no sabia que lo conozcan eso.


saludos!
En línea

somos lo que hacemos para cambiar lo que somos

http://elhackerblog.blogspot.com el blog de elhacker.net!!
DragonsWP

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: TerminateProcessByName [VB6]
« Respuesta #8 en: 13 Abril 2010, 02:44 am »

:rolleyes: :rolleyes: :rolleyes:

Hay un error muuuuy grave... Usar InStr()... Si el proceso que quiero matar se llama "plorer.exe" adivinad que pasará con el "explorer.exe" :laugh: Ademas, si hay mas de un proceso con el mismo nombre solo cerrara el ultimo

Como sabeis me gustan las cosas minimalistas, asi que lo he hecho lo mas corto posible (usando WMI) ;)
Código
  1. Private Sub CloseProcessesByName(ParamArray vNames() As Variant)
  2.    Dim vName           As Variant
  3.    Dim oProc           As Object
  4.    Dim oWMI            As Object
  5.  
  6.    For Each vName In vNames
  7.        For Each oProc In GetObject( _
  8.                            "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
  9.                            "SELECT * FROM Win32_Process WHERE Name = '" & vName & "'")
  10.            Call oProc.Terminate
  11.        Next oProc
  12.    Next vName
  13. End Sub

Ejemplo:
Código
  1. Call CloseProcessesByName("calc.exe", "notepad.exe", "winmine.exe", "wmplayer.exe")

Saludos ;D

Wow veo que sos Regroso, un favor me podrias ayudar, si lo que quiero es que mate todo proceso que no este en la lista como haria eso.
Muchas Gracias por su Atenciòn
En línea

Lupin

Desconectado Desconectado

Mensajes: 153



Ver Perfil
Re: TerminateProcessByName [VB6]
« Respuesta #9 en: 13 Abril 2010, 04:00 am »

este tipo de codigos minimalistas solo se ven aqui.... ;-) ;-)
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines