Member 14078997 Ответов: 2

Как я могу привести строку к UINT_PTR (запись строк в ядре)?


Я уже некоторое время пытаюсь записывать строки в память ядра. Я был в состоянии читать строки, однако мне не повезло с их написанием. Я могу писать обычные вещи, такие как DWORD. Я все время застреваю на приведении строки к UINT_PTR. Любая помощь приветствуется и вот мой код для чтения строк:

std::string ReadString(UINT_PTR ProcessId, UINT_PTR ReadAddress, SIZE_T Size) {
    if (hDriver == INVALID_HANDLE_VALUE) {
        return {};
    }

    DWORD64 Bytes;
    KERNEL_READ_REQUEST ReadRequest{};

    std::vector<char> buffer(Size, char{ 0 });

    ReadRequest.ProcessId = ProcessId;
    ReadRequest.Address = ReadAddress;
    ReadRequest.Size = buffer.size();
    ReadRequest.Output = static_cast<void*>(&buffer[0]);

    // send code to our driver with the arguments
    if (DeviceIoControl(hDriver, IO_READ_REQUEST, &ReadRequest, sizeof(ReadRequest), &ReadRequest, sizeof(ReadRequest), 0, 0)) {
        return std::string(buffer.data());
    }
    else {
        return {};
    }
}


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

std::vector<char> buffer(Size, char{ 0 });

Я тоже пробовал:
std::string WriteString(UINT_PTR ProcessId, UINT_PTR WriteAddress, UINT_PTR WriteValue, SIZE_T Size) {
    if (hDriver == INVALID_HANDLE_VALUE) {
        return {};
    }

    DWORD64 Bytes;
    KERNEL_WRITE_REQUEST WriteRequest{};

    std::vector<char> buffer(Size, char{ 0 });

    WriteRequest.ProcessId = ProcessId;
    WriteRequest.Address = WriteAddress;
    WriteRequest.Size = buffer.size();
    WriteRequest.Value = WriteValue;

    // send code to our driver with the arguments
    if (DeviceIoControl(hDriver, IO_WRITE_REQUEST, &WriteRequest, sizeof(WriteRequest), 0, 0, 0, 0)) {
        return {};
    }
    else {
        return {};
    }
}

CPallini

Он похож на код, который вы можете найти здесь:
https://github.com/Zer0Mem0ry/KernelBhop/blob/master/KernelBhop/KeInterface.h
Но это совсем другое. Например, каков тип KERNEL_WRITE_REQUEST.Value?

2 Ответов

Рейтинг:
1

Dave Kreskowiak

Бросить веревочку? Ты не можешь. Чтобы быть допустимым указателем, это была бы одна неприятно выглядящая строка.

Вы должны разобрать строку в значение.

Но тогда возникает вопрос, почему вы передаете значения дескрипторов в/to/from ядра в виде строк, а не фактических значений.


Рейтинг:
0

KarstenK

Вы злоупотребляете API. Прочитайте пример кода от Microsoft и документы тоже.

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

Мой реальный совет: Читайте документацию!!!