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

Netstat, OpPorts , FPort

 

Получение списка открытых портов в первую очередь использутеся,

например, в OpPorts и FPort в Windows XP, а также Netstat.

Программы вызывают NtDeviceIoControlFile дважды с IoControlCode равным

0x000120003. OutputBuffer заполняется после второго вызова. Имя FileHandle

здесь всегда \Device\Tcp. InputBuffer различается для разных типов вызова:

 

1) Для получения массива из MIB_TCPROW InputBuffer должен быть таким:

 

первый вызов:

0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

второй вызов:

0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

 

2) Чтобы получить массив из MIB_UDPROW:

 

первый вызов:

0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

второй вызов:

0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

 

3) Чтобы получить массив из MIB_TCPROW_EX:

 

первый вызов:

0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

второй вызов:

0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

 

4) Чтобы получить массив из MIB_UDPROW_EX:

 

Первый вызов:

0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

Второй вызов:

0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00

0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00

 

 

Вы можете заметить, что буферы различаются только в нескольких байтах.

Мы можем объяснить это.

 

Интересующие нас вызовы имеют в InputBuffer[1] 0x04 и, в основном,

InputBuffer[17] содержит 0x01. Только при таких входных данных мы получим

в OutputBuffer нужные таблицы. Если мы хотим получить информацию о TCP-портах,

нужно установить в InputBuffer[0] значение 0x00, или 0x01 для получения

информации о UDP-портах. Если нам нужны Ex-таблицы (MIB_TCPROW_EX или

MIB_UDPROW_EX), нужно во втором вызове установить в Inputbuffer[16] 0x02.

 

Если мы перехватили вызов с этими параметрами, нужно просто изменить

выходной буфер. Чтобы получить количество строк в выходном буфере, просто

разделите Information из IoStatusBlock на размер строки. Скрыть одну строку

очень просто. Просто перезапишите ее последующими строками и удалить последнюю

строку. Не забудьте изменить OutputBufferLength и IoStatusBlock.

 

 

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

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

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

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


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