Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Crodex en Marzo 22, 2014, 11:25:10 am

Título: Ocultar consola
Publicado por: Crodex en Marzo 22, 2014, 11:25:10 am
Buenas gente,

Estoy haciendo un programa para implementar las funciones por consola. Simplemente obtener en un fichero.txt un comando tan simple como ipconfig en el cmd.

Gracias al comando system() mi duda estaba resuelta, pero aparece la molesta ventana del cmd durante algún segundo antes de cerrarse y poder trabajar con el fichero.txt.

Mi duda es: Hay alguna forma de hacer que esa ventana no aparezca aunque sea por esas decimas de segundo?

He probado con otras funciones como shellexecute (con el parametro SW_HIDE) pero aunque se oculta, se muestra también por unas decimas de segundo.
Título: Re:Ocultar consola
Publicado por: mrobles en Marzo 22, 2014, 12:51:16 pm
Se te muestra con esto?
Código: [Seleccionar]
HWND ventana=GetForegroundWindow();
ShowWindow(ventana,SW_HIDE);
Título: Re:Ocultar consola
Publicado por: Crodex en Marzo 22, 2014, 01:07:02 pm
Es una buena solución, pero surge un problema: Se me oculta el programa y no la ventana del cmd.

Buscando por internet he encontrado esto:

Citar
GetForegroundWindow function
Retrieves a handle to the foreground window (the window with which the user is currently working). The system assigns a slightly higher priority to the thread that creates the foreground window than it does to other threads.

Lo que básicamente dice es que le da más importancia a la ventana que abre el proceso, por eso creo que me oculta la ventana del programa padre antes que el cmd
Título: Re:Ocultar consola
Publicado por: mrobles en Marzo 22, 2014, 01:25:06 pm
Ya que andas usando system pues no hay miedo jaja crea un archivo vbs y usalo para encapsular ese ping
Código: [Seleccionar]
echo ping HOST >>archivo.cmd
set objshell = createobject("wscript.shell")
objshell.run "archivo.cmd",vbhide
Título: Re:Ocultar consola
Publicado por: Crodex en Marzo 22, 2014, 01:55:31 pm
Implementando el archivo .vbs, en mi caso lo he editado para que haga la función que quiero:

Archivo.vbs:

Citar
echo netsh advfirewall show currentprofile>firewall.txt >> firewall.cmd
set objshell = createobject("wscript.shell")
objshell.run "firewall.cmd",vbhide

Mientras que en el compilador ejecuto:

Citar
system("start firewall.vbs");

Pero al ejecutar el programa me da un error en la compilación del .vbs (el programa compilado en C se ejecuta y actúa con normalidad hasta ese punto).

Puede que esté cometiendo una barbaridad, pero es la primera vez que trabajo con archivos .vbs  :-[
Título: Re:Ocultar consola
Publicado por: [email protected] en Marzo 22, 2014, 05:24:55 pm
Si publicas el código creo que será más fácil que alguien te pueda echar una mano.

Un saludo.
Título: Re:Ocultar consola
Publicado por: Crodex en Marzo 22, 2014, 05:46:50 pm
Lo tengo en cuenta, subo el codigo:

Código: [Seleccionar]
/*DECLARACIÓN DE VARIABLES*/
        FILE *firewall;
        char info[100];
        int estado=0;
        int error=0;
        char aux[100];


        /*OPERACIONES*/

        system("netsh advfirewall show currentprofile > firewall.txt"); //Creamos el fichero con  cmd


         firewall=fopen("firewall.txt","rt"); // Enlazamos el archivo con el puntero para su posterior lectura


        if(firewall==NULL)                    //En caso de fallo cambiar el label informativo a Error de lectura de datos
        {
                Lefire->Caption = "Error en la lectura del archivo";
                 error =1;
        }
        if (error ==0)    // Si hay error no se pasa a esta parte del programa
        {
                 Lefire->Caption = NULL; //Borramos lo que tenga el label informativo

                 while(!feof(firewall))    //Mientras no se acabe el fichero (cuidado que se repite la ultima linea)//
                {
                         fscanf(firewall,"%s",info); //Lectura del fichero y guardado en la cadena de caracteres

                        if(!feof(firewall))           //Volvemos a comprobar que no se ha acabado el fichero ( por la ultima repeticion)
                        {
                             

                                        Lefire->Caption =  Lefire->Caption + info +" ";  // Cambiamos el label a nuestro antojo con la cadena de caracteres y añadimos
                                       
                               
                                 


                         }
                }

                fclose(firewall);            //Cerramos el archivo para liberar memoria//

                system("del firewall.txt"); //Borramos el archivo usado//

Como podéis ver, no estoy muy entrenado en esto de programar, pero teneis todos los comentarios para que os guíen. Simplemente quiero ver el estado del firewall y mostrarlo por el programa (uso borland c++ builder) en algún label informativo ( en este caso Lefire).

Mi idea es guardar la sesión del cmd en un .txt para después abrirlo con el programa y analizarlo. El problema es que tanto al crear el archivo como al final, que lo elimino, me sale la ventana de comandos, lo cual queda bastante antiestético (y es un cantazo si lo quiero usar para otros fines  ;) )

Alguna idea?
Título: Re:Ocultar consola
Publicado por: [email protected] en Marzo 22, 2014, 09:02:46 pm
Por no liarnos mucho, en esta línea:

Citar
echo netsh advfirewall show currentprofile>firewall.txt >> firewall.cmd

prueba así a ver que tal:

Código: [Seleccionar]
echo netsh advfirewall show currentprofile ^> firewall.txt >> firewall.cmd
Un saludo.
Título: Re:Ocultar consola
Publicado por: Crodex en Marzo 23, 2014, 08:17:09 pm
Gracias por la respuesta¡ Aun así, lo probé y me sigue dando el mismo error. Subo la imagen para ver si os dice algo:

 (http://thumbs.subefotos.com/4847d6bb545f9f6e3d434f5119bafc12o.jpg) (http://subefotos.com/ver/?4847d6bb545f9f6e3d434f5119bafc12o.jpg)

Básicamente copio en un .txt lo que me habeis propuesto y le cambio el formato a .vbs, al ejecutarlo con mi programa me da este fallo.

Gracias por adelantado
Título: Re:Ocultar consola
Publicado por: [email protected] en Marzo 24, 2014, 11:41:11 am
Bueno Crodex, puedes probar con un .bat, la ventana te sale cada vez que haces una llamada a system, intenta sustituir esas llamadas, puedes utilizar las funciones standard ó también Apis.

Creas un archivo .bat con CreateFile, almacenas en una cadena los comandos y los escribes con WriteFile, ejecutas con WinExec, ShellExecute ó CreateProcess y eliminas los archivos con DeleteFile ó remove.

Suerte, un saludo.