C++ Вопрос Неверное чтение памяти процесса Kernel Mode

Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Написал драйвер для чтения/записи, но возникла проблема.
Я не могу получить истинное значение buffer на стороне клиента. Выводить должно "1000", но выводит "1".
Однако в полученном значении buffer из драйвера значение 1000 присваивается переменной ( видно на скриншоте в dbgview )
1668357991452.png
Я так понимаю проблема с кодом на стороне клиента, вот код:

C++:
// структура для driver/client
struct KERNEL_MEMORY {
    ULONG PROCESSID;
    LONG64 PROCESSADDRESS;
    PVOID PROCESSBUFFER;
    ULONG BUFFERSIZE;
};

// функция чтения памяти
template <typename TYPE>
    TYPE DriverReadMemory(ULONG pId, LONG64 address) {
        TYPE buffer;

        km.PROCESSID = pId;
        km.PROCESSADDRESS = address;
        km.PROCESSBUFFER = reinterpret_cast<PVOID>(&buffer);
        km.BUFFERSIZE = sizeof(TYPE);

        DWORD result;
        BOOL Success = DeviceIoControl(hDriver, READ_REQUEST, &km, sizeof(km), nullptr, 0, &result, nullptr);
        if (Success) {
            return buffer;
        }
    }
 
Пользователь
Статус
Оффлайн
Регистрация
19 Авг 2020
Сообщения
222
Реакции[?]
138
Поинты[?]
6K
Ты получаешь результат в виде dword его нужно уже в um перевести в нужный тебе тип данных.
Если на c++ то вот функция:
C++:
template <class Dest, class Source>
inline Dest bit_cast(Source const &source) {
    static_assert(sizeof(Dest) == sizeof(Source));
    static_assert(std::is_trivially_copyable<Dest>::value);
    static_assert(std::is_trivially_copyable<Source>::value);

    Dest dest;
    std::memcpy(&dest, &source, sizeof(dest));
    return dest;
}
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ты получаешь результат в виде dword его нужно уже в um перевести в нужный тебе тип данных.
Если на c++ то вот функция:
C++:
template <class Dest, class Source>
inline Dest bit_cast(Source const &source) {
    static_assert(sizeof(Dest) == sizeof(Source));
    static_assert(std::is_trivially_copyable<Dest>::value);
    static_assert(std::is_trivially_copyable<Source>::value);

    Dest dest;
    std::memcpy(&dest, &source, sizeof(dest));
    return dest;
}
вот так? но выбивает ошибку, я не могу кастить тип int в тип pvoid
C++:
km.PROCESSBUFFER = reinterpret_cast<TYPE>(&buffer);
 
Пользователь
Статус
Оффлайн
Регистрация
19 Авг 2020
Сообщения
222
Реакции[?]
138
Поинты[?]
6K
вот так? но выбивает ошибку, я не могу кастить тип int в тип pvoid
C++:
km.PROCESSBUFFER = reinterpret_cast<TYPE>(&buffer);
Нужно кастить не в драйвере а в Чите или где ты это юзаешь.
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
еще не решено
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ты result передаешь не в тот аргумент DeviceIoControl
уже понял, спасибо. Нужно было иначе передать аргументы в контроллер , заполнив еще outBuffer и его размер (в исходном коде у меня nullptr)
 
Сверху Снизу