Окна:Как создать собственные прокладки для совместимости приложений (исправления приложений)?
-
19-09-2019 - |
Вопрос
Windows имеет возможность применять прокладки к некорректно работающим приложениям.Шимы используются для перехвата вызовов API и их изменения.Например, прокладки можно использовать для:
- изменить входящие параметры
- ложь о возвращаемых значениях
- измените его, чтобы вызвать что-нибудь другое
А Пакет обеспечения совместимости приложений имеет довольно много существующих прокладок, которые вы можете применить к своему плохому приложению.Вот пример того, который игнорирует ваш вызов API и вместо этого вызывает совершенно другой API:
мне нужна прокладка, которая не входит в число сотен прокладок, которые уже написала Microsoft. мне нужна специальная прокладка.
В моем случае я хочу перехватывать вызовы:
GetSystemMetrics(0x1000)
чтобы оно вернулось 0
.Я не могу найти никакой информации о том, как предоставить Windows свою собственную DLL, в которой будет необходимое мне исправление.я даже не знаю, если ты может создавать индивидуальные прокладки.
Поддерживает ли Windows пользовательские прокладки?
Решение
Мне не известен какой-либо способ, которым кто-либо, кроме Microsoft, реализовал прокладку appcompat.
Возможно, вы захотите исследовать Объезды, он может обеспечить необходимую вам функциональность.
Другие советы
Вы должны подумать об этом с точки зрения Рэймонда Чена.Представьте себе, если бы кто-то другой, кроме Microsoft, мог бы написать прокладки совместимости.Тогда всякий раз, когда Microsoft вносит кардинальные изменения, в дополнение ко всей другой работе по обеспечению совместимости им также придется писать оболочки для сторонних прокладок, которые сделали неправильные действия.Поддерживать обратную совместимость и так достаточно сложно.
Это возможно, но это требует некоторой работы.
Вы запускаете приложение, используя свою собственную программу запуска, которая будет применять прокладку.Вы делаете это, позволяя вашей программе запуска создать процесс с достаточными привилегиями для редактирования его памяти.Большинство функций API начинаются с двухбайтового nops, которому предшествуют другие nops.Вы можете изменить двухбайтовый nops на короткий переход, а предыдущие nops на длинный переход, куда бы вы ни захотели.
Альтернативное решение, которое я использовал в прошлом, — загрузить исполняемый файл как DLL, но это может потребовать больше работы, поскольку в зависимости от того, насколько привередливо приложение.В моей ситуации мне пришлось загрузить исполняемый файл как DLL, предназначенную только для данных, и выполнить весь импорт самостоятельно, но, к сожалению, предыдущее решение мне не подходило.
Я также однажды написал перехватывающую DLL, которая использует аналогичные принципы, но это вариант только в том случае, если вы можете либо изменить источник для загрузки DLL, либо если процесс поддерживает плагины DLL.
вы всегда можете использовать реверс-инжиниринг, чтобы исправить это :), дайте мне знать, если вам понадобится помощь.