MinYoung Lee Ответов: 1

Для получения иллюминатора


Я хочу использовать функцию NtQueryInformationPort ниже в функции DriverEntry, чтобы узнать номер всех прослушиваемых портов. Однако я не знаю, как получить PortHandle, который является первым параметром в NtQueryInformationPort.
Есть ли какой-нибудь способ достать Портхэндла?

/*++

Авторское право (c) корпорация Microsoft. Все права защищены.

Вы можете использовать этот код только в том случае, если согласны с условиями Лицензионного соглашения с исходным кодом ядра Windows Research Kernel (см. License.txt).
Если вы не согласны с условиями, не используйте код.


имя модуля:

lpcquery.с

Абстрактный:

Локальное межпроцессное взаимодействие (LPC) услуги запрос

--*/

#включить "lpcp. h"

#ALLOC_PRAGMA условной
#pragma alloc_text(страница, NtQueryInformationPort)
#endif


Файле ntstatus
NTAPI
NtQueryInformationPort (
__в ручке иллюминатора,
__in PORT_INFORMATION_CLASS PortInformationClass,
__out_bcount(длина) PVOID PortInformation,
_Длина тип ulong тюнинг ,
__out_opt PULONG ReturnLength
)

/*++

Описание Процедуры:

Эта процедура должна использоваться для запроса порта lpc, но в значительной степени
не-а. В настоящее время он может только указать, является ли входной дескриптор для порта
объект.

Аргументы:

PortHandle-предоставляет ручку для запрашиваемого порта

PortInformationClass-указывает запрашиваемый класс информации о типе
для. В настоящее время игнорируется.

PortInformation-предоставляет указатель на буфер для получения
информация. В настоящее время просто прощупывают, а потом игнорируют.

Длина-указывает в байтах размер информационного буфера порта.

ReturnLength - Опционально получает размер информации в байтах
быть возвращенным. В настоящее время просто прощупывают, а потом игнорируют.

значение:

NTSTATUS-соответствующее значение статуса.

--*/

{

KPROCESSOR_MODE PreviousMode;
Информация файле ntstatus ;
PLPCP_PORT_OBJECT PortObject;

PAGED_CODE();

UNREFERENCED_PARAMETER ( PortInformationClass );

//
// При необходимости получить предыдущий режим процессора и выходной аргумент зонда.
//

PreviousMode = KeGetPreviousMode();

if (PreviousMode != KernelMode) {

пробовать {

ProbeForWrite( PortInformation,
Длина,
sizeof( ULONG ));

if (ARGUMENT_PRESENT( ReturnLength )) {

ProbeForWriteUlong( ReturnLength );
}

} except (EXCEPTION_EXECUTE_HANDLER ) {

возвращение( функции getexceptioncode() );
}
}

//
// Если пользователь дал нам дескриптор, то ссылайтесь на объект. И вернуться
// успех, если мы получили хорошую ссылку и ошибку в противном случае.
//

if (ARGUMENT_PRESENT( PortHandle )) {

Status = ObReferenceObjectByHandle( PortHandle,
Помощью generic_read,
LpcPortObjectType,
PreviousMode,
& amp; PortObject,
НУЛЕВОЙ );

if (! NT_SUCCESS( Status )) {

//
// Это может быть ожидаемый объект порта.
// Давайте попробуем еще раз, как этот тип объекта
//

Status = ObReferenceObjectByHandle( PortHandle,
Помощью generic_read,
LpcWaitablePortObjectType,
PreviousMode,
& amp; PortObject,
НУЛЕВОЙ );

//
// Если этот тоже провалится, мы вернем этот статус
//

if (! NT_SUCCESS( Status )) {

возврат (статус );
}
}

ObDereferenceObject( PortObject );

возвращаемое значение status_success;

} еще {

возврат STATUS_INVALID_INFO_CLASS;
}
}

*******

Что я уже пробовал:

------------------------------------------------------

1 Ответов

Рейтинг:
0

Jochen Arndt

Цитата:
знать все прослушивающие порты
Если вы не знаете портов, вы не можете использовать функцию, которая запрашивает информацию для определенного номера порта, определенного дескриптором.

Даже если бы у вас был дескриптор, вызов этой недокументированной функции не дал бы вам никакой полезной информации, потому что никакая информация не возвращается:
Цитата:
В настоящее время просто прощупывают, а потом игнорируют.


Непонятно, чего вы в конце концов хотите добиться. То DriverEntry функция вызывается первой для инициализации. На этом этапе ваш водитель еще ничего не открыл. Таким образом, вы можете перечислять только прослушивающие порты других служб.


MinYoung Lee

Да, прослушивающие порты других служб (все службы) - это то, что я хочу получить, и я думаю, что структура LPCP_PORT_OBJECT имеет следующую структуру, связанную друг с другом структурой LIST_ENTRY.
Моя мысль заключается в том, что если у меня есть данные LPCP_PORT_OBJECT, я могу получить доступ и получить всю информацию о портах с помощью LIST_ENTRYstructure.

Jochen Arndt

Существует утилита командной строки, которая позволяет перечислять прослушивающие порты: netstat
Вы можете вызвать его из своей программы и проанализировать выходные данные.

В качестве альтернативы вы должны реализовать его самостоятельно. Я не делал этого до сих пор, но я думаю, что вам нужно использовать GetExtendedTcpTable() функция.

MinYoung Lee

Большое спасибо, я посмотрю через это.
Однако функция GetExtendedTcpTable () может быть доступна в ядре?

Richard Deeming

- Не совсем ясно, чего ты в конце концов хочешь добиться."

Судя по вчерашнему (теперь удаленному) вопросу, конечная цель-руткит.

Но это нормально; это просто для "исследовательских целей", вы знаете. 🤔