Member 13980942 Ответов: 1

Драйвер ядра для чтения памяти


поэтому я не могу прочитать целое число из моего IDK usermode, почему я поделюсь кодом, потому что я нашел его и его публичную надежду, что кто-то может помочь мне в этом :D

в пространстве ядра

<pre>typedef struct {
	DWORD64 proccessId;
	DWORD64 address;
	DWORD64 Read;
} MEMDATA;


UINT64 ReadMem(MEMDATA *data) {
	NTSTATUS ntStatus;
	PEPROCESS targetProc;
	UINT64 readBuff;

	ntStatus = PsLookupProcessByProcessId((HANDLE)(*data).proccessId, &targetProc);
	if (ntStatus != STATUS_SUCCESS || !targetProc)
		return;

	__try {
		KeAttachProcess((PKPROCESS)targetProc);
		if (MmIsAddressValid((void*)(*data).address))
			RtlCopyMemory(&readBuff, (const void*)(*data).address, sizeof(readBuff));
		KeDetachProcess();
	}
	__except (GetExceptionCode()) {
		return;
	}

	return(readBuff);
}


<pre>	case(READ): {
		MEMDATA *userCom = pBuf;
		DWORD64 retVal = ReadMem(userCom);
		RtlCopyMemory(pBuf, &retVal, sizeof(retVal));
		size = sizeof(retVal);
		break;
	}


также использую метод buffered
#define READ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0701 /* Our Custom Code */, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)


а вот и мой шаблон для чтения целого числа

<pre>	int Readint(DWORD64 pid, DWORD64 addr, DWORD64 len) {
		MEMDATA toSend;
		DWORD64 dwBytesRead = 0;
		DWORD64  readBuffer;
		toSend.proccessId = pid;
		toSend.address = addr;
		toSend.Read = len;

		DeviceIoControl(hDriver, READ, &toSend, sizeof(MEMDATA), &readBuffer, len, 0, 0);
		CloseHandle(hDriver);

		return(readBuffer);
	}


но это не работает я пытаюсь читать (
123456
) но он читает его вот так (
-1676839616
) я думаю, что драйвер читает его, но это проблема с буфером idk .

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

я пробовал это читать

<pre>	int PID;
	cout << "give PID" << endl;
	cin >> PID;

	int test;
	test = Driver.Readint(PID, 0xB33B92FD88,sizeof(test));
	if (test) {
		cout <<"working boi" << test <<endl;
	}
	else
	{
		cout << "nope not working" << endl;
	}


но он не работает, а также pls, если вы знаете исправление этой проблемы, не просто скажите мне, что это или что просто pls дайте мне или покажите мне код, чтобы исправить это, а также я новичок в ядре извините, если я выгляжу как нуб, но мы учимся каждый день !

1 Ответов

Рейтинг:
5

Richard MacCutchan

Эта строка не выглядит правильной:

RtlCopyMemory(&readBuff, (const void*)(*data).address, sizeof(readBuff));

Переменная data определяется как указатель на a MEMDATA структура, поэтому оператор разыменования здесь не нужен. Попробуйте это как:
RtlCopyMemory(&readBuff, (const void*)data.address, sizeof(readBuff));


Member 13980942

@Ричард MacCutchan спасибо чувак люблю тебя !!!