Windows: Как создать пользовательские прокси-пакеты (Application Fixes)?

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

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

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

alt text

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

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

GetSystemMetrics(0x1000)

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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