Holas, es que probando un codigo para matar procesos en win98, el cual esta mediado por las APIs Terminate Process y Open process, me dio por probarlo en winXP, pero este ya no funciona, puesto que no obtiene el handle creo que en la API de terminate process (creo), y quisiera que alguien me pudiera explicar que ha cambiado, o que API debo utilizar ahora, de antemano gracias por responder ;D
checa este articulo: http://www.gamarod.com.ar/trucos/cancelar_un_proceso_kill.asp
no se si funcione, no tuve tiempo de probaro.
yo tenia un codigo, pero no se donde pueda estar.
Ummm, el que se utiliza en win98 es casi el mismo, menos la del getExitCode, lo probaré, pero debo decir que la API que no funciona esta entre OpenProcess o TerminateProcess y aun no sé si estas cambiaron en WinXp, y por eso el codigo de Win98 no funciona...
Gracias por responder.
checa este codigo que hice:
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
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()
MatarProceso "notepad.exe"
End Sub
Estoy en winxp y me funca :P
saludos ;)
Editado:
si no te funciona este, podes hacer una variante de cerrar la aplicacion y es por medio del postmessage con un quit o un destroy a la ventana que queres cerrar.
estoy en XP y funciona de maravilla.
La API TerminateProcess es reconocida por la heurística de muchos antivirus, mirate los comandos taskkill y tskill
Shell taskkill /F /IM proceso.exe
Aunke necesitarás cifrar las strings...
Saludos ;)
Al momento de responder este post, tambien vi la posibilidad de meter ese codigo, el unico problema que hay con el, es que no todos los windows poseen esos ejecutables, asi que ese codigo seria totalmente desechable.
ahora mande mi code compilado a www.virustotal.com y ningun antivirus lo detecto :/, asi que no se porq hablas de que lo reconocen muchos antivirus.
saludos :)
Pués sinceramente, hay antivirus que detectan un programa por usar la API TerminteProcess...pero a lo mejor si no la usas en el load o as´no te la detecta no se bien...yo por asegurar uso taskkkill....
Saludos ;)
(: No es mi proposito pelear, pero insisto en que es confiable usar el code porq envie de nuevo el file a virustotal.com con el code en vez de los subs y el command1 en el load, y pues dio el mismo resultado de 32 antivirus ninguno lo detecto. y no uso ejecutables externos a la aplicacion porq depronto no existe ese ejecutable. como añadido a tu codigo podriamos hacer algo como:
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
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 " & ProcesoTxt.Text
End If
End Sub
bueno, saludos (;
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...
Y lo mejor es cifrar la string pork si los AVs encuentran taskkill.exe en el código hexadecimal pueden sospechar...Usad StrReverse que es de lo más facil si no quieres poner un tipo de encriptacion más fuerte...
Saludos ;)
Cita de: nhaalclkiemr en 21 Octubre 2007, 15:33 PM
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 ;)
Hay si perdon no me fijara... :-X
Aún así te faltaría el Else del If
Saludos ;)
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
Ok, gracias, vere si lo puedo acortar un poco más.
Pero GRACIAS por tu aporte. ::)
:) Hola gente, mi primer post en el foro :P 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 :P (Este lo pueden descartar si quieren xD)
;) Saludos
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!
;) 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
:rolleyes: Estaba pensando en que la inyección de una DLL es posible
:xD aunque algo compleja....
;D Saludos!