Загрузка файла образа процесса отличается от VS 2005 к VS 2010
У нас есть шаг после сборки, который изменяет (исправляет) некоторые места в исполняемом файле.Процесс исправления загружает процесс в память, используя CreateProcess
, и считывает его память сегмента кода, используя ReadProcessMemory
.Затем в памяти ищется последовательность 0x8D, 0x05, XX, XX, XX, XX, MAGIC
, и файл изменяется с соответствующим смещением, чтобы содержать другой код.Смещение в файле вычисляется как адрес инструкции в пространстве памяти процесса минус предпочтительный адрес загрузки exe.Exe-файл помечен как / BASE: "0x400000" / DYNAMICBASE: NO / FIXED (нет рандомизации адресов, нет перемещений).
Работает нормально с исполняемыми файлами, созданными с VS 2005, однако происходит сбой при сборке exe с использованием VS 2010. Последовательность в памяти найдена, но содержимое файла с соответствующим смещением не совпадает.При поиске двоичного файла соответствующий код может быть найден ранее в файле 0xc00.
При сравнении командных строк я вижу, что / OPT: WIN98 используется для VS 2005, которыйотсутствует для VS 2010 и кажется больше не поддерживается компоновщиком .
Загрузка исполняемого файла, созданного VS 2010
Теперь мой вопрос:
- Откуда берется это смещение 0xc00?
- Или, если, по моему мнению, процесс загружается путем считывания содержимого exe-файла в память, определяемого адресом загрузки, неверно или упрощенно, есть линекоторая документация, детализирующая, как процесс загружается в память (если возможно, включая обработку таких флагов, как / OPT: WIN98 или / SWAPRUN)?