Сторонняя библиотека, которую я регулярно использую, вмешивается в некоторые функции Windows API, самой раздражающей из которых является SetUnhandledExceptionFilter
. Что, неудивительно, делает мой собственный обработчик полностью устаревшим (попробуйте и выясните, почему, если вы не знаете!).
Я бы хотел обойти эту глупость. Очевидным способом было бы перезаписать 5-байтовый пролог хот-патча с помощью xor eax,eax ret 4
(после того, как я сам вызвал функцию), эффективно делая любые дальнейшие вызовы без операции.
Есть две проблемы с этим:
- Другие программы, работающие в то же время, могут законно вызывать исправленную функцию. Они могут не быть полностью пораженными мозгом и могут сделать что-то полезное. Поскольку разделяемые библиотеки shared , любые другие программы, загружающие или уже загрузившие ту же DLL во время работы моей программы, будут подвержены исправлению до тех пор, пока моя программа не восстановит функциональность при выходе.
SetUnhandledExceptionFilter
живет в kernel32.dll
, который никогда не выгружается. Это означает, что в случае непредвиденного завершения программы без исключения (то есть пользователь убивает процесс в TaskManager), исправление будет сохраняться до перезагрузки компьютера. Это очень неприятная особенность.
Существует ли надежный способ сделать это, не нарушая / не нарушая надлежащую функциональность всей системы одновременно?
Я думал о том, чтобы установить защиту на PAGE_WRITECOPY
вместо PAGE_WRITE
до применения патча (PAGE_EXECUTE_WRITECOPY
тоже заманчиво, так как не требует сброса защиты на PAGE_EXECUTE_READ
впоследствии, но MSDN говорит, что это поддерживается только после Vista SP1, и функциональность XP должна быть сохранена).
В моем понимании это должно ограничивать видимость любых изменений, которые я делаю в своем процессе.
Является ли это допустимым предположением, и будет ли это работать, также в соответствии с другими функциями, о которых я, возможно, не задумывался (например, DEP, или какие-то специальные привилегии или другие помехи)?