DPAPI, как оказалось, предоставляет функционал не только по созданию и декрипту зашифрованных блобов, но и по работе с памятью. Есть две интересные функции, которые могут помочь нам, как атакующим, скрыть всякие интересные данные в памяти 
Первая функция позволяет зашифровать блок в памяти, называется CryptProtectMemory (https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectmemory) . В pDataIn мы должны передать адрес, начиная с которого нужно шифровать данные размером cbDataIn . Но самое интересное - dwFlags . Здесь есть целых три значения:
- CRYPTPROTECTMEMORY_SAME_PROCESS - служит для шифрования и расшифровки данных в памяти текущего процесса. Иной процесс не сможет никак расшифровать память текущего процесса.
- CRYPTPROTECTMEMORY_CROSS_PROCESS - для шифрования и расшифровки данных между процессами. Обычно используется для передачи зашифрованных данных между процессами, запущенных от лица различных пользователей.
- CRYPTPROTECTMEMORY_SAME_LOGON - для шифрования и расшифровки данных между процессами, которые запущены от лица одного и того же пользователя. Иные процессы расшифровать данные не смогут.
Для расшифровки данных, как не сложно догадаться, используется функция CryptUnprotectMemory (https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectmemory) , которая принимает все те же флаги, что и CryptProtectMemory, а в pDataIn нужно указывать адрес, начиная с которого нужно осуществить декрипт памяти размером cbDataIn .
На фотографиях выше можно увидеть пример шифрования и расшифровки данных, в name лежит строка в памяти, а nameFromMemory - то, что считывает функция ReadProcessMemory(). Ознакомиться с примером шифрования данных и увидеть код проекта можно на github (https://github.com/MzHmO/articles/blob/main/DpapiMemoryEncrypt/Source.cpp)
Первая функция позволяет зашифровать блок в памяти, называется CryptProtectMemory (https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectmemory) . В pDataIn мы должны передать адрес, начиная с которого нужно шифровать данные размером cbDataIn . Но самое интересное - dwFlags . Здесь есть целых три значения:
- CRYPTPROTECTMEMORY_SAME_PROCESS - служит для шифрования и расшифровки данных в памяти текущего процесса. Иной процесс не сможет никак расшифровать память текущего процесса.
- CRYPTPROTECTMEMORY_CROSS_PROCESS - для шифрования и расшифровки данных между процессами. Обычно используется для передачи зашифрованных данных между процессами, запущенных от лица различных пользователей.
- CRYPTPROTECTMEMORY_SAME_LOGON - для шифрования и расшифровки данных между процессами, которые запущены от лица одного и того же пользователя. Иные процессы расшифровать данные не смогут.
Для расшифровки данных, как не сложно догадаться, используется функция CryptUnprotectMemory (https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectmemory) , которая принимает все те же флаги, что и CryptProtectMemory, а в pDataIn нужно указывать адрес, начиная с которого нужно осуществить декрипт памяти размером cbDataIn .
На фотографиях выше можно увидеть пример шифрования и расшифровки данных, в name лежит строка в памяти, а nameFromMemory - то, что считывает функция ReadProcessMemory(). Ознакомиться с примером шифрования данных и увидеть код проекта можно на github (https://github.com/MzHmO/articles/blob/main/DpapiMemoryEncrypt/Source.cpp)