[NTDLL] SystemProcessesAndThreadsInformation

Iniciado por Karcrack, 3 Septiembre 2010, 18:30 PM

0 Miembros y 3 Visitantes están viendo este tema.

Karcrack

Código (vb) [Seleccionar]
'---------------------------------------------------------------------------------------
' Module    : mProcessInformation
' Author    : Karcrack
' Now       : 26/08/2010 15:00
' Purpose   : Native Process Enumeration
' History   : 26/08/2010 First cut .........................................................
'---------------------------------------------------------------------------------------

Option Explicit
Option Base 0

Public Type PROCESS
    sName           As String
    lPID            As Long
End Type

'NTDLL
Private Declare Function NtQuerySystemInformation Lib "NTDLL" (ByVal SystemInformationClass As Long, ByRef SystemInformation As Any, ByVal SystemInformationLength As Long, ByRef ReturnLength As Long) As Long
Private Declare Sub RtlMoveMemory Lib "NTDLL" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private Const SystemProcessesAndThreadsInformation  As Long = 5&
Private Const STATUS_INFO_LENGTH_MISMATCH           As Long = &HC0000004

Public Function RetrieveProcesses() As PROCESS()
    Dim bvSPI(17)           As Long 'As SYSTEM_PROCESS_INFORMATION
    Dim bvTmp()             As PROCESS
    Dim bvBuffer()          As Byte
    Dim cbBuffer            As Long
    Dim lRet                As Long
    Dim lPos                As Long
    Dim lSize               As Long

    ReDim bvTmp(0)
    cbBuffer = 1
    Do
        cbBuffer = cbBuffer * 2
        ReDim bvBuffer(cbBuffer)
        lRet = NtQuerySystemInformation(SystemProcessesAndThreadsInformation, bvBuffer(0), cbBuffer, lSize)
    Loop While lRet = STATUS_INFO_LENGTH_MISMATCH

    If lRet < 0 Then Exit Function

    lPos = VarPtr(bvBuffer(0))

    Do
        Call RtlMoveMemory(bvSPI(0), ByVal lPos, 18 * 4)
        With bvTmp(UBound(bvTmp))
            .lPID = bvSPI(17)
            .sName = ReadUStr(bvSPI(15))
        End With
        lPos = lPos + bvSPI(0)
        If bvSPI(0) = 0 Then Exit Do
        ReDim Preserve bvTmp(UBound(bvTmp) + 1)
    Loop

    RetrieveProcesses = bvTmp
    Erase bvBuffer
End Function

Private Function ReadUStr(ByVal lPtr As Long) As String
    Dim i                   As Long
    Dim uChar               As Integer

    If Not lPtr > 0 Then Exit Function
    i = lPtr
    Do
        Call RtlMoveMemory(uChar, ByVal i, &H2)
        If uChar = 0 Then Exit Do
        ReadUStr = ReadUStr & ChrW$(uChar)
        i = i + 2
    Loop
End Function

http://www.advancevb.com.ar/?p=589

Saludos ;)

_katze_

loco muy bueno lo probe y funciona bn ! me sorprenden tus codes y como t manejas !

LeandroA

que cabeza  ;)  buena alternativa a la clasica.

Karcrack

Me alegro que os haya gustado :)

Leandro, que le has dado de comer a ese gallo?  :laugh:

79137913

HOLA!!!

Sos una bestia KarCrack Te felicito.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Dessa

Hola , interesante (como siempre), una pregunta, solo para saber, ya no sirve hacerlo con Kernel32 (CreateToolhelp32Snapshot + Process32First + Process32Next) o esta es solo una alternativa ?

Saludos  ;)

Adrian Desanti

Karcrack

#6
Cita de: Dessa en  5 Septiembre 2010, 15:14 PM
Hola , interesante (como siempre), una pregunta, solo para saber, ya no sirve hacerlo con Kernel32 (CreateToolhelp32Snapshot + Process32First + Process32Next) o esta es solo una alternativa ?

Saludos  ;)


Es simplemente una alternativa, se pueda sacar muchisma mas informacion de esas estructuras, solo es un ejemplo este code... Yo lo utilizo por que no es detectado, en cambio los otros metodos si...

Dessa

#7
.
Adrian Desanti

Dessa

Bueno, ahora que quedó aclarado el tema,  y ya que está directamente relacionado con este hilo... alguien conoce un Windows-mensaje para detectar (via Hook) si se inició un nuevo  proceso o se cerró alguno existente ?

PD: no me sirve comparar cadenas , tiene que ser un mensaje, gracias y saludos


Adrian Desanti

Karcrack

#9
Cita de: Dessa en  8 Septiembre 2010, 22:16 PM
Bueno, ahora que quedó aclarado el tema, y ya que está directamente relacionado con este hilo... alguien conoce un Windows-mensaje para detectar (via Hook) si se inició un nuevo proceso o se cerró alguno existente ?

PD: no me sirve comparar cadenas , tiene que ser un mensaje, gracias y saludos
Desde UserMode? ... Se me ocurre que podrias recibir el mensaje de cuando se crea una ventana... pero claro, estamos dando por hecho que todos los procesos crearan ventanas... por si acaso mirate esto:
http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms644977(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms644991(v=VS.85).aspx


Y no puedes comparar PIDs??

EDITO:
http://blogs.technet.com/b/heyscriptingguy/archive/2006/10/04/how-can-i-monitor-for-the-creation-of-different-processes.aspx
Siempre puedes hacerlo con WMI... :-X