Insertar .jar en el registro para auto-ejecución al inicio de Windows!

Iniciado por Debci, 31 Enero 2013, 04:22 AM

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

Debci

Hola compañeros, hace tiempo que no me paso por esta sección del foro y ahora os traigo una duda relativa a un proyecto que estoy desarrollando.

Estoy desarrollando una herramienta de control remoto de la cual requiero que se ejecute al iniciar Windows. Esta herramienta esta desarrollada en Java, por lo que es un archivo con extensión .jar una vez compilado el código (ya me entendéis con "compilador" :P).

Yo lo hago de la siguiente forma:

-Accedo al registro de Windows mediante la herramienta de sistema regedit.exe
-Busco el directorio de claves "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Run"
-Añado una nueva clave de registro, como por ejemplo:
java -jar "C:\Midirectorio\nombreArchivo.jar"

La idea es hacerlo desde la propia aplicación, que en principio no es mi gran problema ahora mismo, pues existe una API para poder realizar dicha tarea.

Entonces ocurre algo que no esperaba, me lanza mi aplicación, que en principio no tiene GUI, pero sin embargo es visible porque se ejecuta en una ventana de consola de sistema tipo DOS.
Hay alguna manera de ejecutarlo en quiet-mode u ocultar dicha ventana?
Este tema me trae de cabeza.
A resumidas cuentas, mi pregunta es:
-Como podría ejecutar un jar al iniciar windows, de forma invisible? (al menos en el escritorio, ya que, se que se vería en la lista de procesos y la máquina virtual, levantaría sospechas)

Además se me ocurre otro problema, una vez alguien haya descargado mi aplicación, deseo que esta se mueva a otro directorio, menos accesible para el usuario. Técnicamente, como puedo lograr esto? No puedo mover mi aplicación si esta se está ejecutando, además de que no tengo nada con que moverlo, porque, no es técnicamente imposible que se mueva a si misma?

Muchísimas gracias por vuestro tiempo :)

Un cordial saludo!

Elemental Code

mmm hace que tu programa la esconda, osea no se como funcionara en java, pero tenes que tener apis para manejar ventanas :P

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

Debci

No se si esto es del todo posible, porque la ventana en sí no pertenece a la instancia de Java, osea que es la consola la que instancía a Java!

Gracias por tu tiempo :)

0xDani

En cuanto a lo de moverte a otro directorio, es perfectamente posible. Abres el archivo de tu programa, lo metes en un buffer, lo borras, abres otro archivo en el directorio que quieras, metes el contenido del buffer en el archivo que has creado y voila!

Y en cuanto a iniciar la ventana en modo oculto, seguramente tendras alguna API, o alguna opcion en el registro o en la propia VM de Java. Y si no en Linux se usa un truco, que es crear un proceso hijo, y que el proceso hijo mate al padre, haciendo que se cierre la ventana, y despues ya operar con el proceso hijo.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Debci

Muchas gracias, me informaré pues :)

Respecto a lo de moverse a otro directorio, si guardo el programa en un buffer, al cerrarlo lo perdería, no? Sugieres que lo haga con dos ejecutables?

Saludos

0xDani

Cita de: Debci en  1 Febrero 2013, 12:15 PM
Muchas gracias, me informaré pues :)

Respecto a lo de moverse a otro directorio, si guardo el programa en un buffer, al cerrarlo lo perdería, no? Sugieres que lo haga con dos ejecutables?

Saludos

No, guardas el programa en un buffer y luego lo vuelcas a otro archivo. Si es necesario coambias la clave del registro para que ejecute ese otro archivo.

Ejemplo en C:


#include <stdio.h>

int main(int argc, char **argv)
{
FILE *f = fopen(argv[0], "rb");    /* Abrirte a ti mismo*/
fseek(f, 0, SEEK_END);             /* Obtener el tamaño del archivo*/
long long fileSize = ftell(f);
fseek(f, 0, SEEK_SET);

char *buffer = malloc(fileSize); /* Reservar memoria para el buffer*/

fread(buffer, 1, fileSize, f);       /* Leer el archivo y meterlo al buffer*/
fclose(f);

f = fopen("/Ruta/a/la/que/quieres/moverte", "wb"); /* Escribir el contenido del buffer en el
                                                            nuevo archivo*/
fwrite(buffer, 1, fileSize, f);
fclose(f);

remove(argv[0]);    /* Borrar el antiguo archivo*/
return 0;
}

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

burbu_1

no sé de java.... pero por hablar que no quede  :laugh: :laugh:
igual te sirve para ocultar la consola

Citarhttp://blog.soporteti.net/programacion-2/ocultar-ventana-de-cmd-al-ejecutar-una-aplicacion-en-windows-java/

lo que comenta 0xDani, si no entiendo mal, es copiarse en vez de mover el archivo en ejecución. Y una vez copiado, puedes iniciar el nuevo proceso con parámetros para terminar el original, o usar algún melt desde el original...
Citarhttp://foro.elhacker.net/programacion_vb/srcsnippet_alternativa_de_melt_winexec-t243264.0.html
, o con shellexecute, inyección....

saludos

Debci

Vuestras respuestas han sido excelentes!
Han desvelado mis ideas!
Confirmo, el comando:
START /B java.exe -jar aplicacion.jar
Consigue ejecutar en segundo plano la aplicación!

Saludos