Tôi đang tìm một phương pháp lưu trữ bộ nhớ quá trình và khôi phục lại sau này ở các điều kiện nhất định.Vá bộ nhớ thời gian chạy để khôi phục trạng thái
...
Thực ra tôi đã đọc câu hỏi về nó ... Có vẻ như là một thách thức lớn!
Vì vậy, hãy phân tích: Ứng dụng là một ứng dụng được phân phối, nhưng nhiều quy trình là không trạng thái (yêu cầu trạng thái của chúng thành máy chủ tập trung). Quy trình sử dụng kết nối mạng và bộ nhớ dùng chung để liên lạc với các quy trình khác.
Máy chủ trung tâm sẽ lưu trạng thái của nó bằng cách bán bộ nhớ quá trình của nó, bộ nhớ này sẽ được khôi phục sau một số điều kiện nhất định. (1)
Tôi biết về các chức năng ReadProcessMemory và WriteProcessMemory, cho phép quá trình đọc chính nó và ghi đè lên bộ nhớ đã cấp phát, phải không? Vì vậy, điều tôi cần là địa chỉ nơi tôi bắt đầu đọc/ghi và số byte để đọc/ghi. Vì vậy, ... địa chỉ là gì? Nhiều mã tôi đã đọc sử dụng địa chỉ được trả lại bởi VirtualAlloc, nhưng tôi không biết liệu điều này có thể hữu ích cho tôi hay không.
Tôi giả định rằng các phân đoạn thực thi quy trình không thay đổi, vì vậy chúng không cần phải có màu đỏ/ghi. Tại thời điểm khôi phục, tôi cũng có thể giả định rằng tất cả các luồng xử lý nằm trong cùng một vị trí thực thi khi bộ nhớ được đọc bởi luồng chính.
Nó vẫn còn nhớ chồng, và bộ nhớ heap, đó là những phân đoạn bộ nhớ những gì tôi quan tâm.
Có thể?
(1) Hoàn toàn hợp pháp khi hỏi tại sao tôi lại cố gắng thực hiện điều này. Lý do là ... phức tạp, như thường lệ. Tuy nhiên, nói rằng ứng dụng có một trạng thái rất phức tạp, đòi hỏi một thuật toán tiết kiệm trạng thái quá phức tạp. Một giải pháp thay thế khác (trong lĩnh vực phân tích) là việc thực hiện một cơ chế logger/replay có thể tái tạo mọi sự kiện đã góp phần vào trạng thái sửa đổi.
Tôi nghĩ đến số malloc & co. hook. Vì vậy, tôi có thể theo dõi bộ nhớ được phân bổ bởi quá trình. Nhưng thực ra tôi nhận thấy cấu trúc _CrtMemState, nhưng tôi không biết liệu nó có hữu ích cho tôi hay không.
Ví dụ tuyệt vời. Nó thực sự hoạt động, nhưng đối với trường hợp rất hạn chế. Cảm ơn bạn! – Luca
Điều này giống như '' 'cat/proc/pid/maps''' trong Linux, ngoại trừ với mã này bạn không biết mô-đun nào từng khối bộ nhớ thuộc về. Có thể lấy thông tin đó bằng cách nào đó không? – alexandernst
Ah, tôi chỉ tìm thấy cách làm điều đó :) '' 'GetModuleFileNameA ((HINSTANCE) mbi.AllocationBase, szModName, _countof (szModName));' '' – alexandernst