Member 13980942 Ответов: 2

Как я могу преобразовать символ в строку C++ (чтение памяти)


я пытаюсь прочитать строку из фиктивной программы, которую я сделал, используя драйвер ядра для связи с моим приложением usermode. я сделал его таким

void* response // чтобы прочитать ответ или отправить его моему водителю, чтобы он его прочитал
поэтому я использую шаблон для чтения памяти его это
template <typename T>
T read(UINT_PTR ProcessId, UINT_PTR ReadAddress,SIZE_T Size)
{
    if (hDriver == INVALID_HANDLE_VALUE)
        return (T)false;

    DWORD Return, Bytes;
    KERNEL_READ_REQUEST ReadRequest;

    ReadRequest.ProcessId = ProcessId;
    ReadRequest.Address = ReadAddress;
    ReadRequest.Size = Size ? Size : sizeof(T);

    // send code to our driver with the arguments
    if (DeviceIoControl(hDriver, IO_READ_REQUEST, &ReadRequest,
        sizeof(ReadRequest), &ReadRequest, sizeof(ReadRequest), 0, 0))
        return (T)ReadRequest.Response;
    else
        return false;
}
так что, как вы можете видеть, return (T)ReadRequest.Ответ; он возвращает значение драйверу теперь в моем коде я пытаюсь преобразовать символ в строку, подобную этой, но он не показывает мне всю строку строка, которую я хочу прочитать, является DefaultString, но он читает ее так, как эта строка найдена: DefaultS$ любая помощь будет оценена и кстати я пытаюсь узнать о драйверах Примечание : образовательные цели

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

char* p = Driver.read<char*>(processid, 0x2A1575F818, sizeof(p));
const char* add = reinterpret_cast<const char*>(&p);
std::string str = add;
printf("String found: %s\n", str.c_str());

Richard MacCutchan

Большинство драйверов устройств имеют дело только с байтами, им все равно, какова структура данных. Таким образом, вы должны просто запросить у драйвера некоторое количество байтов. Например, если T равно char* а размер не указан, вы будете читать только количество байтов в указателе, которое обычно равно 4.

Member 13980942

@Ричард MacCutchan но как я мог читать больше, чем 4 байта или 8 я пытался поставить буфер число, например (pram1,pram2,255), но это не работает, как, что и из ставит некоторые бесполезные символы как я мог читать всю строку ? заранее спасибо

2 Ответов

Рейтинг:
2

CPallini

Вы читаете слишком мало символов (а именно sizeof(p) то есть, наверное, 8).


Member 13980942

@CPallini но как же тогда я мог его нормально прочитать ? спасибо за ваш ответ

Member 13980942

и как я мог читать больше, чем 8чаров ?

Member 13863239

Я также хотел бы знать, @CPallini спасибо!

Рейтинг:
1

Rick York

Мистер Паллини на правильном пути. В вашем коде есть вот что :

ReadRequest.Size = Size ? Size : sizeof(T);
и именно оператор sizeof(T) является проблемой. Вы можете исправить это, по крайней мере, двумя способами. Один из них состоит в том, чтобы настроить драйвер так, чтобы, если он будет передан размером ноль, он вернет, сколько байтов на самом деле имеет строка, а затем вы запросите именно эту сумму. Есть несколько функций Windows API, которые работают таким образом. Другой способ-определить максимальный размер и убедиться, что ваш текстовый буфер по крайней мере такой же большой. В любом случае вам нужно передать драйверу размер текстового буфера, а не только размер указателя. Вот вам пример:
char* p = Driver.read<char*>( processid, 0x2A1575F818, 255 );
Я выбрал 255 в качестве большого размера текстового буфера. В драйвере размер должен считаться максимальным, как и при вызове strncpy. Вероятно, он должен копировать текст только до тех пор, пока не найдет нуль.


Member 13980942

@Rick York я пытался сделать это так, но это не работает, вы можете видеть результат https://prnt.sc/ktawan как я могу решить эту проблему ? заранее спасибо