Member 14130865 Ответов: 1

Использование режима ядра общей памяти для -> usermode


Итак, сразу к делу, я создал драйвер ядра, который сопоставляет общий раздел с пользовательским режимом. моя проблема заключается в том , что я пытаюсь читать/записывать память с помощью драйвера, но у меня есть 0 опыта работы с ReadFile, WriteFile . у меня есть дескриптор, который был создан с помощью CreateFileA.

теперь я мой старый драйвер проекта, который я использовал для связи с кодом IOCTL примерно так .

#define IO_READ_REQUEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0701 /* Our Custom Code */, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)


typedef struct _KERNEL_READ_REQUEST
{
	ULONG ProcessId;

	ULONG Address;
	ULONG Response;
	ULONG Size;

} KERNEL_READ_REQUEST, *PKERNEL_READ_REQUEST;


template <typename type>
	type ReadVirtualMemory(ULONG ProcessId, ULONG ReadAddress,
		SIZE_T Size)
	{
		if (hDriver == INVALID_HANDLE_VALUE)
			return (type)false;

		DWORD Return, Bytes;
		KERNEL_READ_REQUEST ReadRequest;

		ReadRequest.ProcessId = ProcessId;
		ReadRequest.Address = ReadAddress;
		ReadRequest.Size = Size;

		// send code to our driver with the arguments
		if (DeviceIoControl(hDriver, IO_READ_REQUEST, &ReadRequest,
			sizeof(ReadRequest), &ReadRequest, sizeof(ReadRequest), 0, 0))
			return (type)ReadRequest.Response;
		else
			return (type)false;
	}



и да, я знаю, что это вставлено из kernelbhop, но это то, что мой драйвер делает то же самое (старый).

теперь , как я мог бы сделать точно такой же процесс, но без кода IOCTL и только с ReadFile, WriteFile . и еще 1 вещь , прежде чем я использовал для вызова своего кода IOCTL из ядра
if (ControlCode == IO_READ_REQUEST)
	{
// then do something here
}


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

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

я еще ничего не пробовал. жду кого-то, кто, возможно, имел эту проблему раньше и может помочь с ней :)

1 Ответов

Рейтинг:
0

KarstenK

Вопрос немного неясен. Следует работать с memcpy для копирования данных.

Четко определите, кому принадлежит память и соблюдаются ли права доступа. Лучше всего, когда пользователь и ядро используют собственную память и копируют байты в свои пространства. В противном случае вы можете получить странные и неразрешимые ошибки.

совет: извлеките все коды ошибок используемых функций и аккуратно обращайтесь с ними.


Member 14130865

спасибо @KarstenK, но я просто хочу показать свое доказательство концепции, чтобы увидеть, правильно ли я поступаю или нет.

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

Скрыть Код Скопировать
шаблон <typename type="">
тип RPM(ULONG ProcessId, UINT_PTR ReadAddress)
{
if (hDriver == INVALID_HANDLE_VALUE) {
вернуть {};
}

DWORD64 байт;
Ke_Read_Request ReadRequest{};

тип ответа{};

ReadRequest.Процесса = Процесса;
ReadRequest.Адрес = ReadAddress;
ReadRequest.Size = sizeof(тип);
ReadRequest.Выход = &ответ;
if(memcpy(pBuf,&ReadRequest,sizeof(ReadRequest))){
ответная реакция;
}еще {
возврат 1;
}



и пбуф должен быть тем, с которым я открылся
Скрыть Код Скопировать
pBuf = MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 4096);


теперь, если это сработает, потому что я еще не тестировал его, но я просто хочу знать, будет ли он работать или если я делаю что-то не так, пожалуйста, поправьте меня.

теперь сторона ядра :

Скрыть Код Скопировать
HANDLE g_hSection = NULL;
PVOID g_pSharedSection = NULL;

VOID ReadSharedMemory()
{
	if (!g_hSection)
		return;

	if (g_pSharedSection)
		ZwUnmapViewOfSection(NtCurrentProcess(), g_pSharedSection);

	SIZE_T ulViewSize = 1024 * 10;
	NTSTATUS ntStatus = ZwMapViewOfSection(g_hSection, NtCurrentProcess(), &g_pSharedSection, 0, ulViewSize, NULL, &ulViewSize, ViewShare, 0, PAGE_READWRITE | PAGE_NOCACHE);
	if (ntStatus != STATUS_SUCCESS)
	{
		DbgPrint("ZwMapViewOfSection fail! Status: %p\n", ntStatus);
		ZwClose(g_hSection);
		return;
	}
	DbgPrint("ZwMapViewOfSection completed!\n");

	DbgPrint("Shared memory read data: %s\n",g_pSharedSection);
}



now this can read that copied section from usermode but if all this would work how could i add the read function to IRP with this ? as its only reading it with
Hide   Copy Code
DbgPrint("Shared memory read data: %s\n",g_pSharedSection);


i want to add my functions to IRP after they have been copied from usermode something like this : snippet 

Hide   Copy Code
NTSTATUS KeReadRequest(PDEVICE_OBJECT pDriverObject, PIRP pIrp){
// do whatever here ...
}


then in
Hide   Copy Code
NTSTATUS OnMajorFunctionCall(PDEVICE_OBJECT pDriverObject, PIRP pIrp){

case IRP_MJ_READ:
KeReadRequest(pDriverObject, pIrp);
break;
}


i don't know if that will work or not but i will wait for your response btw i want to know how to copy that data or process that data from Usermode to my kernel side . to sum it up i want to pass that read struct from ReadSharedMemory function to
Hide   Copy Code
NTSTATUS KeReadRequest(PDEVICE_OBJECT pDriverObject, PIRP pIrp){
// do whatever here ...
}


because i need it there .