Matar procesos en WinXP

Iniciado por Ch3ck, 17 Octubre 2007, 03:20 AM

0 Miembros y 1 Visitante están viendo este tema.

Ch3ck

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

SERBice

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.

Ch3ck

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.

HaDeS, -

#3
checa este codigo que hice:
Código (vb) [Seleccionar]

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.

XP.

estoy en XP y funciona de maravilla.

nhaalclkiemr

La API TerminateProcess es reconocida por la heurística de muchos antivirus, mirate los comandos taskkill y tskill

Código (vb) [Seleccionar]
Shell taskkill /F /IM proceso.exe

Aunke necesitarás cifrar las strings...

Saludos ;)
StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%

HaDeS, -

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 :)

nhaalclkiemr

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 ;)
StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%

HaDeS, -

(: 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:
Código (vb) [Seleccionar]

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 (;

nhaalclkiemr

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 ;)
StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%