Попробуй удалить папку config
Находится здесь …DocumentsBioWareMass EffectConfig
- пожаловаться
- скопировать ссылку
LightHOwUSE
Большое спасибо друг!!!Вот день потратил, а ты спас)))
- пожаловаться
- скопировать ссылку
Максим Слепцов
=) Приятной игры)
- пожаловаться
- скопировать ссылку
Эх, жаль ME3 в стиме так и нет….
- пожаловаться
- скопировать ссылку
APTEM69
Переустанови, и при установке сними галочку с пункта «Патч для контроллера Xbox 360» (примерно так). Или, если у тебя есть выше указанный геймпад, то можно начать игру с него.
- пожаловаться
- скопировать ссылку
LightHOwUSE
спасибо, помогло
- пожаловаться
- скопировать ссылку
Пиратка от Механиков?
- пожаловаться
- скопировать ссылку
OldGamers
верно, решил перепройти все части и тут такая херь
- пожаловаться
- скопировать ссылку
OldGamers
да я снимал ее, мне она не зачем
- пожаловаться
- скопировать ссылку
Посмотри в конфиге игры (файл в корневой) определяет ли клаву и мышь, если нет — то переустанови дрова к мышыклаве коль такие имеются, поставь игру при запуске совместимость с виндой ХР или 7, с правами админа + добавь в исключения антивира и брандмауэра, если и так нет, попробуй переустановить в папку предварительно добавленную в исключения, ежели опять нет, попробуй другой репак.
- пожаловаться
- скопировать ссылку
О боги, спасибо огромное! Села поиграть, а дальше загрузки не могла продвинуться!
Спасибо <3
- пожаловаться
- скопировать ссылку
LightHOwUSE
Спасибо, помогло :))
- пожаловаться
- скопировать ссылку
на мое удивление мне помогло сброс настроек по умолчанию но прицел и все такое осалос как мне надо
- пожаловаться
- скопировать ссылку
Релиз Mass Effect Legendary Edition нельзя назвать гладким. Объединение всех трех частей игры в одну повлекло много ошибок и сбоев у пользователей на ПК. В основном жалобы указывают на: сбои при сохранении, ошибки при запуске, не работающий G-Sync, лаги в меню и в самой игре. Есть и некоторые другие неполадки, о всем, что сегодня известно о проблемах Mass Effect Legendary Edition, поговорим в данном материале.
Содержание
- Как исправить сбои в Mass Effect Legendary Edition?
- При сохранении возникла проблема – что делать?
- Недостаточно памяти Mass Effect Legendary Edition
- Не работает G-Sync
- Ошибка во время установки Mass Effect Legendary Edition
- Ошибки 0xc0000005 и 0xc0000001
- Ошибки 0xc000007b и 8111000b в ME Legendary Edition
- ME Legendary Edition выбрасывает, вылетает, не отвечает или сама закрывается
- Перезапустите игру для продолжения привязки учетных записей
- ME Legendary Edition вылетает
- Зависает в меню или лагает внутри игры
Как исправить сбои в Mass Effect Legendary Edition?
Mass Effect Legendary Edition является всего лишь переизданием Mass Effect, Mass Effect 2 и Mass Effect 3 в одном комплекте. Естественно, разработчики улучшили визуальное оформление игры, слегка доработали игровой процесс и внесли другие полезные, но не критически важные, изменения. Создатели проекта неплохо потрудились над игрой, но все равно оставили много проблем с настройкой, запуском, ошибками, вроде 0xc0000005 или «Try relaunching your game to continue linking accounts» и т. п.
При сохранении возникла проблема – что делать?
Пользователи Mass Effect Legendary Edition на ПК часто сообщают, что не могут сохранить игровой прогресс, особенно в первой части трилогии. Они видят сообщение: «При сохранении игры возникла проблема. Данные игровой сессии не сохранились. Пожалуйста, попробуйте позже».
Как исправить проблему:
- Выдаем права администратора. Рекомендуем найти exe-файл игры (через «Свойства» игры в Steam и «Обзор локальных файлов»), открыть свойства файла и на вкладке «Совместимость» установить галочку возле «Запускать эту программу от имени администратора».
- Отключаем резервное копирование OneDrive (или другого облачного хранилища). Если в текущий момент происходит синхронизация данных на облако, сохранение может прерываться или вовсе не происходить.
- Выключаем систему безопасности. Открываем «Параметры» сочетанием Win + I и идем в раздел «Обновление и безопасность». На вкладке «Защитник Windows» выбираем панель «Защита от вирусов и угроз». Далее открываем «Параметры…» и деактивируем «Контролируемый доступ к папкам».
- Проверяем, что в пути к exe-файлу игры нет папок с русскими символами. Если один из каталогов по пути называется «Игры» или еще как-то на русском, просто переименовываем на «Games» и т. п.
Недостаточно памяти Mass Effect Legendary Edition
Речь не о постоянной памяти на жестком диске или SSD, а об оперативной. Для запуска игры, даже с минимальными настройками графики, потребуется 8 Гб оперативной памяти. При чем максимальное ее количество должно быть свободным. Если есть столько ОЗУ, то просто закрываем все другие процессы на компьютере и запускаем игру. Должно сработать.
Не работает G-Sync
Почему-то G-Sync часто отказывается работать с Mass Effect Legendary Edition. Чтобы заставить утилиту запуститься, нужно:
- Открыть «Панель управления Nvidia».
- Перейти в «Управление настройками 3D».
- В блоке «Глобальные настройки» активировать вертикальную синхронизацию, выставив ей значение «Вкл.».
Ошибка во время установки Mass Effect Legendary Edition
У некоторых геймеров появляется сообщение «Ошибка установки игры, пожалуйста, переустановите». В первую очередь нужно проверить требования игры. Самые важные моменты – она поддерживает только Windows 10 x64, а значит Windows 7 или любые 32-битные ОС не подойдут. Также нужно минимум 8 ГБ ОЗУ и видеокарта GTX 760, ей сопоставимая или лучше.
Как можно исправить ошибку при установке:
- Удалить кэш. Открываем папку Steam, а затем – depotcache и удаляем все ее содержимое. В случае с Origin, следует нажать Win + R и ввести %ProgramData%Electronic ArtsEA Services. Все, что внутри, следует удалить. В конце перезапускаем игровые клиенты.
- Удалить игровые файлы. В строку «Выполнить» вставляем %ProgramData%Electronic ArtsOrigin и удаляем все, за исключением каталога LocalContent. Затем повторяем действие, но уже для %appdata% и папки Origin внутри.
- Переименовать учетную запись. Замечено, что если в нике пользователя Windows указаны специальные символы или цифры, это может вызывать проблемы. Лучше все лишнее убрать, а установить ник, используя только английский алфавит.
Ошибки 0xc0000005 и 0xc0000001
Известно, что обе ошибки часто являются следствием поломки системных файлов Windows. В ME Legendary Edition они проявляются в видео сбоев с кодами 0xc0000005 и 0xc0000001. Еще потенциальная причина – блокировка отдельных файлов игры антивирусной системой.
Как исправить:
- Запустить сканирование Windows. Для этого в командную строку вставляем sfc /scannow и ждем завершения процедуры.
- Создать исключение. Открываем «Параметры» (Win + I), идем в «Обновление и безопасность», а затем – «Защитник Windows». В блоке «Исключения» нажимаем «Добавить исключение». Подобное делаем и со сторонним антивирусом, если он присутствует в системе.
Ошибки 0xc000007b и 8111000b в ME Legendary Edition
Должны помочь либо переустановка видеодрайвера, либо переустановка самой игры. Часто дело просто в неудачно выставленном конфиге во время инсталляции.
Подробнее о том как исправить ошибку 0xc000007b.
ME Legendary Edition выбрасывает, вылетает, не отвечает или сама закрывается
Практически все возможные проблемы при запуске игр имеют место в ME Legendary Edition. Игра может уходить в состояние «Не отвечает», полностью зависая, или просто никак не реагировать на кнопку запуска, выдавать какую-то ошибку, выбрасывать на одной из заставок и т. п.
Что делать при проблемах запуска ME Legendary Edition:
- Запускаем игру в оконном режиме. В нем игра чаще работает правильно. Так как войти в настройки нельзя, нам нужно открыть «Свойства» Mass Effect в Steam и на главной странице нажать «Установить параметры запуска». В строку вставляем «-windowed».
- Проверяем, поддерживает ли ваш процессор набора команд AVX. Это можем сделать в технических характеристиках. Если нет, то помочь в этом случае сможет только обновление ЦП.
- Некорректное имя пользователя. Следует переименовать ник учетной записи на тот, в котором нет цифр или нестандартных символов. Для стабильной работы должны присутствовать только английские буквы.
- Добавляем игру в «Белый список» (исключения) или просто отключаем антивирусную защиту.
- Устанавливаем Microsoft Visual C++ для своей разрядности Windows (х64 или х86).
Перезапустите игру для продолжения привязки учетных записей
Ошибка «Try relaunching your game to continue linking accounts» возникает по той причине, что игра не может связать аккаунт Origin с учетной записью Steam
Как исправить проблему:
- Выходим из Origin и полностью закрываем программу, затем запускаем Steam и уже потом входим в Origin. Теперь должна появиться возможность привязки учетных записей.
- Удаляем Origin и запускаем игру через Steam. Разрешаем Mass Effect установить Origin, а затем закрываем их. Запускаем Steam, входим в игру и привязываем ее к Origin.
ME Legendary Edition вылетает
Часто встречаются жалобы на то, что игра вылетает, как сразу, так и уже ближе к входу в лобби игры. Вот, как это можем исправить:
- Отключаем сторонние программы, особенно внутриигровые оверлеи Steam и Origin. Это можем сделать в настройках.
- Меняем настройки «Контроллера». Для этого открываем «Свойства» игры и идем на вкладку «Контроллер». Выключаем все пункты, которые были активными.
- Проверяем температуру видеокарты. Если игра прекратила работу, дело может быть в перегреве.
Зависает в меню или лагает внутри игры
Проблемы производительности – самые распространенные, они свойственны всем играм с высокими системными требованиями. Если их не удовлетворить, появляются зависания, задержки и сильное падение fps. Однако, даже мощный ПК не является гарантией, что игра не будет лагать.
Способы решения проблем с производительностью:
- Выключаем оверлеи в Steam и Origin.
- Убираем все активные опции контроллера в Steam (инструкция в прошлом разделе).
- Обновляем видеодрайвер.
- Переключаемся на дискретную видеокарту в панели управления графическим адаптером. Windows ошибочно может применять для этого интегрированную графику, которая не в состоянии потянуть столь сложные вычисления.
- Выставляем режим «Максимальной производительности» в «Панели управления Nvidia».
- Меняем настройки графики. Заметный прирост могут дать: отключение «Динамических теней», выключение «Сглаживания» и «Рассеянного затемнения».
Это все основные проблемы Mass Effect Legendary Edition на ПК, о которых нам известно. Мы разобрали различные ошибки, вылеты, лаги, проблемы с сохранением и многое другое. Если ваша неполадка выбивается из этого ряда, пишите в комментариях.
Здравствуйте, играл в Mass effect legendary edition через origin, но после обновления на EA app перестал запускаться пишет что не удалось запустить игру ошибка с нашей стороны, хотя тот же Dead Space 3 работает прекрасно. Помогите
Решено!
Перейти к решению.
Откалибруйте трилогию.
Легендарное издание Mass Effect работает на ПК некорректно. У многих игроков после выбора нужной части трилогии появляется черный экран, а потом – снова экран выбора игры.
Студия Bioware пока никак не прокомментировала ситуацию, неизвестно, когда выйдет патч. Но есть несколько способов, с помощью которых можно заставить игру работать.
Если у вас не запускаются игры в Mass Effect Legendary Edition, сделайте следующее:
- Убедитесь, что имя пользователя содержит только символы латинского алфавита и числа
- Убедитесь, что у вас скачан клиент Origin
- Проверьте путь к игре
- Включите в параметрах языка системы бету использования Юникода (UTF-8)
Последний способ помогает чаще других.
Имя пользователя
Имя пользователя должно состоять из букв латинского алфавита. Чтобы изменить имя пользователя, откройте «Параметры» в меню «Пуск», выберите «Учетные записи».
Студия Bioware пока никак не прокомментировала ситуацию, неизвестно, когда выйдет патч. Но есть несколько способов, с помощью которых можно заставить игру работать.
Если у вас не запускаются игры в Mass Effect Legendary Edition, сделайте следующее:
- Убедитесь, что имя пользователя содержит только символы латинского алфавита и числа
- Убедитесь, что у вас скачан клиент Origin
- Проверьте путь к игре
- Включите в параметрах языка системы бету использования Юникода (UTF-8)
Последний способ помогает чаще других.
Имя пользователя
Имя пользователя должно состоять из букв латинского алфавита. Чтобы изменить имя пользователя, откройте «Параметры» в меню «Пуск», выберите «Учетные записи».
Далее вам нужен пункт «Семья и другие пользователи» и кнопка «Добавить пользователя для этого компьютера».
Далее нужно выбрать:
- У меня нет данных для входа этого человека
- Добавить пользователя без учетной записи Microsoft
- Создайте имя пользователя, используя буквы латинского алфавита
Перезагрузите ПК и выберите нужный профиль.
Клиент Origin
Если у вас не работает Mass Effect Legendary Edition, проверьте, есть ли у вас Origin. Если нет, скачайте его с официального сайта Electronic Arts.
Путь к игре
В пути к папке с игрой не должно быть букв кириллицы.
Скорректируйте параметры языка системы
Мне помог именно этот способ. Нужно включить бета-версию Юникода для поддержки языка во всем мире.
Для этого нужно:
- Открыть «Панель управления»
- Выбрать «Часы и регион» и «Региональные стандарты»
- Открыть вкладку «Дополнительно»
- Выбрать «Изменить язык системы»
- Поставить галочку напротив пункта «Бета версия: Использовать Юникод (UTF-8) для поддержки языка во всем мире» и нажать «ОК»
- Перезапустить ПК
Далее нужно выбрать:
- У меня нет данных для входа этого человека
- Добавить пользователя без учетной записи Microsoft
- Создайте имя пользователя, используя буквы латинского алфавита
Перезагрузите ПК и выберите нужный профиль.
Клиент Origin
Если у вас не работает Mass Effect Legendary Edition, проверьте, есть ли у вас Origin. Если нет, скачайте его с официального сайта Electronic Arts.
Путь к игре
В пути к папке с игрой не должно быть букв кириллицы.
Скорректируйте параметры языка системы
Мне помог именно этот способ. Нужно включить бета-версию Юникода для поддержки языка во всем мире.
Для этого нужно:
- Открыть «Панель управления»
- Выбрать «Часы и регион» и «Региональные стандарты»
- Открыть вкладку «Дополнительно»
- Выбрать «Изменить язык системы»
- Поставить галочку напротив пункта «Бета версия: Использовать Юникод (UTF-8) для поддержки языка во всем мире» и нажать «ОК»
- Перезапустить ПК
Поздравляю, вы восхитительны и можете отправляться на спасение галактики!
* * *
Легчайший тест по трилогии Mass Effect. Его пройдут даже те, кто играл десять лет назад
Первый Mass Effect наконец стал нормальной игрой – в Legendary Edition. Но теперь фанатам делают больно по-другому
Время на прочтение
18 мин
Количество просмотров 18K
Часть 1
В последнее время я работал над собственным форком ME3Explorer [неофициальный редактор игр серии Mass Effect], содержащим множество важных улучшений и даже новые инструменты. Также я поработал над Mod Manager 5.1, который имеет удобные новые функции импорта сторонних модов, однако был отодвинут на второй план, пока я работал над новым фронтендом установщика ALOT.
ALOT Installer с манифестом 2017 года
Для его реализации я сотрудничал с CreeperLava и Aquadran; он должен упростить жизнь конечным пользователям, устанавливающим ALOT и его аддон (сторонние текстуры). Одна из моих проблем заключалась в том, что Origin не запускал игру после установки ALOT, если не запустить его с правами администратора. И поскольку запуск Origin при загрузке невозможно выполнить с правами админа, это очень раздражает. К тому же это влияет на мод MEUITM. Поэтому я начал разбираться, почему это происходит. Дело оказалось в идеальном сочетании реализации защиты, плохого кода и желания упростить жизнь других людей.
Давайте посмотрим, как работает Mass Effect с Origin в неизменённом состоянии под Windows 10.
- Пользователь запускает MassEffect.exe. Файл немедленно запрашивает повышение прав до администраторских.
- В конце образа MassEffect.exe есть код вызова Origin для запуска игры, это некая DRM. Он вызывает Origin, а затем выполняет выход.
- Origin проверяет права пользователя на запуск игры, а затем запускает MassEffect.exe в соответствии с указаниями в реестре (не тот, который вы запустили сами), после чего пытается запустить исполняемый файл.
- Origin не может запустить исполняемый файл, потому что он требует повышения прав. Чтобы DRM работала, она должна иметь возможность взаимодействия с процессом, поэтому она повышает права одного из внутренних сервисов, чтобы он мог общаться с игрой в целях DRM-защиты.
- MassEffect.exe выполняется с правами администратора. Origin обменивается данными с MassEffect.exe и выполнение игры продолжается, как это было бы в случае с DVD-версией.
Всё это работает (через два UAC-запроса) на немодифицированной игре. Но если установить MEUITM или ALOT, то вы больше не сможете запускать игру через Origin как стандартный пользователь. Что за дела?
Сигнатуры файлов
И MEUITM, и ALOT модифицируют исполняемый файл MassEffect.exe, чтобы он мог использовать Large Address Aware. Это позволяет 32-битному процессу Mass Effect использовать до 4 ГБ ОЗУ вместо обычного 32-битного ограничения в 2 ГБ. При модификации флага LAA цифровая сигнатура MassEffect.exe оказывается поломанной — сигнатура используется для проверки того, что файл не модифицирован. После модификации файла сигнатура становится неверной.
Origin при выполнении процесса с повышенными правами проверяет, подписан ли EXE компанией EA и правилен ли он. Если он не подписан EA, то он не повышает права модуля обмена данными DRM. Mass Effect загружается, а затем немедленно закрывается, потому что разблокировка DRM не работает, ведь со стороны Origin ей не с чем общаться, поскольку отказано в повышении прав.
То есть при модификации EXE Origin будет отказываться запускать исполняемый файл игры с повышенными правами. Но нам нужен LAA, поэтому необходимо как-то обойти эту проблему. Наша единственная надежда заключается в том, чтобы помешать MassEffect.exe запускаться с правами администратора. Сначала нужно разобраться, как задан его запуск с правами администратора.
Изучив манифест EXE, я увидел, что он запускается как инициатор вызова — пользователь, запускающий EXE. Это означает, что этот исполняемый файл не должен требовать администраторских прав. Я проверил свои параметры совместимости, там тоже ничего не было. Каким-то образом права повышаются при запуске, но не через сам exe и не из-за моих настроек. В чём же хитрость? В Microsoft Windows Compatibility Database.
mirh (я встречался с ним в кругах любителей моддинга) провёл исследование того, почему Mass Effect вынужден запускаться с правами администратора. Он соответствует критериям базы данных — в ней есть запись для Mass Effect, в которой указано, что нужно всегда принудительно запускать параметры совместимости. Это логично — пользователь не должен конфигурировать параметры, если MS уже знает, какие из них работают (теоретически).
Как видите, для этой игры есть две записи — MassEffect.exe (игра) и загрузчик (который, к сожалению, не включён в версию Origin). Для совместимости включается RunAsHighest (что означает права администратора). Критерии включения таковы:
- EXE имеет название MassEffect.exe
- Название компании в манифесте: BioWare
- Название продукта в манифесте: Mass Effect
- Версия продукта равна или меньше 1.2.0.0.
Эти критерии соответствуют всем известным версиям игры, в том числе, полагаю, и пиратским. Поэтому из-за совпадения всех этих критериев exe принудительно запускается с правами администратора. Это можно легко проверить, переименовав MassEffect.exe, после чего ему не потребуются администраторские права. (Однако Origin будет недоволен).
Исправление
Итак, теперь у нас есть понимание, как это исправить, но почему в базе данных есть эта запись? Поскольку Demiurge/Bioware не поддерживают идею Least User Access (LUA), Mass Effect при самом первом запуске требует прав администратора для выполнения записи в ключ реестра HKEY_LOCAL_MACHINESOFTWAREWOW6432NODEAGEIA Technologies. Если этот ключ не существует, он пытается создать его — без прав администратора у него нет для этого доступа, и игра просто вываливается. Похоже, в этом ключе содержится некая информация о том, что сейчас называется PhysX. Вероятно, запись в реестр мог внести и установщик игры, но разработчики реализовали это в самой игре.
Именно поэтому Microsoft вынуждает игру всегда запускаться с правами администратора, из-за этого единственного пункта. Это логично — если заставить её запускаться под администратором, но пользователю не нужно будет беспокоиться о параметрах совместимости. Однако из-за этой комбинации трёх проблем (LAA портит сигнатуру, MS принуждает запускаться игру с правами администратора, Origin отказывается работать с процессами с повышенными правами, имеющими сломанную сигнатуру EA) Mass Effect не запускается с Origin и LAA.
Как же нам это исправить? Просто изменим в EXE название продукта с Mass Effect на Mass_Effect. Серьёзно, это всё. Проверка критериев не срабатывает, игре больше не нужны права администратора и Origin доволен (если не считать постоянного ворчания из-за обновлений). В MEUITM и ALOT Installer мы добавили код, создающий ключ реестра с правами записи для текущего пользователя, поэтому если Mass Effect нужно создать эти ключи (допустим, если его никогда не запускали), то игра будет довольна.
Часть 2
Mass Effect на PC: что ожидать от порта с консолей середины 2000-х
Если вы не знали, Mass Effect вышла на PC в 2008 году, она была портирована с Xbox 360 студией под названием Demiurge, которая также разработала Pinnacle Station для Mass Effect. Это очень посредственный порт, не особо хорошо переживший смену времён. Он приемлем как игра, но имел множество проблем даже на момент выхода. LOD частиц работали неправильно, LOD текстур считывались в обратном порядке, параметры ini случайным образом сбрасывались на значения по умолчанию — проблем было довольно много. Но не было ничего, что бы полностью ломало игру.
Ну, или типа того. Была одна проблема, но вызванная не конкретно самой Mass Effect. Серьёзная проблема заключается в том, что Mass Effect требует для запуска прав администратора потому что Demiurge, похоже, считала, что все должны запускать игру как администратор — это вполне могло быть приемлемым, если бы игра разрабатывалась во время, когда была только Windows XP, однако на момент выпуска игры уже больше года существовала Windows Vista. Но даже Windows XP имела концепцию LUA (Least User Access) с разделёнными аккаунтами пользователей. Подробнее об этом можно прочитать в первой части статьи.
Ух ты, PhysX, моя любимая библиотека физики!
Наверно, у меня небольшая неприязнь к этому SDK.
Mass Effect для PC работает на немного модифицированной версии Unreal Engine 3, который был выпущен примерно в конце 2006. По словам некоторых бывших разработчиков из BioWare, эта версия Unreal Engine тогда была немного сыроватой, если не сказать больше. Согласно рассказам этих разработчиков, было очень сложно работать с ней, потому что Epic Games сосредоточенно работала над Gears of War и не уделяла особо много времени своим партнёрам, тоже использующим движок.
Для расчёта физических взаимодействий Unreal Engine 3 использует PhysX, поэтому Epic Games создала dll, реализующую интерфейс между PhysX и форматами данных Unreal Engine через файл под названием PhysXLoader.dll, который загружает библиотеки PhysX с обеих сторон. PhysX — это библиотека симуляции физики, приобретённая компанией AGEIA Technologies в середине 2000-х перед тем, как саму AGEIA в начале 2008 года купила Nvidia. Возможно, вы помните карты Physics Processing Unit (PPU) — они использовали PhysX до того, как Nvidia похоронила эту идею.
PhysXLoader.dll, PhysXCore.dll и NxCooking.dll составляют библиотеки PhysX для Mass Effect.
Все три части Mass Effect используют PhysX, однако Mass Effect 2 и Mass Effect 3 используют установленную в систему PhysX, а Mass Effect — локальную PhysX игры. Кроме того, в Mass Effect 2 и Mass Effect 3 применяется «современная» версия PhysX, а не устаревшая, которая была выпущена AGEIA. После приобретения Nvidia изменила некоторые пути внутри библиотеки, отделив устаревшие части от «современных» версий.
Но, похоже, это не мешает программе удаления старой PhysX удалять файлы/ключи реестра современной PhysX, поэтому в процессе тестирования моего исправления другие копии Mass Effect 2/3 не работали даже после установки «современного» дистрибутива PhysX. Очень бесит, что BioWare не смогла просто установить библиотеку на 8 МБ вместе с игрой — в комплекте с игрой всё равно поставляется установщик PhysX, то есть это даже не экономило место!
Ну да ладно…
Проблема PhysXLoader.dll компании Epic Games в том, что она может загружать PhysXCore.dll локально или из установленной в систему версии
Что? Как это может быть проблемой? Разве нельзя просто загружать локальную dll, и если она не существует, загружать системную? Почему это вообще проблема?
Вы не поверите, сколько фейспалмов я испытывал в процессе создания этого исправления.
При запуске Mass Effect записывает в реестр Windows HKEY_LOCAL_MACHINE два значения:
REG_BINARY HKLMSOFTWAREAGEIA Technologies enableLocalPhysXCore [mac-адрес, 6 байт]
REG_DWORD HKLMSOFTWAREAGEIA Technologies EpicLocalDllHack [1]
*Mass Effect — это 32-битная программа, поэтому на 64-битной системе она выполняет запись в HKLMSOFTWAREWOW6432NodeAGEIA Technologies (на случай, если вы захотите проверить сами).
Запомните эти значения реестра, они будут важны в дальнейшем!
Именно из-за этих значений реестра Mass Effect требует административных прав. В первой части мы говорили о том, почему этих операций было достаточно, чтобы Microsoft внесла Mass Effect в базу данных совместимостей, заставляющую игру запускаться под администратором при совпадении определённых критериев исполняемого файла. Мы обошли эту проблему, изменив критерии так, чтобы они больше не совпадали.
Нам нужно изменить исполняемый файл, чтобы включить Large Address Aware, благодаря чему игра сможет загружать текстуры повышенного разрешения без переполнения памяти, поэтому нет никакого способа избежать порчи сигнатуры. Это, в свою очередь, привело к тому, что Origin больше не мог запускать игру, потому что он не может повышать права игры без правильной сигнатуры EA. Но если игра не имеет возможности записывать эти ключи реестра при запуске, то она может вылететь…
Итак, это само по себе уже длинная цепь проблем, но мы обошли необходимость прав администратора в Mass Effect, просто дав аккаунту пользователя разрешение на этот конкретный ключ реестра AGEIA Technologies. Это позволит процессу игры записывать нужные ему значения. Я предполагал, что игра вылетает, потому что ей запрещался доступ для записи, а Demiurge не озаботилась написать try/catch вокруг кода записи в реестр.
Вероятно, не стоит называть значения реестра «hack»
Наше решение этой проблемы не изменило поведения Mass Effect — значения, которые игра хотела записать в реестр, тем или иным способом будут в него записаны, поэтому мы просто позволяем ей делать то, что она всегда делала, только без прав администратора. На самом деле, никаких изменений в поведении приложения не было.
Два значения реестра, записываемые Mass Effect.
Модератор PC Gaming Wiki под ником mirh долгие годы бил тревогу о том, что мы каким-то образом ломали другие игры в ALOT Installer, даже несмотря на то, что наше приложение никак не меняла способ записи Mass Effect этих значений, поэтом наше изменение никак не может сломать другие игры.
Спустя много месяцев он написал довольно подробное обоснование того, почему ALOT Installer (то есть на самом деле это была Mass Effect) ломает другие игры: находящийся в реестре enableLocalPhysXCore используется другими играми, работающими с PhysXLoader.dll. Когда я писал версию V4 установщика ALOT Installer, то сказал mirh, что серьёзнее рассмотрю его идею решения, не позволяющего ломать другие игры, хотя тогда я ещё не понимал, как ключ реестра с MAC-адресом системы может ломать другие игры и зачем вообще используется MAC-адрес.
Похоже, mirh был уверен, что эта enableLocalPhysXCore позволяет Mass Effect использовать PhysXCore.dll/NxCooking.dll в локальной папке, а не загружаться из установленного дистрибутива PhysX. Mass Effect не устанавливает дистрибутив PhysX, поэтому не может полагаться на её существование и вынуждена использовать локальные библиотеки.
Держитесь, теперь начинается нечто совершенно тупое:
MAC-адрес, сохраняемый в реестр файлом MassEffect.exe, считывается библиотекой PhysXLoader.dll и сравнивается с MAC-адресом вашей системы, чтобы определить, нужно ли загружать библиотеки PhysX из локальной папки или из системной.
Какой MAC-адрес?
¯_(ツ)_/¯
Итак, Mass Effect работает следующим образом:
- В самом начале процесса загрузки MassEffect.exe MAC-адрес вашей системы считывается и записывается в реестр как enableLocalPhysXCore (вместе с EpicLocalDllHack)
- MassEffect.exe загружает PhysXLoader.dll
- PhysXLoader.dll считывает значение enableLocalPhysXCore и сравнивает с ним MAC-адрес вашей системы
- Если они совпадают, она использует PhysX из локальной папки, если нет, то версию дистрибутива PhysX из системы
Да, вы всё поняли правильно.
Оказалось, что другие игры, например, Mirror’s Edge, имеют PhysXLoader.dll, которая тоже считывает эти значения (так как они основаны на одинаковом коде), но в этих играх нет локальных библиотек PhysX. Поэтому эти игры загружаются, видят enableLocalPhysXCore и пытаются загрузить локальную библиотеку, терпят неудачу и игра не запускается. Эту информацию я получил от mirh — сам я не тестировал другие игры, поломанные этим значением реестра.
Обычно этого значения не существует, и игра должна использовать PhysX. Это поведение можно протестировать в Mass Effect, запретив доступ на запись к ключу реестра, удалив значения и установив старую версию PhysX — она будет использовать системные библиотеки. Если системная PhysX не установлена, приложение не загрузится — именно поэтому мы изначально разрешали записывать эти ключи Mass Effect, в противном случае бы казалось, что установщик портит Mass Effect, хотя на самом деле виновата ужасная реализация со стороны Epic Games.
Сложно представить сценарий, при котором это было бы хорошей идеей.
Если вы реализуете интерфейс с библиотекой, имеющей экспорт, который можно вызвать для инициализации/загрузки PhysX SDK, то разве нельзя просто передать ей булево значение, приказывающее ей загрузиться локально? Почему она вообще не начинает с локального поиска? И что за дела с MAC-адресом? Почему он находится в реестре, где ведёт себя как глобальный параметр???
Всё это выглядит как ужасные архитектурные решения, а после дизассемблирования PhysXLoader.dll кажется, что всё это и есть ужасные архитектурные решения. Давайте внимательнее присмотримся к Mass Effect и рассмотрим процесс её исправления от начала до конца.
Находим начальную точку
Предупреждение: я совершенный новичок в реверс-инжиниринге. Я создавал ассемблерные моды для игр Megaman Battle Network (и написал неплохое руководство по созданию хуков), проектировал моды на ActionScript2 P-Code и работал с байт-кодом UnrealScript, но никогда не углублялся в ассемблер x86. Я множество раз открывал IDA и могу находить нужные мне вещи, но никогда не понимал их. Уверен, что для более опытных реверс-инженеров этот процесс намного проще.
Сложно получать удовольствие от реверс-инжиниринга, если почти ничего не понимаешь в том, с чего начать. Это режим графа IDA, который очень помогает визуализировать ассемблер, но его всё равно очень сложно понять в большом двоичном файле на 20 МБ.
Недавно (пару лет назад), Агентство национальной безопасности США (АНБ) выпустило Ghidra — бесплатный тулкит для реверс-инжиниринга с открытыми исходниками, который может отреверсировать ассемблерный код в довольно читаемый код на C; его бесконечно проще читать, чем ассемблерные графы IDA. И IDA, и Ghidra имеют свои сильные стороны: в IDA есть отладчик, позволяющий пошагово пройти по ассемблеру и посмотреть, какие пути кода будут выполняться, а также она может находить Unicode-строки (которые используются в Mass Effect ). Ghidra может рекомпилировать ассемблерный код из его декомпилированного кода на C (иногда), имеет преобразователь из ассемблера в C (простите, не знаю его названия), обладает открытыми исходниками и работает на куче платформ и со множеством двоичных форматов.
Ghidra — это отличный инструмент для новичков в реверс-инжиниринге, поскольку она позволяет просматривать ассемблер как код на C, хоть и без имён переменных.
Итак, в начале я знал, что Mass Effect записывает enableLocalPhysXCore и EpicLocalDllHack. Давайте начнём с изучения MassEffect.exe, найдём эти строки и посмотрим, что на них ссылается. Открыв шестнадцатеричный редактор, я знал, что это unicode-строки, поэтому я буду искать их в IDA, потому что Ghidra, похоже, не поддерживает эту функцию.
Окно IDA Strings. Я наконец узнал, что эта полезная вкладка открывается по Shift + F12.
Поискав внутри окна IDA Strings строку enableLocalPhysXCore, я её нашёл. При двойном нажатии программа переносит нас к области данных исполняемого файла, в которой она задаётся:
На изображении вы видите, где задаются enableLocalPhysXCore, EpicLocalDLLHack и даже ключ реестра, все они находятся прямо рядом друг с другом.
Выше мы видим задание строк, которые, похоже, связаны с нашей целью. Над заданием текста мы видим DATA XREF, то есть что-то напрямую ссылается на эти данные — вероятно, записывает их. Давайте дважды щёлкнем на XREF и посмотрим, куда это нас отправит.
Режим IDA View, а не Graph View.
Изучив это, мы видим, что здесь записывается RegSetValueExW. Я очень слабый разработчик на C, поэтому после гугления я понял, что это подготовка стека для вызова на C метода из Windows API, что можно увидеть по отображаемому IDA названию параметра, например, lpData и dwType. Мы знаем, что значению enableLocalPhysXCore присваивается MAC-адрес системы. Давайте посмотрим, где выполняется это присваивание. Чтобы выглядело логичнее, переключимся на режим графа.
В третьем блоке мы видим, что eax записывается в стек для lpData, а также записывается в стек для этого загадочного вызова «sub_10929393». В этой подпроцедуре нет других вызовов с заданными названиями, поэтому вероятно именно там получается MAC. Давайте перейдём к ней.
Похоже, это какая-то подпроцедура-обёртка, или так это трактовала IDA, но она просто указывает на другую подпроцедуру. Давайте перейдём к ней.
Эта подпроцедура содержит названия, взятые из Windows API, и они показывают нам, что это как-то связано с сетью. Нас не волнует MAC-адрес, но давайте зададим название этой подпроцедуре. Назовём её GetMacAddress. Вернёмся к исходной подпроцедуре, которую изучали, и тоже переименуем её — похоже, это что-то типа SetupPhysXSDKLoad, поэтому назовём её так.
Это относительно небольшая подпроцедура, всё, что она делает — это производит запись двух вышеупомянутых значений реестра. Кроме ранних этапов загрузки двоичного файла, на эту подпроцедуру больше нет других ссылок, поэтому на этом этапе я вполне уверен, что исполняемый файл Mass Effect никогда не считывает эти значения, и пока я не знаю, что же делает EpicLocalDllHack.
Вскрываем PhysXLoader.dll
Теперь мы знаем, что исполняемый файл Mass Effect никогда не считывает этот ключ; значит, это делает одна из dll. Здесь я этого не показал, но в ProcMon (отличном инструменте для моддинга и подобных вещей в целом) я вижу, что значение реестра считывается непосредственно перед загрузкой библиотеки в процессе MassEffect.exe и перед загрузкой локальной dll. Я увидел, что после того, как запретил Mass Effect доступ на запись в эту папку, он считывает системную библиотеку, и игра не загружается, если не установлена системная версия старой PhysX.
Первой из dll загружается PhysXLoader, после которой загружается PhysXCore.dll, поэтому логично будет анализировать её. Давайте откроем её в IDA и посмотрим, где там используется enableLocalPhysXCore. Также я открою эту dll в Ghidra, чтобы лучше понимать, что происходит. Проделав ту же последовательность действий по поиску мест использования строки enableLocalPhysXCore, мы находим подпроцедуру:
Подпроцедуру читать не так уж сложно, особенно в режиме графа — мы видим, что есть цикл, идущий из левого блока в блок над ним. Тем не менее, всё это не так просто читать для новичка, поэтому давайте посмотрим, как это выглядит в Ghidra. Я использую адрес этой подпроцедуры, чтобы перейти к ней в Ghidra (0x10001640).
Это даёт нам чуть больше понимания происходящего — вызовов подпроцедуры, цикла, возвращаемого подпроцедурой типа. Мы можем находить элементы в одном из инструментов и помечать их в обоих, чтобы разобраться в том, что происходит. Мы сразу же видим, что есть вызов подпроцедуры, передающий путь к ключу реестра, название значения, а также две переменные. В цикле видим сравнение 6 элементов под индексу для определения их равенства.
Чтобы немного сократить пост, скажу, что эта подпроцедура поиска в реестре и в самом деле является простой обёрткой для получения информации из реестра. После реверс-инжиниринга (который в основном заключался в сопоставлении входящих данных подпроцедуры с тем, чем они являются в вызовах windows api) выяснилось, что её параметры являются подключом, именем значения, возвращаемым указателем на данные и возвращаемым размером данных.
Мы видим, что в подпроцедуре есть цикл, выполняемый шесть итераций и проверяющий равенство каждых значений. Воспользовавшись полученной информацией, мы можем переименовать некоторые переменные, чтобы лучше представлять, что делает подпроцедура.
Мы знаем, что Mass Effect записала в реестр 6-байтный mac-адрес, и что PhysXLoader.dll просто считала это значение из реестра, и что подпроцедура сравнивает что-то побайтно 6 раз. Логически мы можем предположить, что local_14 с показанного выше изображения — это MAC-адрес. Зная это, мы также можем предположить, что FUN_10001580 получает MAC-адрес и задаёт его, поэтому мы переименуем ещё несколько элементов подпроцедуры.
Похоже, что вызов подпроцедуры не выполняет саму загрузку, он просто проверяет ключ и совпадение MAC-адреса. Зная название и информацию о действиях этого ключа, мы можем дать этой подпроцедуре обоснованное название ShouldUseLocalPhysX. Однако сравнение декомпиляции этой подпроцедуры в IDA и Ghidra приводит к немного различающимся результатам, и Ghidra, похоже, ошибается:
IDA показывает, что al присваивается 1 при нормальном выходе из цикла и 0 (xor al,al), если какие-то байты не совпадают. Ghidra этого не показывает, на самом деле она показывает, что возвращаемый тип равен void, что кажется ошибкой.
Немного погуглив информацию для этой части поста, я узнал, что EAX обычно используется как регистр возврата для x86, а регистр al — это нижние 8 бит EAX. Я не имею достаточно опыта в Ghidra, чтобы знать, как сменить тип сигнатуры для этого вида возвращаемых нижних 8 битов; возможно, Ghidra пока этого не поддерживает, или я упустил какую-то настройку, которую нужно использовать.
Дизассемблированная подпроцедура, вызывающая ту, которая ищет enableLocalPhysXCore.
Однако если мы взглянем на ссылки на эту подпроцедуру (их две — скорее всего, по одной на каждую библиотеку) в IDA и Ghidra, то увидим, что при вызове ShouldUseLocalPhysX она проверяет, не равен ли al нулю. Если он не равен нулю, то она загружает локальную PhysXCore.dll. Если равен, то она ищет библиотеку через системную установку PhysX, которая находится по ещё одному значению реестра в ключе AGEIA Technologies под названием PhysXCore Path. На самом деле это нам неинтересно, потому что мы хотим заставить PhysX всегда загружаться локально, вне зависимости от значения enableLocalPhysXCore.
Посмотрев на другую перекрёстную ссылку, можно и в самом деле увидеть, что она загружает библиотеку NxCooking, используя ShouldUseLocalPhysX таким же образом:
Вооружённые этим знанием, мы можем решить эту проблему несколькими способами. Я много занимался моддингом функций в байт-коде UnrealScript, который очень долгое время нельзя было увеличивать и уменьшать в размере, поэтому нахождение способов успешного или неуспешного прохождения логических проверок без изменения размера скрипта оказалось интересной задачей.
Например, если мне нужно было удалить проверку if
, то мне приходилось находить способ изменить сравнения таким образом, чтобы они всегда были true
или false
. Один из способов возврата false
проверкой if
заключается в изменении ссылок на объект и токенов байт-кода сравнений, чтобы создать условный оператор вида if (objectA != objectA)
, всегда возвращающий false
(если они не равны null
). Мне нужно найти способ, чтобы в ShouldUseLocalPhysX всегда получался результат true
.
Когда я писал таблицу символов для Megaman Battle Network 3, то научился всегда комментировать всё, что узнал об дизассемблированном коде. Я работал часами, совершенно забывая, что уже сделал, но мог вернуться к своим комментариям, и снова во всём разобраться.
Иногда мои символы/комментарии на отдельных строках, например, названия подпроцедур или таблицы указателей, встречались в других подпроцедурах, давая мне полезный контекст, которого бы я иначе не увидел. Ниже я прокомментировал и пометил несколько элементов, упрощающих чтение этой подпроцедуры.
Патчим худшую в мире проверку boolean
Нам нужно убедиться, что выполнение всегда доходит до нижнего левого блока, при этом мы не должны касаться стека (который запросто может поломать всю программу). Строго говоря, мы можем переписать часть этой подпроцедуры, но мне хотелось бы вносить здесь минимальные изменения. По сути, нам нужно гарантировать, что переход в нижний правый блок никогда не происходит.
В x86 есть удобная однобайтная команда nop
, которая в буквальном смысле не делает ничего, но занимает один байт. Также удобно то, что команда перехода в этот блок занимает 2 байта и состоит из 0x75 (jnz rel8) и 0x19 (относительного смещения).
[ЗАБАВНАЯ ИСТОРИЯ] Увидев это однобайтное смещение, я вспомнил времена, когда я работал над моддингом Megaman Battle Network. Тогда от команд перехода/ветвления зависела возможность моддинга отдельных частей ROM. При написании хука (перенаправляющего счётчик программы к вашему собственному коду) вам нужно найти команду перехода или ветвления, относительное смещение которой можно модифицировать так, чтобы оно указывало на ваш код. Затем нужно записать регистры в стек, запустить код, а затем вернуть стек обратно, чтобы подпроцедура выполняла выход правильным образом.
ARM (а конкретнее THUMB) имеет ограниченные команды ветвления, использующие в качестве относительных смещений разные размеры, которые не всегда могли перейти в любую точку ROM из-за своего местоположения в ROM. Так как игра была написана на ассемблере, находить свободное место временами было сложновато — иногда приходилось соединять в цепочку несколько хуков, пока не удавалось переместить счётчик программы в свободную область, чтобы писать новый ассемблерный код. Этот jnz использует опкод 0x75, что даёт jnz rel8, то есть он может переходить только на расстояние до 128 байт (или, если переход возможен только вперёд, на 255?), что было бы настоящей проблемой, если бы я выполнял моддинг ассемблера так же, как мы работали раньше, когда не было мощных инструментов наподобие IDA и Ghidra. [КОНЕЦ ЗАБАВНОЙ ИСТОРИИ]
После замены nop
-ами этого jnz
наша подпроцедура ShouldUseLocalPhysX выглядит так:
Теперь в блок условия неравенства попасть нельзя. «Проверка» по-прежнему выполняется, но она никогда не возвращает false
. Будет всегда использоваться локальное ядро PhysX.
Недостатки
Файл PhysXLoader.dll подписан Epic Games, поэтому это очевидно разрушает сигнатуру, ведь мы модифицировали файл. Игра не проверяет сигнатуры при загрузке, поэтому это не проблема. Некоторые антивирусы могут жаловаться на сломанные сигнатуры, но со временем обычно перестают. Кроме написания патча внутри памяти (как мы делаем это в загрузчике мода asi), нам нужно будет модифицировать двоичный файл библиотеки.
Получившееся поведение
Благодаря пропатченной dll игра работает как со значением реестра, так и без него, то есть Mass Effect для запуска больше не требуются права администратора. Дизассемблирование этого кода сопровождалось сильной руганью, потому что я не мог смириться с тупостью реализации этой проверки — проверяется не только значение в реестре, но и MAC-адрес. В процессе отладки и пошагового выполнения команд я на самом деле сломал игру, потому что включил VPN и мой MAC-адрес сменился.
Этот процесс оказался хорошим опытом учёбы, я намного больше узнал о Ghidra и IDA, а также о других проблемах в PC-версии Mass Effect. Этот патч автоматически применяется в процессе установки ALOT Installer, поэтому пользователям не придётся беспокоиться о задании ключа enableLocalPhysXCore. Также мы модифицировали исполняемый файл Mass Effect для записи значения enableLocalPhysXCor_, чтобы наши пропатченные версии не записывали значение, портящее игры. Ванильные исполняемые файлы Mass Effect всё равно портят другие игры, но защита программ от криво написанных загрузчиков PhysX уже не входит в мои задачи.
О, а что насчёт EpicLocalDllHack? Ну, оно в буквальном смысле ничего не делает. Абсолютно бесполезное значение, оно никогда не считывается. Единственная возможная причина его существования, которую я могу придумать — сохранение ключа реестра на случай деинсталляции дистрибутива PhysX, потому что оно не находится в списке значений дистрибутива PhysX, но это всё только догадки.
Разве добавление параметра «PreferLocalSDK» для PhysXLoader.dll — это слишком сложно для Epic Games?