C # Ошибка ReadProcessMemory 299

Я пытаюсь прочитать всю память процесса. Я использовал это

        ProcessModule pm = process.MainModule;
        temp = new byte[pm.ModuleMemorySize];
        byte[] d = new byte[temp.Length];
        int read;
        int size = temp.Length;
        MessageBox.Show("Size: " + size);

        if (ReadProcessMemory(process.Handle, pm.BaseAddress, temp, size, out read)) {
            //d = temp;
            fileData = encoder.GetString(temp);
        } else MessageBox.Show("Error: " + Marshal.GetLastWin32Error());

Иногда это работает совершенно нормально, но с другими приложениями не работает и возвращает «Ошибка 299».

Я запускаю свое приложение как x64 и как администратор. Кажется, не имеет значения, какой тип процесса я пытаюсь прочитать. Даже большие (26 МБ) читаются нормально. Затем я пытаюсь прочитать одну из моих других программ на C #, но она не работает.

РЕДАКТИРОВАТЬ: Возможно ли, что это происходит только при попытке чтения процессов C # .exe? Почему это могло быть?


person user2578216    schedule 12.08.2018    source источник
comment
По аналогичному вопросу (stackoverflow.com/questions/18192739/), Ханс Пассант добавил примечание о 32-битной и 64-битной обработке. Вы можете проверить, применимо ли это к вашему сценарию.   -  person Subbu    schedule 12.08.2018
comment
Возможный дубликат проблемы с использованием OpenProcess и ReadProcessMemory   -  person Nhan Phan    schedule 12.08.2018
comment
Если вы проясните цель этого, я смогу лучше ответить на этот вопрос. Вы сканируете выкройки? Скинуть всю память на анализ?   -  person GuidedHacking    schedule 27.08.2018


Ответы (1)


Если ваша цель - x64, явно скомпилируйте для x64. Если ваша цель - x86, явно скомпилируйте для x86. Вы можете найти настройки в свойствах вашего проекта.

Вы должны сделать это, потому что многие структуры Windows API различны для каждой архитектуры, потому что, если структура содержит указатели, они имеют 4 байта для x86 и 8 байтов для x64.

Используйте IntPtr для всех адресов / смещений, это заставит его использовать правильный размер указателя для цели, для которой вы его создаете. Таким образом, у вас не возникнет проблем с попыткой уместить 8-байтовые значения в 4-байтовые переменные.

Если вы будете следовать этой методике, у вас не будет этих проблем.

person GuidedHacking    schedule 17.04.2020