Не существует простого решения, такого как API, который можно вызвать для ограничения процесса или потока.
Что IE делает в защищенном режиме (в Vista и Windows 7), так это загружает плагины в отдельный процесс с низким уровнем целостности . Процессы, работающие в режиме низкой целостности, имеют меньший доступ к системным ресурсам и более изолированы от процессов с более высоким уровнем целостности. Вы также можете настроить ACL для таких объектов, как объекты файловой системы и ключи реестра, которые контролируют, могут ли процессы с низким уровнем целостности получать к ним доступ. Это ограничивает количество урона, которое они могут нанести. Это форма песочницы или (в зависимости от того, насколько строго вы ее определяете) виртуализации.
Это много работы, чтобы понять это правильно. Процесс с низким уровнем целостности может быть настолько ограничен, что ему потребуется помощь для выполнения многих задач. Когда IE запускает процесс защищенного режима, он дает ему канал для связи с основным процессом IE. Затем плагин может отправлять запросы через этот канал для выполнения таких действий, как внесение изменений в реестр и запись в файловую систему. IE рассматривает запросы, и если он определяет, что это должно быть разрешено, процесс IE сделает это от имени плагина.
Другой подход (который можно использовать для дополнения «песочницы») заключается в том, чтобы DLL была подписана действительным сертификатом. Подписание позволяет вам иметь немного больше доверия к DLL, потому что сертификат определяет ответственную сторону. Подпись также гарантирует, что никто не вмешивался в DLL.
Еще один подход - перехватить все вызовы API OS, которые вы хотите ограничить. Для этого есть библиотеки , но этот метод основан на небольшом взломе ОС, который может сломаться при любом обновлении. Идея состоит в том, чтобы создать процесс с некоторым вашим кодом, который устанавливает хук для каждого API, который вы хотите ограничить, а затем загружает ненадежный код и выполняет его. Если DLL вызывает перехваченный API (например, CreateFile
), вместо этого будет вызываться ваш код, и он может решить, возвратить ли ошибку или передать вызов в реальный API OS. Это сложно, потому что количество API, которые вы должны подключить, может быть огромным. Кроме того, если DLL знает, что этот метод используется, есть вещи, которые она может сделать, чтобы подорвать ее.
Наконец, вы можете сделать настоящую песочницу, вообще не запуская нативный код. Вместо загрузки ненадежной DLL вы загружаете код, который был скомпилирован, в некоторую промежуточную форму и интерпретируете ее. Это дает вашему переводчику полный контроль над тем, что может делать программа. Это также сложно реализовать и значительно снижает производительность.
Это крайности, через которые вам придется пройти, если вы собираетесь запустить ненадежный код.