Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: dust564 en 6 Junio 2015, 23:54 pm



Título: Listar procesos y rutas en ListBox
Publicado por: dust564 en 6 Junio 2015, 23:54 pm
Se me ha ocurrido una idea, pero buscando en internet solo he encontrado información aplicable a versiones bastante antiguas de visual basic o código inservible.

Idea:
Al activarse un evento (pulsar un botón o por el tiempo de un timer, por ejemplo) el programa carga en un ListBox la ruta de todos los archivos en ejecución. Luego genera un hash de cada archivo y busca si el hash existe en otro ListBox. Si existe, cierra el proceso.

Es decir, que compruebe si un ejecutable está en una "lista negra"

Lo que no se hacer:
-> Listar los procesos y sus rutas en un ListBox

--
Salu2


Título: Re: Listar procesos y rutas en ListBox
Publicado por: Eleкtro en 7 Junio 2015, 02:29 am
¿Estás compilando la app bajo x86, x64, o neutral?.

¿Alguna limitación en la versión objetivo de .Net framework? (-LINQ)

¿C#, Vb.Net, o cualquiera de los dos?, no somos adivinos.

Puedes utilizar la Class "Process":

Código
  1. Dim blacklisted As IEnumerable(Of String) =
  2.    {
  3.        "audiodg",
  4.        "csrss",
  5.        "Idle",
  6.        "services",
  7.        "smss",
  8.        "System"
  9.    }
  10.  
  11. Dim processes As IEnumerable(Of Process) =
  12.    System.Diagnostics.Process.GetProcesses
  13.  
  14. Dim pNames As IEnumerable(Of String) =
  15.    From p As Process In processes
  16.    Where Not blacklisted.Contains(p.ProcessName)
  17.    Order By p.ProcessName Ascending
  18.    Select String.Format("{0}.exe", p.ProcessName).ToLower
  19.    Distinct
  20.  
  21. Dim pPaths As IEnumerable(Of String) =
  22.    From p As Process In processes
  23.    Where Not blacklisted.Contains(p.ProcessName)
  24.    Order By p.MainModule.FileName Ascending
  25.    Select p.MainModule.FileName.ToLower
  26.    Distinct
  27.  
  28. ListBox1.Items.AddRange(pPaths.ToArray)

Y, si estás desarrollando la app para arquitectura x86, para comunicarte con los procesos x64 puedes realizar una consulta a WMI (Windows Management Instrumentation):

Win32_Process class (Windows) - MSDN (https://msdn.microsoft.com/en-us/library/aa394372%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)

Código
  1. Public Shared Function GetProcesses() As ManagementObjectCollection
  2.  
  3.    Using searcher As New ManagementObjectSearcher(queryString:="SELECT * FROM Win32_Process")
  4.  
  5.        Return searcher.Get
  6.  
  7.    End Using
  8.  
  9. End Function
  10.  
  11. Dim processes As ManagementObjectCollection =
  12.    GetProcesses()
  13.  
  14. Dim pNames As IEnumerable(Of String) =
  15.    From mo As ManagementObject In processes.Cast(Of ManagementObject)()
  16.    Order By DirectCast(mo.Properties("Name").Value, String) Ascending
  17.    Select DirectCast(mo.Properties("Name").Value, String).ToLower
  18.    Distinct
  19.  
  20. Dim pPaths As IEnumerable(Of String) =
  21.    From mo As ManagementObject In processes.Cast(Of ManagementObject)()
  22.    Where Not mo.Properties("ExecutablePath").Value Is Nothing
  23.    Order By DirectCast(mo.Properties("ExecutablePath").Value, String).ToLower Ascending
  24.    Select DirectCast(mo.Properties("ExecutablePath").Value, String).ToLower
  25.    Distinct
  26.  
  27. ListBox1.Items.AddRange(pPaths.ToArray)

Nota: Recuerda que la Class "ManagementObjectCollection" es Disposable.

También puedes utilizar las funciones de la API de Windows:
Process Walking - MSDN (https://msdn.microsoft.com/en-us/library/ms684887%28v=VS.85%29.aspx)
PSAPI Functions - MSDN (https://msdn.microsoft.com/en-us/library/ms684894%28v=vs.85%29.aspx)

(de esto no pongo un ejemplo ya que no tengo ...pero por Google debe haber; y elaborarlo me costaría el esfuerzo de escribir aproximadamente +1.000 lineas de P/Invoking)

Saludos!


Título: Re: Listar procesos y rutas en ListBox
Publicado por: nolasco281 en 7 Junio 2015, 07:58 am
Hola como estan se que no es mi hilo pero queria hacer unas pregunta en estas partes.

Este trozo de codigo  son los procesos que no deberian ejecutarse y en caso que desee mostrar todos los procesos deberia de agregarlos al array?
Código
  1. Dim blacklisted As IEnumerable(Of String) =
  2.    {
  3.        "audiodg",
  4.        "csrss",
  5.        "Idle",
  6.        "services",
  7.        "smss",
  8.        "System"
  9.    }
  10.  

y esta parte por que solo muestra la ruta del  proceso pero no el nombre o la ruta ya contiene el nombre del proceso? por que declara pNames.

Código
  1. ListBox1.Items.AddRange(pPaths.ToArray)

Ya que me dice lo siquiente

(http://1.bp.blogspot.com/-xKmAeekfU70/VXPdKHjzqnI/AAAAAAAAA9M/jRm0RtjKWLk/s1600/errorDuda.png)

Saludos.

Pd: Disculpas por comentar pero tengo esas peque~nas curiosidades



Hola gracias por responder las dudas.

Leere un poco mas las clase process para poder manejar, efectivamente cambien los procesos de la lista lo probe tanto con listview como con listbox cambie algunas cositas, y ya muestra su ruta.

Muchas gracias : )

Saludos.


Título: Re: Listar procesos y rutas en ListBox
Publicado por: Eleкtro en 7 Junio 2015, 09:43 am
Este trozo de codigo  son los procesos que no deberian ejecutarse y en caso que desee mostrar todos los procesos deberia de agregarlos al array?
Código
  1. Dim blacklisted As IEnumerable(Of String) =
  2.    {
  3.        "audiodg",
  4.        "csrss",
  5.        "Idle",
  6.        "services",
  7.        "smss",
  8.        "System"
  9.    }
  10.  

Son los procesos de la lista negra, procesos excluidos de la query de LINQ.

Idle y System son pseudo-procesos (y por lo tanto, daría error la query al intentar obtener una ruta que no existe), y los otros son procesos protegidos.

De todas formas ten en cuenta que lo que escribí es un ejemplo básico que se puede extender para adaptarlo a "X" necesidades, si quieres hacer una buena réplica entonces deberías mostrar lo mismo que muestra el administrador de tareas de Windows.



y esta parte por que solo muestra la ruta del  proceso pero no el nombre o la ruta ya contiene el nombre del proceso? por que declara pNames.

Obviamente la ruta del archivo contiene el nombre del archivo.

¿Por qué declaré pNames y pPaths por separado?, para mostrar dos ejemplos distintos, uno para obtener solo el nombre, y el otro para obtener la ruta completa.



Código
  1. ListBox1.Items.AddRange(pPaths.ToArray)

me dice lo siquiente

(http://1.bp.blogspot.com/-xKmAeekfU70/VXPdKHjzqnI/AAAAAAAAA9M/jRm0RtjKWLk/s1600/errorDuda.png)

Fíjate bien, estás utilizando un ListView, no un ListBox.

Debes pasarle cómo argumento un array de ListViewItem, o un ListViewItemcollection:

Código
  1. With ListView1
  2.  
  3.    .View = View.Details
  4.    .Columns.Add("ExecutablePath")
  5.    .Items.AddRange((From path As String In pPaths Select New ListViewItem({path})).ToArray)
  6.  
  7. End With

Saludos!