¿Puedo hacer un programa en C que se ejecute en secreto sin que se muestre automáticamente cuando se enciende la computadora?

No, no escondas el administrador de tareas. Eso definitivamente hará que alguien note tu programa a menos que no sepan mucho sobre computadoras.

No necesita C para hacer un programa ‘secreto’. Si se trata de Windows, instálelo como un servicio y escríbalo sin una interfaz gráfica de usuario. Si es Linux, póngalo en el script de inicio de sesión del perfil. Su mejor opción es escribir un programa que nadie notará, no un programa que nadie pueda notar.

Algunas alternativas interesantes:

  • Puede acceder a la fuente de un conocido programa gratuito y agregar lo que sea como característica. La gente no lo notará por un tiempo de esa manera.
  • Puede agregar el programa al planificador (cron o planificador de tareas, dependiendo del sistema operativo) si no necesita ejecutarse todo el tiempo.
  • Puede conectar hardware que hace cosas, como reprogramar un dispositivo USB para recopilar información directamente del hardware sin participación del sistema operativo. No estoy específicamente familiarizado con cómo hacer esto, pero sé que hay keyloggers de hardware
  • Deja de intentar hackear. No es divertido ni lindo meterse con otras personas. Solo estás siendo malo.
  • Solo rompe las relaciones con quien planeas atacar. Romper la ley y escribir un programa secreto para espiarlos no vale la pena. Si estás tan celoso / enojado con ellos, es mejor fingir que no los conoces.

Buena suerte.

Cinco pasos para escribir servicios de Windows en C

Los servicios de Windows son convenientes para ejecutar aplicaciones en segundo plano y para realizar tareas que no requieren la interacción del usuario. Y C (no C ++) es la mejor opción para aprender los conceptos básicos de estas aplicaciones de consola. Cree e implemente un servicio simple para consultar la cantidad de memoria física disponible y escribir el resultado en un archivo de texto. Luego usa lo que has aprendido para escribir tus propios servicios de Windows.

#include

#include

#define SLEEP_TIME 5000

#define LOGFILE “C: \\ MyServices \\ memstatus.txt”

SERVICE_STATUS ServiceStatus;

SERVICE_STATUS_HANDLE hStatus;

nulo ServiceMain (int argc, char ** argv);

anular ControlHandler (solicitud DWORD);

int InitService ();

int WriteToLog (char * str)

{

ARCHIVO * log;

log = fopen (LOGFILE, “a +”);

if (log == NULL)

volver -1;

fprintf (log, “% s \ n”, str);

fclose (log);

devuelve 0;

}

vacío principal()

{

SERVICE_TABLE_ENTRY ServiceTable [2];

ServiceTable [0] .lpServiceName = “MemoryStatus”;

ServiceTable [0] .lpServiceProc = (LPSERVICE_MAIN_FUNCTION) ServiceMain;

ServiceTable [1] .lpServiceName = NULL;

ServiceTable [1] .lpServiceProc = NULL;

// Inicie el hilo del despachador de control para nuestro servicio

StartServiceCtrlDispatcher (ServiceTable);

}

anular ServiceMain (int argc, char ** argv)

{

en terror;

ServiceStatus.dwServiceType = SERVICE_WIN32;

ServiceStatus.dwCurrentState = SERVICE_START_PENDING;

ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwServiceSpecificExitCode = 0;

ServiceStatus.dwCheckPoint = 0;

ServiceStatus.dwWaitHint = 0;

hStatus = RegisterServiceCtrlHandler (

“Estado de la memoria”,

(LPHANDLER_FUNCTION) ControlHandler);

if (hStatus == (SERVICE_STATUS_HANDLE) 0)

{

// Error al registrar el controlador de control

regreso;

}

// Inicializar servicio

error = InitService ();

si (error)

{

// Inicialización falló

ServiceStatus.dwCurrentState = SERVICE_STOPPED;

ServiceStatus.dwWin32ExitCode = -1;

SetServiceStatus (hStatus, y ServiceStatus);

regreso;

}

// Reportamos el estado de ejecución a SCM.

ServiceStatus.dwCurrentState = SERVICE_RUNNING;

SetServiceStatus (hStatus, y ServiceStatus);

MEMORYSTATUS memoria;

// El ciclo de trabajo de un servicio

while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)

{

buffer de char [16];

GlobalMemoryStatus (& memory);

sprintf (buffer, “% d”, memory.dwAvailPhys);

int resultado = WriteToLog (buffer);

si (resultado)

{

ServiceStatus.dwCurrentState = SERVICE_STOPPED;

ServiceStatus.dwWin32ExitCode = -1;

SetServiceStatus (hStatus, y ServiceStatus);

regreso;

}

Dormir (SLEEP_TIME);

}

regreso;

}

// Inicialización del servicio

int InitService ()

{

resultado int;

resultado = WriteToLog (“Monitoreo iniciado”);

retorno (resultado);

}

// Función de controlador de control

anular ControlHandler (solicitud DWORD)

{

interruptor (solicitud)

{

caso SERVICE_CONTROL_STOP:

WriteToLog (“Monitoreo detenido”);

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwCurrentState = SERVICE_STOPPED;

SetServiceStatus (hStatus, y ServiceStatus);

regreso;

caso SERVICE_CONTROL_SHUTDOWN:

WriteToLog (“Monitoreo detenido”);

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwCurrentState = SERVICE_STOPPED;

SetServiceStatus (hStatus, y ServiceStatus);

regreso;

defecto:

descanso;

}

// Informar estado actual

SetServiceStatus (hStatus, y ServiceStatus);

regreso;

}

Crédito: Yevgeny Menaker

Referencia: http://www.devx.com/cplus/Articl

Esto se puede hacer muy fácilmente con SDL 2.0. Aquí hay un programa SDL que no abrirá ninguna ventana:

#include
#include
#include

#define ELEMSIZE (arr) (sizeof (* arr))
#define ARRAYSIZE (arr) (sizeof (arr) / ELEMSIZE (arr))

static char msg [] = “¡Hola, mundo! \ n”;

int main (int argc, char * argv [])
{
ARCHIVO * fp;

fp = fopen (“hola.txt”, “w”);
if (fp == NULL) va a salir;
fwrite (fp, ELEMSIZE (msg), ARRAYSIZE (msg), fp);
fclose (fp);

devuelve 0;
salida:
retorno 1;
}

¡También es completamente multiplataforma!

En Windows, estos se llaman servicios y en BSD / Linux se llaman demonios. Sin embargo, no son exactamente secretos, ya que abrirán puertos y prestarán servicios de red y proporcionarán una funcionalidad esencial.

Puede ejecutar un programa sin una GUI, pero no puede ocultarlo del administrador de procesos; creo que en realidad es una violación de la política hacer esto. Podrías implementar un programa que llamaría a otro, al cerrar, pero en mi opinión, es una especie de enfoque ‘hacky’. Creo que su mejor apuesta sería bajar un poco en el sistema.

Si no desea que un usuario pueda cerrar un programa, puede evitar que abra el administrador de tareas.

Este hilo de desbordamiento de pila tiene algunos puntos interesantes que pueden guiarlo en la dirección correcta: ¿Cómo puedo ocultar un proceso en el Administrador de tareas en C #?

Puede desactivar la GUI y ocultarla como un proceso del sistema, pero aún se muestra como un proceso. La forma en que funciona un sistema operativo no permite programas secretos.

Absolutamente. Se llama virus.