TL; DR : Я пытаюсь перенаправить системные вызовы в различных операционных системах, чтобы системный вызов, такой как open
, делал вещи, отличные от предыдущих,
Справочная информация (для тех читателей, которые не знают, что такое системные вызовы и что я хочу здесь сделать):
Итак, я пытаюсь сделать: 1. создать подпроцесс (легко; - )) 2. указанный подпроцесс должен автоматически останавливаться, как только он выполняет системный вызов (например, open()
), и вместо исходного системного вызова должен выполняться некоторый предопределенный метод, что позволяет мне выполнять свои вставленные вещи.
Итак, вот что я выяснил (пока):
Состояние в macOS:
Я работаю в macOS, здесь я обнаружил замечательную функцию task_set_emulation
внутри Ядро Маха, которое, казалось, позволило мне заменить части таблицы системных вызовов в пространстве пользователя. ЕСЛИ ТОЛЬКО ЯБЛОКО БЫЛО РЕАЛЬНО РЕАЛИЗОВАНО, ЭТО ВМЕСТО ОСТАВЛЕНИЯ ЗАГОТОВКИ ЖАТКИ: rant:
ptrace
также довольно дрянно на macOS, поэтому в настоящее время я не знаю ни одного возможного решения
Состояние на Windows:
Ну, спасибо MS, есть это: https://www.microsoft.com/en-us/research/project/detours/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fprojects%2Fdetours%2F
«Перенаправление системных вызовов Win32» - это то, что я хочу, если только любой из вас знает лучшее решение.
Статус на Linux:
Здесь ptrace
, кажется, работает как следует (: glance: на apple), но, возможно, есть лучший способ сделать это, знаете ли вы?
Итак, кто-нибудь из вас знает лучшие методы для Linux и Windows? Или какие-нибудь указатели о том, как это сделать в macOS?
PS: Существует один метод, который должен работать во всех операционных системах (почти одинаково): загружать двоичный код программы и переписывать системные вызовы перед выполнение модифицированной программы. Однако по понятным причинам (может нарушить подписание кода, кажется хакерским), я бы предпочел не делать этого.