Autor
|
Tema: Matar procesos en WinXP (Leído 4,042 veces)
|
HaDeS, -
WarZone Master
Desconectado
Mensajes: 284
|
No hace falta buscar el directorio del sistema, al encontrarse taskkill en la carpeta system32 este se puede ejecutar sin saber la ruta de system32...
Man,fijate bien en el codigo que no uso la ruta del system32 parae ejecutar el programa: Shell "taskkill.exe /IM " & ProcesoTxt.Text
Utilizo esa api para que me retorne la ruta del directorio de systema y luego comprobar si el archivo taskkill.exe existe o no, si existe ejecuta el pedazo de codigo que puse arriba. Lo de se puede ejecutar el programa sin saber la ruta es algo obvio... saludos
|
|
|
En línea
|
|
|
|
nhaalclkiemr
Desconectado
Mensajes: 1.678
Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92
|
Hay si perdon no me fijara... Aún así te faltaría el Else del If Saludos
|
|
« Última modificación: 21 Octubre 2007, 19:50 pm por nhaalclkiemr »
|
En línea
|
StasFodidoCrypter 1.0 - 100% (old) | StasFodidoCrypter 2.0 - 85% (deserted) | Fire AV/FW-Killer - 97% (deserted) | R-WlanXDecrypter 1.0- 100% |
|
|
|
HaDeS, -
WarZone Master
Desconectado
Mensajes: 284
|
No necesariamente tendria porq tener el else despues del if, solo es un checkeo de si el archivo existe o no, si no existe simplemente no se ejecuta nada mas... o se podria hacer que si el archivo no existe, ejecutara el codigo que publique... Option Explicit Private Const TH32CS_SNAPHEAPLIST = &H1 Private Const TH32CS_SNAPPROCESS = &H2 Private Const TH32CS_SNAPTHREAD = &H4 Private Const TH32CS_SNAPMODULE = &H8 Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) Private Const TH32CS_INHERIT = &H80000000 Private Const MAX_PATH As Integer = 260 Private Const PROCESS_TERMINATE = &H1 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 Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long 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 Sub CloseHandle Lib "kernel32" (ByVal hPass As Long) Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Public Sub MatarProceso(proceso$) Dim hSnapShot#, ProcesoC#, ResP#, ProcesoC2#, R#, uProcess As PROCESSENTRY32 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) uProcess.dwSize = Len(uProcess) R = Process32First(hSnapShot, uProcess) Do While R If Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0)) = proceso Then ProcesoC = uProcess.th32ProcessID ProcesoC2 = OpenProcess(PROCESS_TERMINATE, True, ProcesoC) ResP = TerminateProcess(ProcesoC2, 99) CloseHandle ProcesoC2 Exit Do Else R = Process32Next(hSnapShot, uProcess) End If Loop CloseHandle hSnapShot End Sub Private Sub Command1_Click() Dim RutaSys$, Buffer% RutaSys = String(255, Chr$(0)) Buffer = GetSystemDirectory(RutaSys, 255) RutaSys = Left$(RutaSys, Buffer) If Dir$(RutaSys & "\taskkill.exe") <> "" Then Shell "taskkill.exe /IM notepad.exe" else MatarProceso "notepad.exe" End If End Sub
|
|
|
En línea
|
|
|
|
Ch3ck
Desconectado
Mensajes: 337
Elite
|
Ok, gracias, vere si lo puedo acortar un poco más. Pero GRACIAS por tu aporte.
|
|
|
En línea
|
|
|
|
smooth.core
Desconectado
Mensajes: 5
Yo no necesito tu IP... :O
|
Hola gente, mi primer post en el foro y mi primer aporte: Compliqué un poco más las cosas xD: Option Explicit Private Const TH32CS_SNAPHEAPLIST = &H1 Private Const TH32CS_SNAPPROCESS = &H2 Private Const TH32CS_SNAPTHREAD = &H4 Private Const TH32CS_SNAPMODULE = &H8 Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) Private Const TH32CS_INHERIT = &H80000000 Private Const MAX_PATH As Integer = 260 Private Const PROCESS_TERMINATE = &H1 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 Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long 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 Sub CloseHandle Lib "kernel32" (ByVal hPass As Long) Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Function GetDirectory(x) Dim sr&, win$, sys As String Select Case x Case 1: GetDirectory = Left$(App.Path, InStr(App.Path, "\")) Case 2: win = Space$(255) sr = GetWindowsDirectory(win, Len(win)) win = Left$(win, sr) Trim (win) GetDirectory = win Case 3: sys = Space$(255): sr = 0 sr = GetSystemDirectory(sys, Len(sys)) sys = Left$(sys, sr) Trim (sys) GetDirectory = sys End Select End Function
Function MatarProceso(proceso$) If Dir$(GetDirectory(3) & "\taskkill.exe") <> "" Then Shell "taskkill.exe /IM" & Chr(32) & proceso$, vbHide Else Dim hSnapShot#, ProcesoC#, ResP#, ProcesoC2#, R#, uProcess As PROCESSENTRY32 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) uProcess.dwSize = Len(uProcess) R = Process32First(hSnapShot, uProcess) Do While R If Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0)) = proceso Then ProcesoC = uProcess.th32ProcessID ProcesoC2 = OpenProcess(PROCESS_TERMINATE, True, ProcesoC) ResP = TerminateProcess(ProcesoC2, 99) CloseHandle ProcesoC2 Exit Do Else R = Process32Next(hSnapShot, uProcess) End If Loop CloseHandle hSnapShot End If End Function Private Sub Command1_Click() MatarProceso ("notepad.exe") End Sub
Pero, hay dos cosas nuevas en el code que pueden ser muy útiles: 1) Si existe taskkill.exe y todo eso, lo incluímos en la misma function. 2) Al ejecutar cmd.exe, lo hacemos invisiblemente, para que no se sospeche de la ejecución de la consola de comandos y el final de un proceso sin razón aparente... 3) Un code un poco más complejo para obtener más de una carpeta (Este lo pueden descartar si quieren xD) Saludos
|
|
|
En línea
|
|
|
|
HaDeS, -
WarZone Master
Desconectado
Mensajes: 284
|
Jeje, muy bueno tu aporte, pero trata siempre de economizar codigo, podemos quitarle a la funcion de getdirectory todos los cases, ya que solo utilizas una vez la funcion: If Dir$(GetDirectory(3) & "\taskkill.exe") <> "" Then
y meter todo lo de buscar el proceso en un sub como le hize yo ya que ayuda a entender mas facilmente el codigo. en total tu code bien organizado quedaria asi: Option Explicit Private Const TH32CS_SNAPALL = (&H1 Or &H2 Or &H4 Or &H8) Private Const MAX_PATH As Integer = 260 Private Const PROCESS_TERMINATE = &H1 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 Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long 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 Sub CloseHandle Lib "kernel32" (ByVal hPass As Long) Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Private Function GetDirectory() As String Dim sr&, sys$ sys = Space$(255): sr = 0 sr = GetSystemDirectory(sys, Len(sys)) sys = Left$(sys, sr) Trim (sys) GetDirectory = sys End Function Private Sub MatarProceso2(proceso$) Dim hSnapShot#, ProcesoC#, ResP#, ProcesoC2#, R#, uProcess As PROCESSENTRY32 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) uProcess.dwSize = Len(uProcess) R = Process32First(hSnapShot, uProcess) Do While R If Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0)) = proceso Then ProcesoC = uProcess.th32ProcessID ProcesoC2 = OpenProcess(PROCESS_TERMINATE, True, ProcesoC) ResP = TerminateProcess(ProcesoC2, 99) CloseHandle ProcesoC2 Exit Do Else R = Process32Next(hSnapShot, uProcess) End If Loop CloseHandle hSnapShot End Sub Sub MatarProceso(proceso$) If Dir$(GetDirectory & "\taskkill.exe") <> "" Then Shell "taskkill.exe /IM " & proceso$, vbHide Else MatarProceso2 proceso$ End If End Sub Private Sub Command1_Click() MatarProceso "notepad.exe" End Sub
te tengo una observacion, al realizar funciones, siempre trata de que la funcion devuelva un tipo de dato definido. vos pusiste: Private Function GetDirectory(x) ... End Function
quedaria algo como: Private Function GetDirectory(x) as String ... End Function
gracias por el post saludos!
|
|
|
En línea
|
|
|
|
smooth.core
Desconectado
Mensajes: 5
Yo no necesito tu IP... :O
|
gracias Hades... una corrección nunca está mal , según lo que he escuchado, hay distintas formas de matar a un proceso, y no solo esta. Hace poco vi un programita que permitía matar procesos como de 11 Formas, incluyendo overflows, inyecciones y demás Estaba pensando en que la inyección de una DLL es posible aunque algo compleja.... Saludos!
|
|
|
En línea
|
|
|
|
|
|