Windows: Как создать пользовательские прокладки приложений (исправления приложений)? - PullRequest
12 голосов
/ 11 ноября 2009

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

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

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

alt text

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

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

GetSystemMetrics(0x1000)

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

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

Ответы [ 4 ]

6 голосов
/ 11 ноября 2009

Я не знаю, чтобы кто-то, кроме Microsoft, внедрил оболочку приложения.

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

3 голосов
/ 12 ноября 2009

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

2 голосов
/ 24 апреля 2012

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

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

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

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

0 голосов
/ 28 декабря 2009

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

...