Я ищу способ хранения памяти процесса и позже его восстановить при определенных условиях.Патч памяти для процесса восстановления для восстановления состояния
...
На самом деле я прочитал вопросы об этом ... Это кажется большой проблемой!
Итак, давайте проанализируем: приложение является распределенным, но многие процессы не имеют состояния (запрашивают их состояние на централизованный сервер). Процессы используют сетевые подключения и общую память для связи с другими процессами.
Центральный сервер должен сохранить свое состояние, сбросив его память процесса, которое должно быть восстановлено позже в определенных условиях. (1)
Я знаю о функциях ReadProcessMemory и WriteProcessMemory, которые позволяют процессу читать себя и перезаписывать уже выделенную память, не так ли? Итак, мне нужен адрес, где я начинаю читать/писать, и количество байтов для чтения/записи. Итак ... какие адреса? Многие прочитанные мной коды используют адрес, возвращаемый VirtualAlloc, но я не знаю, может ли это быть полезным для меня.
Я предполагаю, что исполняемые сегменты процесса не меняются, поэтому они не нуждаются в красном/письменном виде. Во время восстановления я также мог предположить, что все потоки процессов находятся в одной и той же позиции выполнения, когда память была прочитана основным потоком.
Он остается в памяти стека, и память кучи, которые являются сегменты памяти, что я заинтересован в.
Возможно ли это?
(1) Совершенно законно спрашивать, почему я пытаюсь это сделать. Причина ... сложная, как обычно. Однако скажите, что приложение имеет очень сложное состояние, которое требует слишком сложного алгоритма экономии состояний. Другой альтернативой (которая является предметом анализа) является реализация механизма регистрации/воспроизведения, способного воспроизводить каждое событие, которое способствовало измененному состоянию.
Мне пришло в голову malloc & co. hook. Поэтому я могу отслеживать память, выделенную процессом. Но на самом деле я заметил структуру _CrtMemState, но я не знаю, может ли она быть полезной для меня.
Отличный пример. Это действительно работает, но для очень ограниченных случаев. Спасибо! – Luca
Это как '' '' cat/proc/pid/maps''' в Linux, за исключением того, что с этим кодом вы не знаете, к какому модулю принадлежит каждый блок памяти. Возможно ли получить такую информацию? – alexandernst
А, я только что нашел, как это сделать :) '' 'GetModuleFileNameA ((HINSTANCE) mbi.AllocationBase, szModName, _countof (szModName));' '' – alexandernst