Python, duda sobre procesos, persistencia y ese tipo de cosas...

Iniciado por #Aitor, 10 Diciembre 2017, 04:49 AM

0 Miembros y 1 Visitante están viendo este tema.

#Aitor

A raíz de hacer tonterias y divertirme con la programación se me ocurrió hacer un programa que generase una key aleatoria y la mandase por e-mail, y si esta no se introducia en menos de X tiempo, apagar el ordenador, la finalidad era saber si entraban a la particion de la tarde gente de por la mañana. El script basta con meterlo en la carpeta dónde windows inicia los programas por defecto al encender el ordenador.

La cosa es, que es tan sencillo como matar el proceso para no lidiar con el programa.

Había pensado sobre un segundo proceso que estuviese pendiente de si el primero lo cerraban, o mataban el proceso, pero pensandolo bien si matan uno muy probablemente matasen el otro. ¿Alguna idea?

Se me ocurren chapuzas como que esté matando siempre el proceso del administrador de tareas, pero podrían matar los procesos mediante la consola, lo cuál también podría matar al cmd... - que sangriento suena todo esto -

Gracias de antemano!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#1
Cita de: #Aitor en 10 Diciembre 2017, 04:49 AMLa cosa es, que es tan sencillo como matar el proceso para no lidiar con el programa.

Había pensado sobre un segundo proceso que estuviese pendiente de si el primero lo cerraban, o mataban el proceso, pero pensandolo bien si matan uno muy probablemente matasen el otro. ¿Alguna idea?

Se me ocurren chapuzas como que esté matando siempre el proceso del administrador de tareas, pero podrían matar los procesos mediante la consola, lo cuál también podría matar al cmd... - que sangriento suena todo esto -

No te comas mucho el coco, en principio es algo mucho mas sencillo de resolver de lo que parece (más abajo se entenderá por que digo "en principio"). Para prevenir todos los males solamente necesitas modificar el modo del proceso a modo crítico, es decir, convertirlo en un proceso crítico (el cual, si se mata, se mostrará un BSOD y el usuario tendría que reiniciar el equipo...)

Eso sí, hacer esto en Python... vamos a ver, estamos hablando de un script, no un executable, así que a menos que establezcas el executable del intérprete (py.exe) como proceso crítico, o estés usando algun framework para el diseño de interfaces de usuario que compile un executable (tu programa)... pues de lo contrario no podrás llevar a cabo esta metodología en dicho lenguaje.

En fin, te explico más en profundidad, para volver un proceso a modo crítico en Windows, primero debes establecer el privilegio de proceso SE_DEBUG_NAME ("SeDebugPrivilege") en tu proceso, para ello deberás lidiar con las siguientes funciones nativas de Windows: OpenProcessToken, CloseHandle, LookupPrivilegeValue y AdjustTokenPrivileges y las estructuras LUID_AND_ATTRIBUTES y TOKEN_PRIVILEGES, y entonces podrás llamar a la función nativa (e indocumentada) de Windows RtlSetProcessIsCritical para volver el proceso crítico.

Aquí te dejo toda la documentación necesaria:

¿Y como implementar todo esto en Python?, pues si te digo la verdad... no tengo ni p**a idea, nunca lo he necesitado hacer ni me interesa Python, pero se que hay algunas librerías gratuitas para Python que te permiten invocar miembros de la API de Windows, como por ejemplo PyWin32, ese podría ser el camino a seguir por donde empezar a documentarse y probar...


...en C++ sería coser y cantar (acceso directo a las funciones y estructuras nativas de la API de Windows), en lenguajes como C# y VB.NET se puede implementar y hacerlo todo en 10 minutejos (servicio de invocación de plataforma más conocido como P/Invoking para el acceso a funciones y estructuras nativas de la API de Windows), pero en Python la verdad es que no se ni tan siquiera si se podrá, pero supongo que algún modo habrá si existe soporte para exponer el uso de funciones nativas del S.O. mediante algún módulo/libreria... o puede que no.

Cita de: #Aitor en 10 Diciembre 2017, 04:49 AMHabía pensado sobre un segundo proceso que estuviese pendiente de si el primero lo cerraban, o mataban el proceso, pero pensandolo bien si matan uno muy probablemente matasen el otro.

A menos que tengas mucho tiempo libre con ganas de aprender cosas nuevas documentándote y no te importe sufrir una estresante y larga etapa de ensayo y error, lo que yo haría en tu lugar sería desarrollar un segundo executable, pero en C++, C# o VB.NET y solamente para que cumpliese la función de volver el proceso a modo crítico por los motivos que he dicho (por que es facil de hacer en esos lenguajes), esa sería su única funcionalidad del programa, y el resto ya con tu executable generado con Python. Pienso que eso sería mucho más viable que (intentar) hacerlo directamente en Python... a menos que ya tengas algo de experiencia en estos temas de llamadas a miembros Win32 desde Python, claro está.




Una alternativa a esto, sería desarrollar un servicio de Windows que trabajase en segundo plano para monitorizar la "existencia" del proceso en cuestión. Seguiría habiendo peligro de que el usuario cierre el programa, pero no el servicio, bueno, en realidad si, pero no sería un problema ya que puedes crear un servicio de sistema que se reinicie automáticamente en caso de cierre y no se pueda deshabilitar/detener de forma natural. Sin embargo, tampoco sé como se haría esto en Python.

Saludos.