Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Имя процесса в TCP таблице Добавлено: 22.08.05 17:10  

Автор вопроса:  HACKER
Есть вот такой пример получение TCP таблицы всех соединений.


'
Private Type MIB_TCPROW
    dwState As Long
    dwLocalAddr As Long
    dwLocalPort As Long
    dwRemoteAddr As Long
    dwRemotePort As Long
End Type
'
Private Const ERROR_BUFFER_OVERFLOW = 111&
Private Const ERROR_INVALID_PARAMETER = 87
Private Const ERROR_NO_DATA = 232&
Private Const ERROR_NOT_SUPPORTED = 50&
Private Const ERROR_SUCCESS = 0&
'
Private Const MIB_TCP_STATE_CLOSED = 1
Private Const MIB_TCP_STATE_LISTEN = 2
Private Const MIB_TCP_STATE_SYN_SENT = 3
Private Const MIB_TCP_STATE_SYN_RCVD = 4
Private Const MIB_TCP_STATE_ESTAB = 5
Private Const MIB_TCP_STATE_FIN_WAIT1 = 6
Private Const MIB_TCP_STATE_FIN_WAIT2 = 7
Private Const MIB_TCP_STATE_CLOSE_WAIT = 8
Private Const MIB_TCP_STATE_CLOSING = 9
Private Const MIB_TCP_STATE_LAST_ACK = 10
Private Const MIB_TCP_STATE_TIME_WAIT = 11
Private Const MIB_TCP_STATE_DELETE_TCB = 12
'
Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef pDest As Any, ByRef pSource As Any, ByVal Length As Long)
'

Private Sub Command1_Click()
    '
    Dim arrBuffer() As Byte
    Dim lngSize As Long
    Dim lngRetVal As Long
    Dim lngRows As Long
    Dim i As Long
    Dim TcpTableRow As MIB_TCPROW
    Dim lvItem As ListItem
    '
    ListView1.ListItems.Clear
    '
    lngSize = 0
    '
    'Call the GetTcpTable just to get the buffer size into the lngSize variable
    lngRetVal = GetTcpTable(ByVal 0&, lngSize, 0)
    '
    If lngRetVal = ERROR_NOT_SUPPORTED Then
        '
        'This API works only on Win 98//2000 and NT4 with SP4
        MsgBox "IP Helper is not supported by this system."
        Exit Sub
        '
    End If
    '
    'Prepare the buffer
    ReDim arrBuffer(0 To lngSize - 1) As Byte
    '
    'And call the function one more time
    lngRetVal = GetTcpTable(arrBuffer(0), lngSize, 0)
    '
    If lngRetVal = ERROR_SUCCESS Then
        '
        'The first 4 bytes contain the quantity of the table rows
        'Get that value to the lngRows variable
        CopyMemory lngRows, arrBuffer(0), 4
        '
        For i = 1 To lngRows
            '
            'Copy the table row data to the TcpTableRow structure
            CopyMemory TcpTableRow, arrBuffer(4 + (i - 1) * Len(TcpTableRow)), Len(TcpTableRow)
            '
            If Not ((Check1.Value = vbChecked) And (GetIpFromLong(TcpTableRow.dwLocalAddr) = "0.0.0.0" Or GetIpFromLong(TcpTableRow.dwLocalAddr) = "127.0.0.1")) Then
                '
                'Add the data to the ListView control
                With TcpTableRow
                    Set lvItem = ListView1.ListItems.Add(, , GetIpFromLong(.dwLocalAddr))
                    lvItem.SubItems(1) = .dwLocalPort
                    lvItem.SubItems(2) = GetIpFromLong(.dwRemoteAddr)
                    lvItem.SubItems(3) = .dwRemotePort
                    lvItem.SubItems(4) = GetState(.dwState)
                End With
                '
            End If
            '
        Next i
        '
    End If
    '
End Sub

Private Sub Command2_Click()
    Unload Me
End Sub

Private Function GetIpFromLong(lngIPAddress As Long) As String
    '
    Dim arrIpParts(3) As Byte
    '
    CopyMemory arrIpParts(0), lngIPAddress, 4
    '
    GetIpFromLong = CStr(arrIpParts(0)) & "." & CStr(arrIpParts(1)) & "." & CStr(arrIpParts(2)) & "." & CStr(arrIpParts(3))
    '
End Function

Private Function GetState(lngState As Long) As String
    '
    Select Case lngState
        Case MIB_TCP_STATE_CLOSED: GetState = "CLOSED"
        Case MIB_TCP_STATE_LISTEN: GetState = "LISTEN"
        Case MIB_TCP_STATE_SYN_SENT: GetState = "SYN_SENT"
        Case MIB_TCP_STATE_SYN_RCVD: GetState = "SYN_RCVD"
        Case MIB_TCP_STATE_ESTAB: GetState = "ESTAB"
        Case MIB_TCP_STATE_FIN_WAIT1: GetState = "FIN_WAIT1"
        Case MIB_TCP_STATE_FIN_WAIT2: GetState = "FIN_WAIT2"
        Case MIB_TCP_STATE_CLOSE_WAIT: GetState = "CLOSE_WAIT"
        Case MIB_TCP_STATE_CLOSING: GetState = "CLOSING"
        Case MIB_TCP_STATE_LAST_ACK: GetState = "LAST_ACK"
        Case MIB_TCP_STATE_TIME_WAIT: GetState = "TIME_WAIT"
        Case MIB_TCP_STATE_DELETE_TCB: GetState = "DELETE_TCB"
    End Select
    '
End Function


Непойму как узнать имя процесса на каждое открытое соедниение.

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 24.08.05 22:28
Ладно, тогда может кто-то видел пример в котором отображаются не только все открытые соединения, но и процессы?

Ответить

Номер ответа: 2
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 25.08.05 13:02
эээээээ...... чё то страшно, неужели никто не знает? Где там наши лидеры, авторитеты, и деды форума? :)

Ответить

Номер ответа: 3
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #3 Добавлено: 25.08.05 13:52
Задаешь не те вопросы. Спросил бы как поменять цвет шрифта в TextBox'е - ответили бы.

Ответить

Номер ответа: 4
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #4 Добавлено: 25.08.05 22:25
Да у меня есть примерчики на Delphi, но не мои. Плагиатом не занимаюсь. Там через WMI все просто и красиво, если хочешь завтра дам ссылочку на автора (точнее на статью с примерами) и есть скрипты с WMI. Сегодня не могу, на работе все.

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 26.08.05 07:50
netstat юзает недокументированную (MSDN январь 2004) функцию AllocateAndGetTcpExTableFromStack из iphlpapi.dll. Можно было бы разобраться, но лениво, поэтому Google, там есть.

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 26.08.05 17:45
ого имя функции :))) лана, пойщу чё нить...

2 Андрей
Незнаю смогу ли перевести, но делфи вроде стоит, а посмотреть как работет всегда интерестно ...

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 27.08.05 00:20
мда, мало чё нашёл по AllocateAndGetTcpExTableFromStack... Нормального примера (на любом языке) я так и не нашёл :( Ещё пишут что она только для хр, это кстати тоже меня не особо устраивает... А "умники" (в ковычках) советуют "netstat -o -n > file.tmp" и потом отпарсить file.tmp и показать все какой я умный :)... но я ж так тоже буду умным в ковычках... а нехотелось бы

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 27.08.05 01:58
Дизассемблерируй ее вызов или протрассируй (еще проще) с -aon и посмотри, какие аргументы передаются

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 27.08.05 18:52
Дизассемблерируй ее вызов

а ето как? я неумею :) Ну я брейк на функцию поставил, вроде словило, но чё там где посмотреть х.з... :) да и трассировать тож неумею... :(

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 27.08.05 21:59
Поставь бряк на вызов, а затем посмотри, что было положено в стек. Глянь, что находится по адресам, положенным в стек, если они похожи на адреса до вызова и после вызова. Потом долго думай :) И может быть, ты сможешь написать код вызова.

Ответить

Номер ответа: 11
Автор ответа:
 Brusco



ICQ: 175617069 

Вопросов: 4
Ответов: 24
 Профиль | | #11 Добавлено: 28.08.05 06:27
Я когда-то писал прогу для перехвата и блокирования соединений (чтоб плохие админы не лазили куда не надо:)), но так толком и не дописал. Это то, что я нарыл по этому поводу.
Да, плохо что эта функция катит только в XP!

Public Function GetTCPConnections(Optional bShowAll As Boolean = True) As Boolean
    Dim lReturn                     As Long
    Dim lSize                       As Long
    Dim lAddr                       As Long
    Dim lRows                       As Long
    Dim X                           As Long
    Dim g_bxptable As Boolean
    Dim rRowXP                      As MIB_TCPEXROW
    Dim rRow                        As MIB_TCPROW
    Dim TcpTable                    As MIB_TCPTABLE
    Dim p_TcpConnections()          As tConnectionType
    
    g_bxptable = True
    
    If g_bxptable = True Then
        lReturn = AllocateAndGetTcpExTableFromStack(lAddr, True, GetProcessHeap, 2, 2)
            'We pass in a Long to the function, even though C++ would use the actual type structure.
            'This is because C++ uses a memory pointer to the location of the type struct in memory, VB does not, it uses safe arrays, so it fecks this up
            'And ends up returning over 2000000 for the count of items.
            'By doing it this  way ,it's gonna receive a pointer to the table *allocated by the function*.
            'Thanks to...
             
        
        If lReturn = ERROR_SUCCESS Then 'If succeed...
     
            CopyMemory lSize, ByVal lAddr, 4 'Get number of entries.
            
            If lSize > IoldTcp Then
            IoldTcp = lSize
            Else
            IoldTcp = lSize
            GetTCPConnections = False
            Exit Function
            End If
            
            ' LoadProcessUserIDs
             GetProcs
    
            If bShowAll = True Then ReDim p_TcpConnections(lSize) 'If we are showing them all, might as well redimension the array here.
            For X = 0 To lSize - 1 'Loop through array.
           
                If cGetInputState(QS_ALLEVENTS) <> 0 Then DoEvents
                If bShowAll = True Then
             
                    CopyMemory rRowXP, ByVal (lAddr + 4 + X * LenB(rRowXP)), LenB(rRowXP) 'Copy each table individually.
                    'The memory location is calculated by lAddr + 4 + (Size of a Row * Number of rows already done)
                    With p_TcpConnections(X)
                     
                        .lLocalPort = GetTcpPortNumber(rRowXP.dwLocalPort) 'Local Port
                         
                       .ProcInfo.lProcID = rRowXP.dwProcessId 'Process ID
                         
                        .ProcInfo.sPath = Proc_Path(rRowXP.dwProcessId)
                         
                        '.ProcInfo.sUser = Proc_UserName(rRowXP.dwProcessId)
                         
                        .lRemotePort = GetTcpPortNumber(rRowXP.dwRemotePort) 'Remote Port
                         
                        .sLocalAddr = GetIpFromLong(rRowXP.dwLocalAddr) 'Local Host Address
                         
                        .sRemoteAddr = GetIpFromLong(rRowXP.dwRemoteAddr) 'Remote Host Address
                         
                        .sState = GetState(rRowXP.dwState) 'State of Connection
                         
                        '.Direction = IIf(.lLocalPort = .lRemotePort And .lLocalPort <> 0, enDirection.Incoming, enDirection.Outgoing)
                         
                        .bTCP = True
                
                    End With
                 
                    With p_TcpConnections(X).Row
                        .dwLocalAddr = rRowXP.dwLocalAddr
                        .dwLocalPort = rRowXP.dwLocalPort
                        .dwRemoteAddr = rRowXP.dwRemoteAddr
                        .dwRemotePort = rRowXP.dwRemotePort
                        .dwState = rRowXP.dwState
                    
                    End With
                Else
             
                    'Same as in the last one but we only add ones that do not have..
                    'a Local Address of 0.0.0.0 and 127.0.0.1
                    CopyMemory rRowXP, ByVal (lAddr + 4 + X * LenB(rRowXP)), LenB(rRowXP)
                    If Not (GetIpFromLong(rRowXP.dwLocalAddr) = "0.0.0.0" Or GetIpFromLong(rRowXP.dwLocalAddr) = "127.0.0.1";) Then
                        lReturn = C_UBound(p_TcpConnections) + 1
                        ReDim Preserve p_TcpConnections(lReturn)
                        With p_TcpConnections(lReturn)
                            .lLocalPort = GetTcpPortNumber(rRowXP.dwLocalPort)
                             
                            .ProcInfo.lProcID = rRowXP.dwProcessId
                             
                            .ProcInfo.sPath = Proc_Path(rRowXP.dwProcessId)
                             
                            '.ProcInfo.sUser = Proc_UserName(rRowXP.dwProcessId)
                            
                            .lRemotePort = GetTcpPortNumber(rRowXP.dwRemotePort)
                             
                            .sLocalAddr = GetIpFromLong(rRowXP.dwLocalAddr)
                             
                            .sRemoteAddr = GetIpFromLong(rRowXP.dwRemoteAddr)
                             
                            .sState = GetState(rRowXP.dwState)
                             
                          '  .Direction = IIf(.lLocalPort = .lRemotePort And .lLocalPort <> 0, enDirection.Incoming, enDirection.Outgoing)
                        End With
                        With p_TcpConnections(lReturn).Row
                            .dwLocalAddr = rRowXP.dwLocalAddr
                            .dwLocalPort = rRowXP.dwLocalPort
                            .dwRemoteAddr = rRowXP.dwRemoteAddr
                            .dwRemotePort = rRowXP.dwRemotePort
                            .dwState = rRowXP.dwState
                            
                        End With
                    End If
                End If
             
            Next
            g_tcpConnections = p_TcpConnections
            Erase p_TcpConnections
            GetTCPConnections = True
        Else
            GetTCPConnections = False
        End If
     
    Else
        'This function does the exact same as the last, except it doesn't return ProcessIDs.
        lReturn = GetTcpTable(TcpTable, Len(TcpTable), 0) 'Get the TcpTable (Without Process IDs)
        
        
        If lReturn = ERROR_SUCCESS Then 'Sucess ?
            If bShowAll = True Then ReDim p_TcpConnections(TcpTable.dwNumEntries) 'Redimensionalise the array.
            For X = 0 To TcpTable.dwNumEntries 'Loop through the Table.
              
                If cGetInputState(QS_ALLEVENTS) <> 0 Then DoEvents
                If bShowAll = True Then 'All connections ?
                    With p_TcpConnections(X)
                        
                        .lLocalPort = GetTcpPortNumber(TcpTable.Table(X).dwLocalPort)
                         
                        .ProcInfo.lProcID = 0
                        
                        .lRemotePort = GetTcpPortNumber(TcpTable.Table(X).dwRemotePort)
                         
                        .sLocalAddr = GetIpFromLong(TcpTable.Table(X).dwLocalAddr)
                         
                        .sRemoteAddr = GetIpFromLong(TcpTable.Table(X).dwRemoteAddr)
                         
                        .sState = GetState(TcpTable.Table(X).dwState)
                         
                       ' .Direction = IIf(.lLocalPort = .lRemotePort And .lLocalPort <> 0, Incoming, Outgoing)
                         
                        .bTCP = True
                         
                        .Row = TcpTable.Table(X)
                    End With
                  
                Else
                    If Not (GetIpFromLong(TcpTable.Table(X).dwLocalAddr) = "0.0.0.0" Or GetIpFromLong(TcpTable.Table(X).dwLocalAddr) = "127.0.0.1";) Then
                        lReturn = C_UBound(p_TcpConnections) + 1
                        ReDim Preserve p_TcpConnections(lReturn)
                        With p_TcpConnections(lReturn)
                           ' .Direction = IIf(.lLocalPort = .lRemotePort And .lLocalPort <> 0, Incoming, Outgoing)
                             
                            .lLocalPort = GetTcpPortNumber(TcpTable.Table(X).dwLocalPort)
                             
                            .ProcInfo.lProcID = 0
                             
                            .lRemotePort = GetTcpPortNumber(TcpTable.Table(X).dwRemotePort)
                             
                            .sLocalAddr = GetIpFromLong(TcpTable.Table(X).dwLocalAddr)
                             
                            .sRemoteAddr = GetIpFromLong(TcpTable.Table(X).dwRemoteAddr)
                             
                            .sState = GetState(TcpTable.Table(X).dwState)
                             
                            .bTCP = True
                             
                      '      .Direction = IIf(.lLocalPort = .lRemotePort And .lLocalPort <> 0, Incoming, Outgoing)
                             
                            .Row = TcpTable.Table(X)
                        End With
                    End If
                End If
            Next
          
            g_tcpConnections = p_TcpConnections
            Erase p_TcpConnections
            GetTCPConnections = True
        Else
            GetTCPConnections = False
        End If
    End If

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 28.08.05 16:09
2 Sharp

Глянь, что находится по адресам, положенным в стек, если они похожи на адреса до вызова и после вызова. Потом долго думай :)


мда... ;) глядел на те адреса, сравнивал с какими-то ещё там адресами и потом всех их сравнивал с обоями на стене... вообщем безтолку...

2 Brusco
Спасибо, разбираюсь...

И ещё нашёл от такой хороший пример на делфи
http://rouse.front.ru/tcpstat.zip
прелесть в том что хорошо прокоментирован и на русском :)

Ответить

Номер ответа: 13
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #13 Добавлено: 28.08.05 16:50
2 Brusco
Кста, можно лентяю константы, декларации, и типы, итп... ?

Ответить

Номер ответа: 14
Автор ответа:
 Brusco



ICQ: 175617069 

Вопросов: 4
Ответов: 24
 Профиль | | #14 Добавлено: 30.08.05 03:03
Декларации:


Private Declare Function AllocateAndGetTcpExTableFromStack Lib "iphlpapi.dll" (ByRef pTcpTable As Any, ByVal bOrder As Boolean, ByVal Heap As Long, ByVal zero As Long, ByVal Flags As Long) As Long
Private Declare Function AllocateAndGetUdpExTableFromStack Lib "iphlpapi.dll" (ByRef pUdpTable As Any, ByVal bOrder As Boolean, ByVal Heap As Long, ByVal zero As Long, ByVal Flags As Long) As Long
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function GetTcpTable Lib "iphlpapi" (ByRef pTcpTable As Any, ByRef pdwSize As Long, bOrder As Long) As Long
Private Declare Function GetUdpTable Lib "iphlpapi" (ByRef pUdpTable As Any, ByRef pdwSize As Long, bOrder As Long) As Long
Private Declare Function SetTcpEntry Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_TCPROW) As Long
Private Declare Function SetUdpEntry Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_TCPROW) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, ByVal numBytes As Long)

Private Enum enTcpStates
    TCP_STATE_CLOSED = 1
    TCP_STATE_LISTEN = 2
    TCP_STATE_SYN_SENT = 3
    TCP_STATE_SYN_RCVD = 4
    TCP_STATE_ESTAB = 5
    TCP_STATE_FIN_WAIT1 = 6
    TCP_STATE_FIN_WAIT2 = 7
    TCP_STATE_CLOSE_WAIT = 8
    TCP_STATE_CLOSING = 9
    TCP_STATE_LAST_ACK = 10
    TCP_STATE_TIME_WAIT = 11
    TCP_STATE_DELETE_TCB = 12
End Enum
Private Enum enTcpErrors
    ERROR_BUFFER_OVERFLOW = 111&
    ERROR_NO_DATA = 232&
    ERROR_NOT_SUPPORTED = 50&
    ERROR_SUCCESS = 0&
    ERROR_INVALID_PARAMETER = 87
End Enum
Public Type MIB_TCPROW             'Type for the GetTcpTable API.
    dwState                         As Long
    dwLocalAddr                     As Long
    dwLocalPort                     As Long
    dwRemoteAddr                    As Long
    dwRemotePort                    As Long
End Type
Private Type MIB_TCPTABLE           'Type for the GetTcpTable API.
    dwNumEntries                    As Long
    Table(1000)                     As MIB_TCPROW
End Type
Private Type MIB_UDPROW             'Type for GetUDPTable API
    dwLocalAddr                     As Long
    dwLocalPort                     As Long
End Type
Private Type MIB_UDPTABLE           'Type for the GetUDPTable API.
    dwNumEntries                    As Long
    Table(1000)                     As MIB_UDPROW
End Type
Private Type MIB_TCPEXROW          
    dwState                         As Long     'DWORD   dwState;        
    dwLocalAddr                     As Long     'DWORD   dwLocalAddr;  
    dwLocalPort                     As Long     'DWORD   dwLocalPort;  
    dwRemoteAddr                    As Long     'DWORD   dwRemoteAddr;  
    dwRemotePort                    As Long     'DWORD   dwRemotePort;  
    dwProcessId                     As Long     'DWORD   dwProcessId;  
End Type
Private Type MIB_UDPEXROW
    dwLocalAddr                     As Long
    dwLocalPort                     As Long
    dwProcessId                     As Long
End Type
Public Type tProcInfo
    lProcID                         As Long
    sPath                           As String
  '  sUser                           As String
End Type
Public Type tConnectionType        
    sState                          As String
    sLocalAddr                      As String
    lLocalPort                      As Long
    sRemoteAddr                     As String
    lRemotePort                     As Long
    'lProcessID                      As Long
    ProcInfo                        As tProcInfo
   ' Direction                       As enDirection
    bTCP                            As Boolean
    Row                             As MIB_TCPROW
End Type

Global g_UdpConnections() As tConnectionType
Global g_tcpConnections() As tConnectionType

Ответить

Номер ответа: 15
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #15 Добавлено: 30.08.05 15:20
а?

            ' LoadProcessUserIDs
             GetProcs


???

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам