Страница: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #10
Добавлено: 27.08.05 21:59
Поставь бряк на вызов, а затем посмотри, что было положено в стек. Глянь, что находится по адресам, положенным в стек, если они похожи на адреса до вызова и после вызова. Потом долго думай И может быть, ты сможешь написать код вызова.
Номер ответа: 11
Автор ответа:
Brusco
ICQ: 175617069
Вопросов: 4
Ответов: 24
Профиль | | #11
Добавлено: 28.08.05 06:27
Я когда-то писал прогу для перехвата и блокирования соединений (чтоб плохие админы не лазили куда не надо), но так толком и не дописал. Это то, что я нарыл по этому поводу.
Да, плохо что эта функция катит только в XP!
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
а?
GetProcs
???