Comenzó con this question, siguió con this question y ahora condujo a la actual. :)¿Cómo ejecutar un programa en Windows con memoria/tiempo de CPU limitados?
La tarea es la siguiente: crear un programa de Windows que ejecutará otro programa en un entorno limitado. No se puede confiar en el otro programa, por lo que debe estar listo para el código de hackeo. Más específicamente:
- límite de la memoria disponible para algunos X MB (dada como parámetro);
- Limite el tiempo de ejecución disponible a algunos X milisegundos (dado como parámetro). Tenga en cuenta que este es el tiempo del núcleo + tiempo del usuario, pero no el tiempo de inactividad. Por otro lado, el tiempo de inactividad también debe ser limitado para que el programa no pueda
Sleep()
infinitamente. - Al finalizar el programa, informe el tiempo de CPU realmente gastado, de la forma más precisa posible. Milisegundos sería bueno, centésimos de segundo aceptable, menos de lo que no sería bueno. Los ciclos de CPU serían ideales.
- Si el programa se cuelga, informe cierta información sobre el bloqueo (cuanto más mejor, pero no vaya por la borda con los rastreos de la pila y similares).
- Captura preferentemente todos los resultados del programa y repórtalo también;
- Se supone que el programa está utilizando solo el directorio actual, además quizás algunos .DLL obligatorios de SYSTEM32 (como kernel.dll, user32.dll, etc.). Limite el acceso a cualquier otra cosa tanto como sea posible. El acceso a cosas como el registro y la red no debería ser necesario (a menos que los .DLL obligatorios lo requieran). Mientras menos acceso, mejor.
Esto será necesario para un software de soporte olímpico informático. Este programa ejecutará las presentaciones de los participantes en el servidor central, por lo que puede esperar casi cualquier cosa allí. Los bloqueos serán rutinarios y también se pueden esperar algunos intentos de pirateo.
Entonces, ¿cómo harías para crear un programa así? ¿Qué usarías? En los temas anteriores (ver arriba) ha quedado claro que adjuntar como depurador es una mala idea, aunque quizás soy demasiado torpe.
virtualización sería bueno, pero no estoy seguro de cómo usarlo en este escenario. En primer lugar, habrá muchas presentaciones , por lo que las pruebas deben ser lo más cortas posible. La mayoría de las ejecuciones de prueba se limitarán a ~ 1 segundo por caso de prueba, y habrá alrededor de 10 casos de prueba. –
Además, si inicio toda una máquina virtual (o incluso la saco de dormir), todavía debo colocar las restricciones/medidas solo en el proceso, no en la máquina virtual. Esencialmente volvemos al paso uno. –
También tenga en cuenta que las medidas deben ser bastante precisas. Sería preferible un milisegundo , centisegundos serían aceptables. Deciseconds sería horrible. Ahora que lo pienso, CPU _cycles_ sería lo mejor.: P –