.NET 4.x Чтение памяти процесса - C#

Узнай цену своей работы

Формулировка задачи:

Имеется задача прочитать память некого процесса. Моя сборка для 32-битных систем (не могу перейти на 64 из-за совместимости). В общем проблема в чем.. Пока я "читаю" 32-битные процессы все работает отлично, но как только я пытаюсь прочитать 64-битный процесс, то выпадает исключение

"Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена"

. Я понимаю, что это из-за того, что моя сборка 32-битная. Когда перекомпиливаюсь под 64, то все работает. НО! Так не будет совместимости с 32-битными системами. Можно ли соорудить какой-нибудь костыль? Как из 32-битной сборки прочитать память 64-битного процесса?

Решение задачи: «.NET 4.x Чтение памяти процесса»

textual
Листинг программы
int main()
{
    MEMORY_BASIC_INFORMATION mbi;
    void* mem = nullptr;
    for (uintptr_t ptr = (uintptr_t)MAXUINT32 * 50; ptr < MAXINT64; ptr = reinterpret_cast<uintptr_t>(mbi.BaseAddress) + mbi.RegionSize) {
        if (!VirtualQuery(reinterpret_cast<void*>(ptr), &mbi, sizeof(mbi))) {
            break;
        }
 
        if (mbi.State == MEM_FREE) {
            mem = VirtualAlloc(mbi.BaseAddress, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
            if (mem) {
                break;
            }
        }
    }
 
    if (!mem) {
        return 0;
    }
 
    for (size_t i = 0; i < 10; i++) {
        reinterpret_cast<char*>(mem)[i] = i;
    }
 
    printf("mem at %p", mem);
    getchar();
 
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.6 из 5
Похожие ответы