Содержание материала

 Порты

 

Самый простой путь для перечисления открытых портов - это использование

функций AllocateAndGetTcpTableFromStack и AllocateAndGetUdpTableFromStack,

и/или AllocateAndGetTcpExTableFromStack и AllocateAndGetUdpExTableFromStack из

iphlpapi.dll. Ex-функции доступны начиная с Windows XP.

 

 

typedef struct _MIB_TCPROW {

DWORD dwState;

DWORD dwLocalAddr;

DWORD dwLocalPort;

DWORD dwRemoteAddr;

DWORD dwRemotePort;

} MIB_TCPROW, *PMIB_TCPROW;

 

typedef struct _MIB_TCPTABLE {

DWORD dwNumEntries;

MIB_TCPROW table[ANY_SIZE];

} MIB_TCPTABLE, *PMIB_TCPTABLE;

 

typedef struct _MIB_UDPROW {

DWORD dwLocalAddr;

DWORD dwLocalPort;

} MIB_UDPROW, *PMIB_UDPROW;

 

typedef struct _MIB_UDPTABLE {

DWORD dwNumEntries;

MIB_UDPROW table[ANY_SIZE];

} MIB_UDPTABLE, *PMIB_UDPTABLE;

 

typedef struct _MIB_TCPROW_EX

{

DWORD dwState;

DWORD dwLocalAddr;

DWORD dwLocalPort;

DWORD dwRemoteAddr;

DWORD dwRemotePort;

DWORD dwProcessId;

} MIB_TCPROW_EX, *PMIB_TCPROW_EX;

 

typedef struct _MIB_TCPTABLE_EX

{

DWORD dwNumEntries;

MIB_TCPROW_EX table[ANY_SIZE];

} MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX;

 

typedef struct _MIB_UDPROW_EX

{

DWORD dwLocalAddr;

DWORD dwLocalPort;

DWORD dwProcessId;

} MIB_UDPROW_EX, *PMIB_UDPROW_EX;

 

typedef struct _MIB_UDPTABLE_EX

{

DWORD dwNumEntries;

MIB_UDPROW_EX table[ANY_SIZE];

} MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX;

 

DWORD WINAPI AllocateAndGetTcpTableFromStack(

OUT PMIB_TCPTABLE *pTcpTable,

IN BOOL bOrder,

IN HANDLE hAllocHeap,

IN DWORD dwAllocFlags,

IN DWORD dwProtocolVersion;

);

 

DWORD WINAPI AllocateAndGetUdpTableFromStack(

OUT PMIB_UDPTABLE *pUdpTable,

IN BOOL bOrder,

IN HANDLE hAllocHeap,

IN DWORD dwAllocFlags,

IN DWORD dwProtocolVersion;

);

 

DWORD WINAPI AllocateAndGetTcpExTableFromStack(

OUT PMIB_TCPTABLE_EX *pTcpTableEx,

IN BOOL bOrder,

IN HANDLE hAllocHeap,

IN DWORD dwAllocFlags,

IN DWORD dwProtocolVersion;

);

 

DWORD WINAPI AllocateAndGetUdpExTableFromStack(

OUT PMIB_UDPTABLE_EX *pUdpTableEx,

IN BOOL bOrder,

IN HANDLE hAllocHeap,

IN DWORD dwAllocFlags,

IN DWORD dwProtocolVersion;

);

 

 Есть и другой способ. Когда программа создает сокет и начинает его

слушать, она, конечно, имеет открытый хэндл для него и для открытого порта.

Мы можем перечислить все открытые хэндлы в системе и послать им специальный

буфер, используя функцию NtDeviceIoControlFile, чтобы определить хэндлы

для открытых портов. Это также даст нам информацию о портах. Так как открытых

хэндлов очень много, мы будем тестировать только хэндлы с типом File и именем

\Device\Tcp или \Device\Udp. Открытые порты имеют только этот тип и имя.

 

Когда мы смотрели код перечисленных функций в iphlpapi.dll, мы

обнаружили, что эти функции вызывают NtDeviceIoControlFile и посылают

специальный буфер для того, чтобы получить список всех открытых портов в

системе. Это значит, что единственная функция, которую нужно перехватить для

скрытия портов - это NtDeviceIoControlFile.

 

NTSTATUS NtDeviceIoControlFile(

IN HANDLE FileHandle

IN HANDLE Event OPTIONAL,

IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

IN PVOID ApcContext OPTIONAL,

OUT PIO_STATUS_BLOCK IoStatusBlock,

IN ULONG IoControlCode,

IN PVOID InputBuffer OPTIONAL,

IN ULONG InputBufferLength,

OUT PVOID OutputBuffer OPTIONAL,

IN ULONG OutputBufferLength

);

 

Интересующие нас параметры - это FileHandle (определяет хэндл

устройства), IoStatusBlock (указывает на переменную, которая получает

информацию о статусе выполнения и информацию об операции), IoControlCode

(число, определяющее тип устройства, метод, права доступа и функцию).

InputBiffer содержит данные размером InputBufferLength байт. И тоже самое в

OutputBuffer и OutputbufferLength.

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить