Skip to content

rotanov/Spawner

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Модуль контролируемого исполнения программ "Spawner"

Модуль разрабатывается как часть системы организации соревнований Cats. Модуль поддерживает различные режимы совместимости. Режим совместимости задается ключом --legacy или переменной окружения SP_LEGACY. Доступные значения можно посмотреть в списке поддерживаемых систем. Значение по-умолчанию sp00. Справку по каждой из них можно получить запустив модуль с ключом --help или -h.

Building

Visual Studio 2013+

git clone git@github.com:klenin/Spawner.git
cd Spawner
git submodule init
git submodule update
mkdir build
cd build
cmake ..
sp.sln

Visual Studio 2013+ solution sp.sln will be generated in ./Spawner/build.

GCC

There are numerous gcc distributions for windows.

  • MinGW has not been updated for long and has this bug which prevents project from being compiled.
  • MinGW-w64 has not been tested
  • Nuwen MinGW is supported
  • MSYS2 is supported

Basic steps are the same:

git clone git@github.com:klenin/Spawner.git
cd Spawner
git submodule init
git submodule update
mkdir build
cd build

Now g++ and make must be in your PATH.

With Nuwen-MinGW you might need to use

set LIB=C:\Nuwen-MinGW\MinGW\x86_64-w64-mingw32\lib

in order for cmake to find libuserenv.

With MinGW use:

cmake -G "MinGW Makefiles" -D CMAKE_CXX_COMPILER=g++.exe -D CMAKE_MAKE_PROGRAM=make.exe ..
make

And with MSYS2:

cmake -G "MSYS Makefiles"  -D CMAKE_CXX_COMPILER=g++ -D CMAKE_MAKE_PROGRAM=make ..
make

sp99

Изначальная версия sp взятая за основу этого проекта.

sp [опции] имя_приложения [параметры_приложения]
Опции Переменные окружения
-ml:[n] SP_MEMORY_LIMIT Максимальный объем виртуальной памяти, выделенный процессу (в Mb).
-tl:[n] SP_TIME_LIMIT Максимальное время выполнения процесса в пользовательском режиме (в сек).
-d:[n] SP_DEADLINE Лимит физического времени, выделенного процессу (в сек).
-wl:[n] SP_WRITE_LIMIT Максимальный объем данных, который может быть записан процессом (в Mb).
-u:[user@domain] SP_USER Имя пользователя в формате: User[@Domain]
-p:[password] SP_PASSWORD Пароль.
-runas:[0 1] SP_RUNAS
-s:[n] SP_SECURITY_LEVEL Уровень безопасности. Может принимать значения 0 или 1.
-hr:[0 1] SP_HIDE_REPORT
-ho:[0 1] SP_HIDE_OUTPUT
-sr:[file] SP_REPORT_FILE Сохранить отчет в файл.
-so:[file] SP_OUTPUT_FILE Сохранить выходной поток в файл.
-i:[file] SP_INPUT_FILE Получить входной поток из файла.
                                                                                                                  |

Примечание: Параметры командной строки перекрывают значения переменных окружения.

Формат файла отчета.

[пустая строка]
--------------- Spawner report ---------------
Application:            [Application]
Parameters:             [Parameters]
SecurityLevel:          [SecurityLevel]
CreateProcessMethod:    [CreateProcessMethod]
UserName:               [UserName]
UserTimeLimit:          [UserTimeLimit]
Deadline:               [Deadline]
MemoryLimit:            [MemoryLimit]
WriteLimit:             [WriteLimit]
----------------------------------------------
UserTime:               [UserTime]
PeakMemoryUsed:         [PeakMemoryUsed]
Written:                [Written]
TerminateReason:        [TerminateReason]
ExitStatus:             [ExitStatus]
----------------------------------------------
SpawnerError:           [SpawnerError]
  • Application - Имя приложения

  • Parameters - Параметры приложения

  • SecurityLevel - Уровень защиты. Может быть 0 (по-умолчанию) или 1. Уровень 1 включает защиту от:

    • Выхода из системы, завершения ее работы, перезагрузки или выключения компьютера
    • Чтения, записи, стирания буфера обмена
    • Изменения системных параметров через SystemParametersInfo
    • Изменения параметров экрана через ChangeDisplaySettings
    • Создания новых рабочих столов или переключения между ними
    • Использования USER-объектов (например, HWND), созданных внешними процессами
    • Доступа к общей таблицы атомов (global atom table)
  • CreateProcessMethod - Метод создания процесса. Может быть: "CreateProcess", "CreateProcessAsUser", "RunAs service" * "CreateProcess" - процесс запускается от текущего пользователя * "CreateProcessAsUser" - процесс запускается от заданного пользователя. * "RunAs service" - процесс запускается при помощи сервиса RunAs.

      Запуск процесса от другого пользователя требует очень важных привилегий, а именно:
          SeTcbPrivilege (Работа в режиме операционной системы)
          SeAssignPrimaryTokenPrivilege (Замена маркера уровня процесса)
          SeIncreaseQuotaPrivilege (Увеличение квот)
      Запуск с помощью RunAs в некоторых конфигурациях может работать не корректно, 
      но он не требует специальных привилегий и может быть выполнен от обычного пользователя, 
      однако для этого должен быть включен сервис RunAs (SecondaryLogon).
    
  • UserName - Имя пользователя под которым был запущен дочерний процесс в формате: User[@Domain]

  • UserTimeLimit - максимальное время в сек. выполнения процесса в пользовательском режиме по истечении которого процесс прерывается. По умолчанию: "Infinity".

  • Deadline - Время в сек., которое выделено процессу. По умолчанию: "Infinity". Отличается от TimeLimit тем, что это физическое время. Если процесс непрерывно осуществляет ввод/вывод, находиться в состоянии ожидания или система перегружена, то процесс может выполнятся неограниченно долго несмотря на TimeLimit. Для предотвращения данной ситуации нужно установить DeadLine.

  • MemoryLimit - Максимальный объем выделяемой памяти процессу в Mb. По умолчанию: "Infinity"

  • WriteLimit - Максимальный объем информации, который может быть записан процессом в Mb. По умолчанию: "Infinity"

  • UserTime - Фактическое время выполнения процесса в сек. с точностью до 10e-3.

  • PeakMemoryUsed - Максимальное использование виртуальной памяти процессом в Mb.

  • Written - Объем информации, который был записан процессом в Mb.

  • TerminateReason - Причина завершения процесса. Может быть: * "ExitProcess" - процесс завершился нормально * "MemoryLimitExceeded" - превышен лимит памяти * "TimeLimitExceeded" - превышен лимит времени выполнения (либо TimeLimit, либо Deadline) * "WriteLimitExceeded" - превышен лимит записи * "AbnormalExitProcess" - процесс завершился с исключением (список исключений см. ниже) * Если процесс не был завершен, то данному полю соответствует значение ""

  • ExitStatus - Статус завершения процесса. Может принимать значение кода возврата процесса, либо одной из следующих констант: * "AccessViolation" * "ArrayBoundsExceeded" * "Breakpoint" * "Control_C_Exit" * "DatatypeMisalignment" * "FloatDenormalOperand" * "FloatInexactResult" * "FloatInvalidOperation" * "FloatMultipleFaults" * "FloatMultipleTraps" * "FloatOverflow" * "FloatStackCheck" * "FloatUnderflow" * "GuardPageViolation" * "IllegalInstruction" * "InPageError" * "InvalidDisposition" * "IntegerDivideByZero" * "IntegerOverflow" * "NoncontinuableException" * "PrivilegedInstruction" * "RegNatConsumption" * "SingleStep" * "StackOverflow"

  • SpawnerError - Текст ошибки при работе spawner'а. Если ошибка не произошла, то полю соответствует значение ""

sp00

Опции Переменные окружения
tl SP_TIME_LIMIT
ml SP_MEMORY_LIMIT
s SP_SECURITY_LEVEL
d SP_DEADLINE
wl SP_WRITE_LIMIT
-lr SP_LOAD_RATIO
-y SP_IDLE_TIME_LIMIT
-u SP_USER
-p SP_PASSWORD
-sr SP_REPORT_FILE
-so, --out SP_OUTPUT_FILE
-e, -se, --err SP_ERROR_FILE
-i, --in SP_INPUT_FILE
--delegated SP_RUNAS
--debug SP_DEBUG
--cmd, --systempath SP_SYSTEM_PATH
-wd SP_DIRECTORY
-ho SP_HIDE_OUTPUT
-hr SP_HIDE_REPORT
-sw SP_SHOW_WINDOW
--session --
--separator SP_SEPARATOR
--program SP_PROGRAM
pcms2

Опции
-h show this help
-t time limit, terminate after seconds, you can add "ms" (without quotes) after the number to specify time limit in milliseconds
-m memory limit, terminate if working set of the process exceeds bytes, you can add K or M to specify memory limit in kilo- or megabytes
-r required load of the processor for this process not to be considered idle. You can add % sign to specify required load in percent, default is 0.05 = 5%
-y ildeness limit, terminate process if it did not load processor for at least for
-d make home directory for process
-l create process under
-p logins user using
-i redirects standart input stream to the
-o redirects standart output stream to the
-e redirects standart error stream to the
-x return exit code of the application
-q do not display any information on the screen
-w display program window on the screen
-1 use single CPU/CPU core
-s store statistics in then
-D var=value sets value of the environment variable, current environment is completly ignored in this case
Exteneded options:
-Xacp,
--allow-create-processes allow the created process to create new processes
-Xtfce, --terminate-on-first-chance-exceptions do not ignore exceptions if they are marked as first-chance, required for some old compilers as Borland Delphi
-Xlegacy, -z try to be compatible with old invoke.dll

Examples:

  sp -t 10s -m 32M -i 10s a.exe
  sp -d "C:\My Directory" a.exe
  sp -l invoker -p password a.exe
  sp -i input.txt -o output.txt -e error.txt a.exe

About

Sandbox runner for Windows

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 89.2%
  • C 6.8%
  • CMake 2.4%
  • Perl 1.6%