Началось с this question, а затем с this question и теперь привело к настоящему. :)Как запустить программу под Windows с ограниченным временем памяти/ЦП?
Задача следующая: создать программу Windows, которая будет запускать другую программу в ограниченной среде. Другой программе нельзя доверять, поэтому она должна быть готова к хакерскому коду. В частности:
- Ограничить доступную память до некоторого X МБ (заданного в качестве параметра);
- Ограничить доступное время выполнения до нескольких миллисекунд (задано в качестве параметра). Обратите внимание, что это время ядра + время пользователя, но не время простоя. С другой стороны, время простоя также должно быть ограничено, так что программа не может
Sleep()
бесконечно. - По завершении программы сообщите о времени процессора, которое оно фактически потратило, насколько это возможно. Миллисекунды были бы хорошими, приемлемыми в течение полусекунд, меньше, чем было бы неплохо. Циклы CPU были бы идеальными.
- Если программа вылетает из строя, сообщите о какой-либо информации о сбое (тем лучше, но не переходите за борт со стековыми следами и т. П.).
- Желательно захватить все выходные данные программы и сообщить об этом;
- В программе предполагается использовать только текущий каталог, плюс, возможно, некоторые обязательные .DLL из SYSTEM32 (например, kernel.dll, user32.dll и т. Д.). Ограничьте доступ ко всему остальному как можно больше. Доступ к таким вещам, как реестр и сеть, не требуется (если этого не требует обязательный .DLL). Чем меньше доступ, тем лучше.
Это будет необходимо для программного обеспечения поддержки olympiad для вычислений. Эта программа будет запускать представления участников на центральном сервере, так что вы можете ожидать почти все. Сбои будут рутинными, и некоторые попытки взлома можно ожидать.
Итак - как бы вы решили сделать такую программу? Что бы вы использовали? В предыдущих темах (см. Выше) стало ясно, что прикрепление в качестве отладчика - плохая идея, хотя, возможно, я просто слишком неуклюж.
Виртуализация была бы приятной, но я не уверен, как ее использовать в этом сценарии. Прежде всего, будет много представлений , поэтому тестирование должно быть как можно короче. Большинство тестовых прогонов будет ограничено ~ 1 секундой на каждый тестовый пример, и будет около 10 тестовых случаев. –
Кроме того, если я запускаю всю виртуальную машину (или даже вывожу ее из спать), я все же должен поместить ограничения/измерения только на один процесс в нем, а не на всю виртуальную машину. По существу мы вернемся на первый шаг. –
Также обратите внимание, что измерения должны быть довольно точными. Миллисекунды предпочтительнее , centiseconds будет приемлемым. Deciseconds будет crappy. Подумайте об этом, CPU _cycles_ будет лучшим.: P –