Detectar Proceso Padre (VB.net)

Iniciado por **Aincrad**, 15 Marzo 2019, 20:45 PM

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

**Aincrad**

Hola, No ce como hacerle, Pero quiero Saber si se puede Detectar por ejemplo:

Sin la cmd o algún otro programa abre mi app quiero detectar eso.

pero no se como hacerlo, si alguien me puede ayudar. Gracias de antemano.

Lo que necesitaría saber es cual es el Proceso padre que ejecuta mi app.




Eleкtro

#1
Por orden de menor a mayor velocidad de ejecución:


Saludos.








**Aincrad**

#2
1) Es posible Detectar que proceso hace una llamada por ejemplo al Kernel32.dll y que llamada esta haciendo por ejemplo VirtualProtectEx?





Eleкtro

#3
Cita de: **Aincrad** en 15 Marzo 2019, 23:27 PM
1) Es posible Detectar que proceso hace una llamada por ejemplo al Kernel32.dll y que llamada esta haciendo por ejemplo VirtualProtectEx?

Sí, mediante API hooking puedes averiguar que proceso realiza una llamada a una función específica, en este caso VirtualProtectEx. Es un tema algo complejo que requiere cierto entendimiento y documentación. No soy ningún experto en el tema, pero aquí tienes un ejemplo que publiqué para interceptar las llamadas a la función CreateProcess mediante la librería comercial Deviare Api Hook (https://www.nektra.com/products/deviare-api-hook-windows/):

( el proceso que realizó la llamada a la función CreateProcess se especifica en el parámetro proc del método OnCreateProcess_Called )

Otro ejemplo algo más corto:




Cita de: **Aincrad** en 15 Marzo 2019, 23:27 PM
Que tan rápido seria si uso esta class tuya?  

Bueno, primero que nada y para evitar posibles confusiones, imagino que ya te habrás dado cuenta de que ese código es para obtener los procesos hijo, no el proceso padre, y como puedes comprobar por ti mismo ese algoritmo está basado en el uso de WMI, así que será tan rápido como lo que tarde la infraestructura WMI en devolver la respuesta a la petición o query enviada.

Al utilizar querys complejas, WMI puede llegar a demorarse 1 segundo o más en devolver la respuesta, pero en términos generales WMI siempre resultará una solución efectiva, aunque debido a la naturaleza de su intervalo resultará más lento que llamar directamente a las funciones de la API de Windows que puedan reproducir lo mismo que pretendas realizar con WMI.

Mi consejo: a menos que pretendas desarrollar un administrador de tareas o aplicación similar donde el rendimiento/tasa de actualización sea una prioridad máxima, entonces usa WMI y no le des más vueltas, es facil y efectivo.

Saludos.








**Aincrad**

Gracias, Funciona perfecto.  gracias. Ahora me pondre con lo de Interceptar llamadas.

Código (vbnet) [Seleccionar]
Public Shared Sub ProcesoPadre()
        Try

            Dim myId = Process.GetCurrentProcess().Id
            Dim query = String.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId)
            Dim search = New ManagementObjectSearcher("root\CIMV2", query)
            Dim results = search.[Get]().GetEnumerator()
            results.MoveNext()
            Dim queryObj = results.Current
            Dim parentId = CUInt(queryObj("ParentProcessId"))
            Dim parent = Process.GetProcessById(CInt(parentId))
            MsgBox(parent.ProcessName)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub





Sabes alguna Forma de Hacer un Blucle Asyncoronico, que siempre se mantenga activo aunque oculte el Form (me.hide) ?

Actualmente estoy usando un BackgroundWorker Con un Bucle. pero no se si hay alguna otra manera de hacerlo.

Esto es lo que estoy usando actualmente :

Código (vbnet) [Seleccionar]
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        For i As Integer = 0 To 2
                   'aca lo q quiero q haga siempre mientra la app este en ejecución.
             i -= 1
        Next
    End Sub





Eleкtro

Puedes usar la clase Task, por ejemplo...

Código (vbnet) [Seleccionar]
Dim act As New Action(
    Sub()
        Do While True
            Console.WriteLine("Hello World")
            Thread.Sleep(1000)
        Loop
    End Sub)

Dim tsk As New Task(act, TaskCreationOptions.LongRunning)
tsk.Start()


Saludos.








**Aincrad**

Funciona Perfecto.   ;-)  ;-) .

Muchísimas gracias.