Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Freeze. en 25 Octubre 2007, 00:14 am



Título: Averiguar proceso de un archivo.
Publicado por: Freeze. en 25 Octubre 2007, 00:14 am
Bueno, un ejemplo es obtener la ruta o el nombre del archivo y que se devuelva el proceso (en tal caso que se este ejecutando).

estuve buscando en Google pero en este caso no encontre nada. >:( >:( >:(

La busqueda de el Foro no me arrojo ningún resultado :(


Título: Re: Averiguar proceso de un archivo.
Publicado por: HaDeS, - en 25 Octubre 2007, 00:37 am
Se puede hacer que se listen todos los procesos, se haya la ruta de cada proceso y se compare con la ruta que necesitas, con archivo te referis a ejecutables no?
bueno, yo tengo la medio idea de como hacer el code, si queres lo posteo, pero no es lo que pedis. (El code que pienso es listar los procesos y devolver ruta).

Saludos ;)


Título: Re: Averiguar proceso de un archivo.
Publicado por: Freeze. en 25 Octubre 2007, 00:43 am
Lo que sucede es que no es asi es al reves.

Tu dices:
Código:
Hallar procesos
Devolver la ruta

Yo digo:
Código:
Obtener la ruta
Hallar proceso de la ruta obtenida



De todas formas postea el codigo tal vez me sirve. ;)


Título: Re: Averiguar proceso de un archivo.
Publicado por: HaDeS, - en 25 Octubre 2007, 01:24 am
Bueno, lo que dije fue que no tenia la respuesta jajaj, pero idee una alternativa, y ya la habia posteado, primero se listan los procesos, los nombres o rutas de los procesos, y luego se compara con alguna string a ver si el proceso esta activo.
checa este codigo, hasta el momento solo llevo la parte del nombre del ejecutable, si queres hago el de la ruta completa
Código
  1. Option Explicit
  2. Private Const LETRAS As String = "abcdefghijklmnoñpqrstuvwxyz[].1234567890"
  3. Private Type PROCESSENTRY32
  4. dwSize As Long
  5. cntUsage As Long
  6. th32ProcessID As Long
  7. th32DefaultHeapID As Long
  8. th32ModuleID As Long
  9. cntThreads As Long
  10. th32ParentProcessID As Long
  11. pcPriClassBase As Long
  12. dwFlags As Long
  13. szExeFile As String * 260
  14. End Type
  15. Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
  16. Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
  17. Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
  18. Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
  19.  
  20. Private Sub Command1_Click()
  21. Dim hSnapShot#, ProcesoC#, ResP#, ProcesoC2#, R#, uProcess As PROCESSENTRY32
  22. hSnapShot = CreateToolhelp32Snapshot(&H2, 0&)
  23. uProcess.dwSize = Len(uProcess)
  24. R = Process32First(hSnapShot, uProcess)
  25. Do While R
  26.    If LCase$(Limpiar(uProcess.szExeFile)) = LCase$(Text1.Text) Then
  27.        MsgBox "Programa ejecutandose"
  28.        Exit Sub
  29.    End If
  30. R = Process32Next(hSnapShot, uProcess)
  31. Loop
  32. CloseHandle hSnapShot
  33. End Sub
  34.  
  35. Private Function Limpiar(proceso$)
  36. Dim i%
  37. For i = 1 To Len(proceso)
  38.    If InStr(1, LETRAS, Mid(proceso, i, 1), vbTextCompare) = 0 Then
  39.        proceso = Replace(proceso, Mid(proceso, i, 1), "")
  40.    End If
  41. Next i
  42. Limpiar = proceso
  43. End Function
  44.  
en text1.text metes el proceso que queres buscar, por ejemplo "notepad.exe"

saludos y espero que te sirva ;)


Título: Re: Averiguar proceso de un archivo.
Publicado por: abel_c_b en 25 Octubre 2007, 21:28 pm
hola hades, bueno por lo que veo y lo rapido que respondes eres una persona muy instruida en vb 6, te felicito, ahora yo tengo una duda con respecto a esto de los procesos:

con el codigo anterior, si quisiera saber el numero de identificacion que se le asigna a cada proceso, como lo sabria?

ademas, como lo compararia si la aplicacion es abierta mas de una vez, y como es logico van a tener numeros de identificacion de procesos diferentes, espero me haya explicado, saludos


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 25 Octubre 2007, 21:50 pm
ahora yo tengo una duda con respecto a esto de los procesos:

con el codigo anterior, si quisiera saber el numero de identificacion que se le asigna a cada proceso, como lo sabria?

En la estructura PROCESSENTRY32 hay un campo llamado th32ProcessID.


Título: Re: Averiguar proceso de un archivo.
Publicado por: HaDeS, - en 26 Octubre 2007, 01:57 am
Para comparar si la aplicación está abierta más de una vez, tenes dos vias, la primera es comparar nombres de los procesos, y la segunda añadir al código algo como:
Código
  1.    w = Limpiar(uProcess.szExeFile)
  2.    Text1.Text = Text1.Text & vbCrLf & w & " - " & uProcess.th32ParentProcessID
  3.  
En el bucle donde se inicia la búsqueda de los procesos.
El th32ParentProcessID, sirve para indicar cual es el proceso padre de una aplicación, este te podría servir para observar si la aplicación esta abierta más de una vez.

Saludos ;)


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 26 Octubre 2007, 08:03 am
Una breve acotacion: el parent no es 100% confiable ya que los PIDs se reciclan.


Título: Re: Averiguar proceso de un archivo.
Publicado por: HaDeS, - en 26 Octubre 2007, 22:03 pm
Una breve acotacion: el parent no es 100% confiable ya que los PIDs se reciclan.
Por eso dije que se podian tomar dos vías, la primera comparar el nombre del proceso, aunque esta también es insegura, y la del parent id. Pensandolo mejor, se podría programar algo para que según el proceso me devuelva la ruta de donde se está ejecutando el programa, así, se podría comparar un proceso con diferente id.

Saludos ;)


Título: Re: Averiguar proceso de un archivo.
Publicado por: Freeze. en 26 Octubre 2007, 23:37 pm
se podría programar algo para que según el proceso me devuelva la ruta de donde se está ejecutando el programa.

Justo lo que yo quiero.!! ;) ;) ;)

PD: Se adueñaron de mi Post xD xD xD


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 26 Octubre 2007, 23:51 pm
En ese caso podes recurrir a Module32First (el primer modulo siempre es el ejecutable) y el campo szExePath de la estructura MODULEENTRY32. Sino tambien GetModuleFileNameEx ...


Título: Re: Averiguar proceso de un archivo.
Publicado por: Freeze. en 27 Octubre 2007, 00:04 am
Disculpame, podrias aclararme bien como hacelo...?

Espero que no sea una molestia :(


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 27 Octubre 2007, 00:07 am
Disculpame, podrias aclararme bien como hacelo...?

Espero que no sea una molestia :(

La primera forma es exactamente igual que Process* solo que mas simple, no necesitas enumerar todos los modulos, el que te interesa es el primero.

Para la segunda necesitas abrir un HANDLE al proceso (OpenProcess) y despues pasarle a GetModuleFileNameEx ese handle como primer parametro, cero como segundo, un puntero a cadena como tercero y el tamaño de la misma como cuarto y ultimo.

Hace muchos años que no programo en VB asi que te doy una descripcion teorica, para la primera forma te podes guiar con el codigo que esta arriba, sigue la misma logica.


Título: Re: Averiguar proceso de un archivo.
Publicado por: Freeze. en 27 Octubre 2007, 00:15 am
De este tipo de Apis no se mucho, no entiendo como obtener el Handle. :( :( :(


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 27 Octubre 2007, 00:19 am
De este tipo de Apis no se mucho, no entiendo como obtener el Handle. :( :( :(

Si usas Module32First no necesitas ningun HANDLE.


Título: Re: Averiguar proceso de un archivo.
Publicado por: Freeze. en 27 Octubre 2007, 00:29 am
Encontre este codigo, pero no me da la ruta completa:
Código:
Private Type MODULEENTRY32
  dwSize As Long
  th32ModuleID As Long
  th32ProcessID As Long
  GlblcntUsage As Long
  ProccntUsage As Long
  modBaseAddr As Long
  modBaseSize As Long
  hModule As Long
  szModule As String * 256
  szExePath As String * 260
End Type
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Private Sub Form_Load()
Dim uProcess As MODULEENTRY32
Form1.AutoRedraw = True
lProcessID = GetCurrentProcessId
hSnapshot = CreateToolhelp32Snapshot(8, 0)
uProcess.dwSize = Len(uProcess)
n = Module32First(hSnapshot, uProcess)
Do While n
Form1.Print Left(uProcess.szModule, InStr(uProcess.szModule, Chr(0)) - 1)
n = Module32Next(hSnapshot, uProcess)
Loop
End Sub


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 27 Octubre 2007, 00:31 am
Usa szExePath no szModule.


Título: Re: Averiguar proceso de un archivo.
Publicado por: Freeze. en 27 Octubre 2007, 00:34 am
Gracias.

I love You..! xD


Título: Re: Averiguar proceso de un archivo.
Publicado por: HaDeS, - en 27 Octubre 2007, 00:50 am
Editado: Este es mi Código::
Código
  1. Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
  2. Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
  3. Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
  4. Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
  5. Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal Handle As Long) As Long
  6. Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
  7.  
  8. Private Sub Command1_Click()
  9. Dim Procesos() As Long, cb&, cb2&, cbNeeded&, Ret&, Proceso&, Modulos(1 To 200) As Long, Elementos&, NombrePath$
  10.  
  11. cb = 16
  12. cbNeeded = 96
  13. Do While cb <= cbNeeded
  14.    cb = cb * 2
  15.    ReDim Procesos(cb / 4)
  16.    EnumProcesses Procesos(1), cb, cbNeeded
  17. Loop
  18. Elementos = cbNeeded / 4
  19. For i = 1 To Elementos
  20. Proceso = OpenProcess(1024 Or 16, 0, Procesos(i))
  21. If Proceso <> 0 Then
  22.    Ret = EnumProcessModules(Proceso, Modulos(1), 200, cb2)
  23.    If Ret <> 0 Then
  24.        NombrePath = Space(260)
  25.        GetModuleFileNameExA Proceso, Modulos(1), NombrePath, 500
  26.        If Procesos(i) <> GetCurrentProcessId Then
  27.            NombrePath = Replace(Replace(NombrePath, "\systemroot\", "c:\windows\", , , vbTextCompare), "\??\", "")
  28.            Text1.Text = Text1.Text & vbCrLf & NombrePath
  29.            Text1.Text = Text1.Text & " - " & Procesos(i)
  30.        End If
  31.    End If
  32. End If
  33. CloseHandle Proceso
  34. Next
  35. End Sub
  36.  

Saludos!

Editado: Para que el código te quede bien funcional, minimamente tenes que usar las apis, EnumProcess, OpenProcess, EnumProcessModules y GetModuleFileNameExA, porque si quitas por ejemplo EnumProcessModules, en el text1.text algunas lineas quedarían vacias y el resultado sería pésimo.


Título: Re: Averiguar proceso de un archivo.
Publicado por: Eternal Idol en 27 Octubre 2007, 22:10 pm
De nada ►Freeze, para la segunda forma no necesitas usar mas que OpenProcess y GetModuleFileNameEx con 0 como el segundo parametro, ya que como indica la documentacion:

hModule
[in] Handle to the module. If this parameter is NULL, GetModuleFileNameEx returns the path of the executable file of the process specified in hProcess.

Por cierto si necesitas trabajar con servicios habilita el privilegio SE_DEBUG_NAME primero.