Tengo curiosidad por saber cómo se borra Duqu. Desde el punto de vista técnico y, en general, ¿cómo puede un ejecutable borrarse mientras se ejecuta? ¿Duqu usa un procedimiento específico para hacer esto?
¿cómo se puede eliminar un ejecutable mientras se está ejecutando?
Windows utiliza la asignación de memoria para cargar archivos ejecutables en la memoria, por lo que desafortunadamente el archivo ejecutable (a diferencia de los sistemas operativos basados en Unix) no puede ser eliminado .
Unix es ligeramente diferente (ya que hay un debate sobre esto en la otra respuesta), sin embargo, todavía usa mmap()
para cargar ejecutables (puede verificar esto con strace). Resulta que lo que sucede cuando sobrescribes dichos ejecutables es bastante complicado pero todo se reduce a cómo se hace la sobreescritura. Dado que Unix usa inodos, como lo entiendo, el recuento de referencias a ese inodo disminuiría, pero uno se mantiene (para el programa en ejecución), por lo tanto, la eliminación automática es posible: la referencia para el dentry
(ruta del disco) desaparece, pero no para el mmap()
.
Windows no tiene un concepto de inodo, por lo que el archivo debe existir mientras el programa se está ejecutando. Este es un problema que casi cualquier persona que haya escrito un desinstalador habrá experimentado, o incluso una utilidad temporal. El primer enlace que te di corre a través de las técnicas que puedes usar; estos son, brevemente:
MoveFileEx
) DELETE_ON_CLOSE
a través de CreateFile
. y varios otros. No estropearé el artículo, y creo que también he visto otras técnicas utilizadas, por lo que puede considerar que hay muchas formas en que un ejecutable podría eliminarse automáticamente.
No he visto Duqu en sí mismo, pero el procedimiento habitual para hacer esto es generar un proceso que elimine el ejecutable en ejecución, por lo que algo como exec("rm " + argv[0]")
haría el truco.