Окна:Как создать собственные прокладки для совместимости приложений (исправления приложений)?

StackOverflow https://stackoverflow.com/questions/1711665

  •  19-09-2019
  •  | 
  •  

Вопрос

Windows имеет возможность применять прокладки к некорректно работающим приложениям.Шимы используются для перехвата вызовов API и их изменения.Например, прокладки можно использовать для:

  • изменить входящие параметры
  • ложь о возвращаемых значениях
  • измените его, чтобы вызвать что-нибудь другое

А Пакет обеспечения совместимости приложений имеет довольно много существующих прокладок, которые вы можете применить к своему плохому приложению.Вот пример того, который игнорирует ваш вызов API и вместо этого вызывает совершенно другой API:

alt text

мне нужна прокладка, которая не входит в число сотен прокладок, которые уже написала Microsoft. мне нужна специальная прокладка.

В моем случае я хочу перехватывать вызовы:

GetSystemMetrics(0x1000)

чтобы оно вернулось 0.Я не могу найти никакой информации о том, как предоставить Windows свою собственную DLL, в которой будет необходимое мне исправление.я даже не знаю, если ты может создавать индивидуальные прокладки.

Поддерживает ли Windows пользовательские прокладки?

Это было полезно?

Решение

Мне не известен какой-либо способ, которым кто-либо, кроме Microsoft, реализовал прокладку appcompat.

Возможно, вы захотите исследовать Объезды, он может обеспечить необходимую вам функциональность.

Другие советы

Вы должны подумать об этом с точки зрения Рэймонда Чена.Представьте себе, если бы кто-то другой, кроме Microsoft, мог бы написать прокладки совместимости.Тогда всякий раз, когда Microsoft вносит кардинальные изменения, в дополнение ко всей другой работе по обеспечению совместимости им также придется писать оболочки для сторонних прокладок, которые сделали неправильные действия.Поддерживать обратную совместимость и так достаточно сложно.

Это возможно, но это требует некоторой работы.

Вы запускаете приложение, используя свою собственную программу запуска, которая будет применять прокладку.Вы делаете это, позволяя вашей программе запуска создать процесс с достаточными привилегиями для редактирования его памяти.Большинство функций API начинаются с двухбайтового nops, которому предшествуют другие nops.Вы можете изменить двухбайтовый nops на короткий переход, а предыдущие nops на длинный переход, куда бы вы ни захотели.

Альтернативное решение, которое я использовал в прошлом, — загрузить исполняемый файл как DLL, но это может потребовать больше работы, поскольку в зависимости от того, насколько привередливо приложение.В моей ситуации мне пришлось загрузить исполняемый файл как DLL, предназначенную только для данных, и выполнить весь импорт самостоятельно, но, к сожалению, предыдущее решение мне не подходило.

Я также однажды написал перехватывающую DLL, которая использует аналогичные принципы, но это вариант только в том случае, если вы можете либо изменить источник для загрузки DLL, либо если процесс поддерживает плагины DLL.

вы всегда можете использовать реверс-инжиниринг, чтобы исправить это :), дайте мне знать, если вам понадобится помощь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top