Member 13980942 Ответов: 2

Как читать строку с помощью драйвера ядра


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

вот как я читаю из ядра

<pre>PCHAR ReadMem_String(MEMDATA *data) {
	NTSTATUS ntStatus;
	PEPROCESS targetProc;
	char string[12800] = "";

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

	__try {
		KeAttachProcess((PKPROCESS)targetProc);
		if (MmIsAddressValid((void*)(*data).address))
			RtlCopyMemory(string, (const void*)data->address, data->Read);
		KeDetachProcess();
	}
	__except (GetExceptionCode()) {
		return;
	}

	return(string);
}


case(READ_chars): {
    MEMDATA *userCom = pBuf;
    PCHAR string = ReadMem_String(userCom);
    RtlCopyMemory(pBuf, string, strlen(string));
    size = strlen(string);
    break;
}


также использую метод buffered


в моей программе пользовательского режима

<pre>	char Readchar(UINT64 proccessId, uint64_t address) {
		MEMDATA dataToSend;
		uint64_t readBuffer;
		DWORD64 dwBytesToRead = 0;

		dataToSend.proccessId = proccessId;
		dataToSend.address = address;
		dataToSend.Read = 0;

		DeviceIoControl(hDriver, READ_INT, &dataToSend, sizeof(MEMDATA), &readBuffer, sizeof(readBuffer), 0, 0);
		CloseHandle(hDriver);

		return((char)readBuffer);
	}


и я преобразую символы в строки Вот так

<pre lang="c++"><pre>	char test = Driver.Readchar(PID, 0x40E066FDB0);
	const char* add = reinterpret_cast<const char*>(&test);
	std::string str = add;
	printf("String found: %s\n", str.c_str());


и моя структура
typedef struct {
	DWORD64 proccessId;
	DWORD64 address;
	DWORD64 Read;
} MEMDATA;


надеюсь, что кто-то сможет мне помочь, и спасибо за это @
Richard MacCutchan
за помощь в решении старой проблемы :D также pls если вы знаете исправление этой проблемы не просто скажите мне его то или это просто pls дайте мне или покажите мне код чтобы исправить это

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

<pre lang="c++"><pre>char test = Driver.Readchar(PID, 0x40E066FDB0);
	const char* add = reinterpret_cast<const char*>(&test);
	std::string str = add;
	printf("String found: %s\n", str.c_str());


но это не сработало я хочу почитать
DefaultString
и он читает это так
@ΘùΦ

2 Ответов

Рейтинг:
1

Richard MacCutchan

if (MmIsAddressValid((void*)(*data).address))

Та же проблема, что и вчера. Не разыменовывайте переменную данных таким образом.


Member 13980942

@Richard MacCutchan спасибо, что я сделал это, но все равно то же самое теперь он выводит только

Строки нашли : @ вот это ? и я попробовал с wchar_t и std::wstring, и результат был @ любые идеи, в чем здесь проблема ?

Member 13980942

я устал от многих вещей но ни одна из них не работала не могли бы вы сказать мне как я мог это сделать я искал по всему интернету но никто не делал этого раньше или я нашел некоторые но это не работает

Richard MacCutchan

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

Member 13980942

@Richard MacCutchan Итак, если я использую его, как тот, который вы сказали мне, как исправить его, как данные->адрес, должно ли все работать ? и я использую эту функцию и использую strlen для подсчета символов, но все еще не работаю

Richard MacCutchan

Я понятия не имею, сработает это или нет. Однако я не думаю, что вы можете использовать strlen в ядре. Кроме того, в вашем пользовательском коде вы устанавливаете размер буфера на sizeof(readBuffer), который определяется как uint64_t таким образом, достаточно места только для 8 ASCII или 4 символов Unicode.

Member 13980942

@Ричард MacCutchan спасибо, не заметил, что я что-то попробовать и посмотреть, если он работает и если он работает я буду размещать его здесь, если нет то пишите я буду размещать код здесь, и попытаться это исправить

Рейтинг:
0

«_Superman_»

Это может быть проблема строкового формата между UNICODE и ANSI.
Попробуйте использовать wchar_t вместо char и std::wstring вместо std::string.


Member 13980942

@«_Superman_» спасибо, что я это сделал, но все равно то же самое теперь он выводит только

Строки нашли : @ вот это ? и я попробовал с wchar_t и std::wstring, и результат был @ любые идеи, в чем здесь проблема ?

Member 13980942

я устал от многих вещей но ни одна из них не работала не могли бы вы сказать мне как я мог это сделать я искал по всему интернету но никто не делал этого раньше или я нашел некоторые но это не работает