Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: WaAYa HaCK en 5 Marzo 2012, 20:19 PM

Título: Enviar datos a una ventana en remoto
Publicado por: WaAYa HaCK en 5 Marzo 2012, 20:19 PM
Hola! Tengo un servidor remoto de un juego corriendo en un CMD o bien con una interfaz gráfica. Mi objetivo es, desde un ordenador remoto, enviar una cadena de texto, así como kick jugador, preferiblemente a través de NetCat, y que esta cadena se escriba en una ventana ya abierta. He encontrado esto, para escribir algo en el bloc de notas:
#include <stdio.h>
#include <windows.h>
int main()
{
  HWND ventana,ventana1;
  char texto[]="hola";
  ventana=FindWindow(NULL,"Sin título - Bloc de notas");
  SetForegroundWindow(ventana);
  ventana1=FindWindowEx(ventana, 0, "Edit", 0);
  SendMessage(ventana1,WM_SETTEXT,0,(long)texto);
}

Esto escribe "hola" en el bloc de notas.
Debe ser remoto, así que debe escuchar mediante sockets o bien leer de un archivo :P
#include <winsock2.h> //la cabezera para usar las funciones de winsock
#include <stdio.h>
/*linkamos a la libreria del winsock, también puedes hacerlo desde
project->settings->link si usas ms visual c++ */
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in local;
int len=0;
char Buffer[1024];
//Inicializamos
WSAStartup(MAKEWORD(2,0),&wsa);
//Creamos el socket
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//defnimos dirección por defecto, ipv4 y el puerto 9999
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(9999);
//asociamos el socket al puerto
if (bind(sock, (SOCKADDR*) &local, sizeof(local))==-1)
{
printf("error en el bind\n");
return -1;
}
//ponemos el socket a la escucha
if (listen(sock,1)==-1)
{
printf("error en el listen\n");
return -1;
}
len=sizeof(struct sockaddr);
//hay una conexión entrante y la aceptamos
sock=accept(sock,(sockaddr*)&local,&len);
printf("[SERVIDOR MiniXat para tutorial de sockets MazarDZone Foro]\n");
printf("[Cuando se vaya recibiendo texto aparecera en pantalla ]\n");
while (len!=0) //mientras estemos conectados con el otro pc
{ len=recv(sock,Buffer,1023,0); //recibimos los datos que envie
if (len>0) //si seguimos conectados
{
Buffer[len]=0; //le ponemos el final de cadena
printf("Texto recibido:%s",Buffer); //imprimimos la cadena recibida
}
}
return 0;
}

Es sacado de un tutorial de MazarD.
Ahora: alguien puede ayudarme con esto de escribir en la ventana del CMD? O... cómo puedo encontrar el nombre de una ventana hija (un InputBox o algo así) ???

Muchísimas gracias...
Título: Re: Enviar datos a una ventana en remoto
Publicado por: soyloqbuskas en 5 Marzo 2012, 22:40 PM
¡Buenas WaAYa HaCK!

CMD es una consola no un lenguaje de programacion, asi que necesitaras ayudas de programas externos. Tu problema se solucionaria facilmente si hicieras un programa en C con sockets como bien comentas, pero si lo que quieres es hacerlo con instrucciones de ms-dos, deberias ir a la sección de SCRIPTING que es donde realmente te van a saber aconsejar bien sobre el cmd.

Un saludo.
Título: Re: Enviar datos a una ventana en remoto
Publicado por: WaAYa HaCK en 5 Marzo 2012, 22:41 PM
Dicho servidor, tengo la opción de usarlo sin CMD, con GUI. El problema que tengo es a la hora de enviar una cadena a la ventana hija, puesto que no sé cómo se llama...
Título: Re: Enviar datos a una ventana en remoto
Publicado por: naderST en 5 Marzo 2012, 22:59 PM
Pues para conseguir la clase de una ventana y sus ventanas hijas puedes usar una aplicación llamada Microsoft Spy++ viene con el paquete de Visual Studio. También puedes listar las ventanas y sus hijas con EnumWindows (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx) y EnumChildWindows (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494(v=vs.85).aspx)
Título: Re: Enviar datos a una ventana en remoto
Publicado por: WaAYa HaCK en 6 Marzo 2012, 09:02 AM
Hm. He encontrado esto de EnumChildWindows, pero no sé aplicarlo a mi código...
#include <stdio.h>
#include <windows.h>
int main()
{
  HWND ventana,ventana1;
  char texto[]="hola";
  ventana=FindWindow(NULL,"Sin título - Bloc de notas");
  SetForegroundWindow(ventana);
  SendMessage(ventana1,WM_SETTEXT,0,(long)texto);
}