Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
1 / 1 / 0
Регистрация: 13.02.2016
Сообщений: 13

Read ProcessMemory from kernel driver

29.03.2016, 01:13. Показов 4827. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, помогите пожалста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    ULONG_PTR address;
    BYTE *Buffer;
 
    Buffer = (BYTE *)  ExAllocatePool(NonPagedPool, 4096);
         if (Buffer == NULL) {
                    DbgPrint("Error allocate out buffer...");
            return STATUS_INVALID_PARAMETER;
    }
 
    st = PsLookupProcessByProcessId((HANDLE)ProcessId, &Process); 
 
    if (NT_SUCCESS(st)) { 
 
            try { 
        KeAttachProcess(Process);   
        DbgPrint("Read from process...");
        address = 0x1000;//??? как тут правильно указать адрес, нужно прочитать 16 байт процесса
 
        if (MmIsAddressValid((PVOID) address) == FALSE)
                {
               DbgPrint("ERROR MMAddress");
               KeDetachProcess();
                   ExFreePool(Buffer);
                   return STATUS_INVALID_PARAMETER;
                }
        //RtlCopyMemory(Buffer, address, 16);//or ZwReadVirtualMemory?
        KeDetachProcess();
        ExFreePool(Buffer);
 
        } 
        __except(EXCEPTION_EXECUTE_HANDLER) 
        { 
            KeDetachProcess();
            DbgPrint("Error in Reading... BSOD!");
        } 
        ObDereferenceObject(Process); 
    }
Нормально аттачусь к выбранному процессу, получаю имя и хендл.
Использую код из примеров вокруг, но не все получается.
Стопорнулся при попытке чтения под x64, как получить доступ к памяти процесса, например прочесть по RVA 0x401000?

спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2016, 01:13
Ответы с готовыми решениями:

NVIDIA Windows Kernel Mode Driver
Спустя минут 10-20 игры в CS GO начинаются короткие зависания на 3 секунды при этом потухает экран, но потом обратно загорается. Если в...

Принцип написания Kernel Mode Driver | Visual Studio
Весь интернет перерыл про Kernel Mode Driver. Начитался кучу одного и того же: "При крашах возникает BSoD", "На драйвера Kernel...

Windows Kernel Driver developer (NDIS and TDI), Киев, $2000
International software development company is looking Windows Kernel Driver developer (NDIS and TDI) in Kiev office. Requirements: ...

9
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.03.2016, 15:02
1. KeStackAttachProcess.

2. __try

3. Читаешь данные по нужному адресу.

3. В __finally делаешь KeUnstackDetachProcess().

Все.

MmIsAddressValid не нужно, для юзермодных адресов есть __try/__except/__finally и
ProbeForRead/ProbeForWrite. Можно и сразу читать память процесса, если есть
его хэндл, см. функцию ZwReadVirtualMemory.
0
1 / 1 / 0
Регистрация: 13.02.2016
Сообщений: 13
29.03.2016, 19:34  [ТС]
для юзермодных адресов есть __try/__except/__finally
То бишь,

C++
1
2
3
4
5
6
7
8
9
10
11
KeStackAttachProcess(Process, &apcState);
 
try {
          ProbeForRead((PVOID)RVAAddress, 0x20, sizeof(BYTE));
          RtlCopyMemory(ReadedBuffer, (PVOID)RVAAddress, 0x20);
          KeUnstackDetachProcess(&apcState);
 
} except (EXCEPTION_EXECUTE_HANDLER) {
        KeUnstackDetachProcess(&apcState);  
        DbgPrint("Error reading usermode process.");
}
в качестве офсета для чтения из процесса, мы ставить обычный RVA или абсолютный офсет от начала имиджа? или же другой указатель на эту область памяти?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.03.2016, 09:22
Цитата Сообщение от town Посмотреть сообщение
в качестве офсета для чтения из процесса, мы ставить обычный RVA или абсолютный офсет от начала имиджа?
У адресного пространства процесса нет таких понятий, как RVA, image и т.п.
Это просто диапазон адресов от 0 до 0xFFFFFFFF (на x64 - до 0xFFFFFFFF`FFFFFFFF).
0
1 / 1 / 0
Регистрация: 13.02.2016
Сообщений: 13
30.03.2016, 13:30  [ТС]
ясно,
на sysinternals форуме нашел пример через MDL:
C++
1
2
3
4
5
6
7
8
9
   PMDL Mdl;
...
    Mdl = IoAllocateMdl((PVOID)addr, len, FALSE, FALSE, NULL);
    // check for address
    MmIsAddressValid(addr))
    MmProbeAndLockPages(Mdl, KernelMode, IoReadAccess);
    SafeAddr = MmGetSystemAddressForMdl(Mdl);
    if(!SafeAddr)
       RtlCopyMemory(buffer, SafeAddr, len);
ставлю адрес в addr RVA 0x401000- ошибка, адрес невалидный, а как еще преобразовать RVA который надо прочитать в физический адреса для драйверной ProbeRead ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.03.2016, 14:09
Цитата Сообщение от town Посмотреть сообщение
а как еще преобразовать RVA который надо прочитать в физический адреса для драйверной ProbeRead ?
Еще раз повторю - забудь про всякие RVA, физические адреса и т.п.
У тебя есть процесс и некий адрес, память по которому нужно прочесть или изменить.
Все. Если это юзермодная память, тогда два варианта: либо аттачишься к процессу
(KeStackAttachProcess) и внутри __try/__except работаешь с нужным адресом, либо
сразу дергаешь ZwReadVirtualMemory/ZwWriteVirtualMemory, что, по сути, одно и то же.

Ядерную память можно читать, находясь в контексте любого процесса, но от ошибки
доступа, например если ты попытаешься записать что-либо в память, у которой стоит
доступ только на чтение, через __try/__except уже не спастись и система сразу
вылетит в BSOD. Так что здесь нужно быть аккуратнее.
0
1 / 1 / 0
Регистрация: 13.02.2016
Сообщений: 13
30.03.2016, 16:24  [ТС]
У меня картинка не складывается, получается после вызова KeStackAttachProcess()
я сразу попадаю в область памяти процесса? Вот этот самый некий адрес, каким образом я попадаю внутрь юзермодного процесса? Хендл моего процесса есть, после аттача я нахожусь в адресном пространстве моего процесса, к которому я приаттачился? Я правильно понимаю смысл функции?
The KeStackAttachProcess routine attaches the current thread to the address space of the target process.
Т.е. все аналогично как в юзермоде, после GetModuleHandle, я использую виртуальный адрес в процессе?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.03.2016, 17:44
Цитата Сообщение от town Посмотреть сообщение
У меня картинка не складывается, получается после вызова KeStackAttachProcess()
я сразу попадаю в область памяти процесса?
Да. После KeStackAttachProcess происходит как бы искусственное переключение
контекста и мы оказываемся в адресном пространстве нужного процесса.

Цитата Сообщение от town Посмотреть сообщение
Хендл моего процесса есть, после аттача я нахожусь в адресном пространстве моего процесса, к которому я приаттачился? Я правильно понимаю смысл функции?
Да.

Цитата Сообщение от town Посмотреть сообщение
Т.е. все аналогично как в юзермоде, после GetModuleHandle, я использую виртуальный адрес в процессе?
Ну вроде того. Вот, к примеру, известно, что в процессе PID = 1234 по адресу
0x7AFB244094 лежат интересующие тебя данные размером в DWORD.
Сначала получаешь EPROCESS процесса, для этого есть функция PsLookupProcessByProcessId.
Дальше делаешь KeStackAttachProcess. Все, сейчас ты уже в контексте нужного процесса.
Далее читаешь данные по адресу 0x7AFB244094 (чтение внутри __try/__except, иначе
легко нарваться на BSOD):
C
1
ULONG MyData = *((ULONG *)0x7AFB244094);
Далее KeUnstackDetachProcess и ObDereferenceObject. Все.

Альтернативный вариант - ZwOpenProcess, ZwReadVirtualMemory, ZwClose.
0
1 / 1 / 0
Регистрация: 13.02.2016
Сообщений: 13
30.03.2016, 21:00  [ТС]
Спасибо, пробую, но, чую, для глубокого понимания надо матчасть подтянуть.
Есть что-то толковое из литературы посоветовать? Примеры и форумы хорошо, но качественную книжку не заменят.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.03.2016, 08:42
Вот (специально собрал все в одном месте):
Документация и загрузки для разработчика драйверов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2016, 08:42
Помогаю со студенческими работами здесь

Windows Kernel Driver developer (Installable File Systems), Киев, $2000
International software development company is looking Windows File Systems software developer in Kiev office. Requirements: ...

NVIDIA Windows Kernel Mode Driver был восстановлен. не могу разобраться с траблой
всем доброго времени суток. столкнулся с такой проблемой: после установки windows 7 при просмотре видео либо при игре (конкретно alice...

Видеодрайвер NVIDIA Windows Kernel Mode Driver перестал отвечать и был успешно восстановлен
Установил лицензионную ОС Windows 8.1 SL. Скачал драйвера с сайта производителя ноутбука. Установил. Ошибка возникает когда я захожу вот...

Видеодрайвер nvidia windows kernel mode driver перестал отвечать и был успешно восстановлен
Пользуюсь этой видеокартой уже больше полугода, некогда небыло проблем и вылетов, и вот на днях появилась такая проблема стала вылетать...

Видеодрайвер nvidia windows kernel mode driver перестал отвечать и был успешно восстановлен
Купил новый компьютер, для учебы нужно было ну и для игр конечно тоже)), так вот я принес домой на компе стояла пробная версия win 8.1 если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru