Отключение функции API через hotpatch (не глобально) - PullRequest
1 голос
/ 06 января 2012

Сторонняя библиотека, которую я регулярно использую, вмешивается в некоторые функции Windows API, самой раздражающей из которых является SetUnhandledExceptionFilter. Что, неудивительно, делает мой собственный обработчик полностью устаревшим (попробуйте и выясните, почему, если вы не знаете!).

Я бы хотел обойти эту глупость. Очевидным способом было бы перезаписать 5-байтовый пролог хот-патча с помощью xor eax,eax ret 4 (после того, как я сам вызвал функцию), эффективно делая любые дальнейшие вызовы без операции.

Есть две проблемы с этим:

  1. Другие программы, работающие в то же время, могут законно вызывать исправленную функцию. Они могут не быть полностью пораженными мозгом и могут сделать что-то полезное. Поскольку разделяемые библиотеки shared , любые другие программы, загружающие или уже загрузившие ту же DLL во время работы моей программы, будут подвержены исправлению до тех пор, пока моя программа не восстановит функциональность при выходе.
  2. SetUnhandledExceptionFilter живет в kernel32.dll, который никогда не выгружается. Это означает, что в случае непредвиденного завершения программы без исключения (то есть пользователь убивает процесс в TaskManager), исправление будет сохраняться до перезагрузки компьютера. Это очень неприятная особенность.

Существует ли надежный способ сделать это, не нарушая / не нарушая надлежащую функциональность всей системы одновременно?

Я думал о том, чтобы установить защиту на PAGE_WRITECOPY вместо PAGE_WRITE до применения патча (PAGE_EXECUTE_WRITECOPY тоже заманчиво, так как не требует сброса защиты на PAGE_EXECUTE_READ впоследствии, но MSDN говорит, что это поддерживается только после Vista SP1, и функциональность XP должна быть сохранена).

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

Является ли это допустимым предположением, и будет ли это работать, также в соответствии с другими функциями, о которых я, возможно, не задумывался (например, DEP, или какие-то специальные привилегии или другие помехи)?

1 Ответ

3 голосов
/ 06 января 2012

Просто замените эту запись IAT в сторонней библиотеке, которая указывает на SetUnhandledExceptionFilter, это намного проще и локально для сторонней библиотеки только .

Еще лучше, если сторонняя библиотека представляет собой dll / бинарный файл, который вы распространяете вместе со своим приложением, вы можете просто NOP передать вызовы на SetUnhandledExceptionFilter, это окажется проще и безопаснее.

Я думал о том, чтобы установить защиту PAGE_WRITECOPY, а не PAGE_WRITE, прежде чем применять исправление (PAGE_EXECUTE_WRITECOPY тоже заманчиво, так как не требует сброса защиты для PAGE_EXECUTE_READ впоследствии, но MSDN говорит, что это поддерживается только после Vista SP1 и XPфункциональность должна быть сохранена).

На самом деле, PAGE_EXECUTE_READWRITE - это ваша лучшая ставка, но, как правило, это хорошая идея для восстановления первоначальных привилегий, если вам не нужно проверять, не вмешались ли вы или кто-то ещепамять уже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...