Exe производится с VS 2010 и VS 2005, загруженных с другим смещением - PullRequest
1 голос
/ 19 апреля 2011

Загрузка файла образа процесса отличается от 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)?

1 Ответ

3 голосов
/ 19 апреля 2011

Кажется, exe создается с / OPT: WIN98 имеет немного больший заголовок (выровненный до 4 КБ). Если этот флаг не указан, код по-прежнему загружается с 0x401000, но заголовок имеет значение только 0x400 вместо 0x1000, что приводит к смещению изображения 0xc00.

...