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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9
21  Programación / Programación C/C++ / Re: [Ayuda-C] Vectores y punteros (inicialización dinámica) en: 12 Noviembre 2014, 21:32 pm
Muchas gracias por la ayuda, alfinal el pensar si decidir sobre el rendimiento sobre la estabilidad es cosa del programador.

Marco el tema como resuelto.

Saludos.
22  Programación / Programación C/C++ / Re: [Ayuda-C] Vectores y punteros (inicialización dinámica) en: 12 Noviembre 2014, 21:24 pm
@ivancea96:

Entonces, una posible solución podría ser (no explicada, pero se entiende bien):

Código
  1. typedef struct _vectf {
  2. float *data;
  3. int size;
  4. } vectf;
  5.  
  6. int init_vectorf(vectf *vectorf, int capacity) {
  7. vectorf->size = capacity * sizeof(float);
  8. vectorf->data = malloc(vectorf->size);
  9. if(!vectorf->data)
  10. return 0;
  11.  
  12. printf("[*] Inicializado vectorf de tamano: %d (%d elementos).", vectorf->size, vectorf->size / (int)sizeof(float));
  13.  
  14. return 1;
  15. }

O ahorrando a la larga algunas operaciones:

Código
  1. typedef struct _vectf {
  2. float *data;
  3. int capacity;
  4. int size;
  5. } vectf;
  6.  
  7. int init_vectorf(vectf *vectorf, int capacity) {
  8. vectorf->capacity = capacity;
  9. vectorf->size = capacity * sizeof(float);
  10. vectorf->data = malloc(vectorf->size);
  11. if(!vectorf->data)
  12. return 0;
  13.  
  14. printf("[*] Inicializado vectorf de tamano: %d (%d elementos).", vectorf->size, capacity);
  15.  
  16. return 1;
  17. }
23  Programación / Programación C/C++ / [Ayuda-C] Vectores y punteros (inicialización dinámica) en: 12 Noviembre 2014, 20:54 pm
Para el uso más cómodo de un programa en la creación de un simulador físico que requiere el uso de muchos vectores se me ha ocurrido crear una libreria para el manejo de los vectores. Comienzo definiendo la siguiente estructura:

Código
  1. typedef struct _vectf {
  2. float *data;
  3. int cap;
  4. } vectf;

Entonces para la creación del vector uso:

Código
  1. vectf v;

Y creo una función que inicialice el vector (reservar memoria y ajustar elementos):

Código
  1. int init_vectorf(vectf *vectorf, int capacity) {
  2. vectorf->data = malloc(capacity * sizeof(float));
  3. if(!vectorf->data)
  4. return 0;
  5.  
  6. vectorf->cap = sizeof(vectorf->data) / sizeof(vectorf->data[0]);
  7. //vectorf->cap = capacity;
  8. printf("sizeof(float) = %ld\n", sizeof(float));
  9. printf("Inicializado vectorf de tamano: %d (%d elementos).", (int)sizeof(vectorf->data), sizeof(vectorf->data) / sizeof(vectorf->data[0]));
  10.  
  11. return 1;
  12. }

En este paso se encuentra mi problema. Explicaré la idea del código para un mejor entendimiento:
1. Se reserva memoria para (n_elementos * tamaño_dato), esto es, si yo declaro:

Código
  1. init_vectorf(&vectorf, 3);

el cálculo sería: (3 * sizeof(float)), es decir, 3 elementos * 4 bytes = 12 bytes.

Cuando se hace la operación:
Código
  1. vectorf->cap = sizeof(vectorf->data) / sizeof(vectorf->data[0]);
la capacidad se establece a 3, como debería: memoria_total / tamaño_dato = 12 bytes / 4 bytes = 3 elementos.

El error viene que justamente despues al mostrarse la información de inicialización del vector escribe el siguiente mensaje en pantalla:

Código
  1. mikygonzalez@public_gpg ~/ $ Inicializado vectorf de tamano: 8 (2 elementos).

¿Alguien puede explicar porqué no me devuelve tamaño 12, 3 elementos?. Seguramente sea un error con los punteros ó el tamaño de datos, pero no soy capaz de localizarlo.

Saludos,
MikyGonzalez
24  Seguridad Informática / Hacking / Rompiendo la seguridad de Gilisoft USB Lock en: 26 Abril 2014, 13:19 pm
Gilisoft Usb Lock es un programa que nos permite entre muchas otras cosas bloquear el acceso USB y páginas web.

Su utilización es sencilla y tiene la posibilidad de introducir una contraseña de acceso para modificar sus configuraciones. Esta contraseña esta cifrada, y nosotros a traves del editor de registro podemos saber la contraseña (cifrada). No hace falta saber el algoritmo de cifrado, ya que cualquier valor que introduzcamos en el campo de contraseña equivale a un valor cifrado. A esto se le llama cifrado por diccionario (por ejemplo: a = 0x85, b = 0x86...). En esta situación se puede producir un ataque fácilmente porque el algoritmo de cifrado no determina ni la posición del carácter ni la longitud de la cadena.

Despues de ver el código del programa, se determina el siguiente diccionario:


Si es una contraseña larga y no merece buscar cual es el texto descifrado, podríamos sustituir todo el contenido por: 9e 00, equivalente a la contraseña "a" ('a'-'\0').

Una alternativa para ordenador que tienen eliminado/prohibido el uso del editor de registro, se puede utilizar el comando reg para interactuar con el registro; un ejemplo de su uso: reg import cambiar_clave_gilisoft.reg.

Para el uso con sistemas de 64Bits, el código a importar en registro sería como sigue:

Código
  1. Windows Registry Editor Version 5.00
  2. [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Gilisoft-usb-lock\configure]
  3. "datP"=hex:9e,00

32 Bits:

Código
  1. Windows Registry Editor Version 5.00
  2. [HKEY_LOCAL_MACHINE\SOFTWARE\Gilisoft-usb-lock\configure]
  3. "datP"=hex:9e,00
25  Programación / Programación C/C++ / Re: ¿Cómo crear un Windows Form? en: 16 Marzo 2014, 13:17 pm
Para crear una simple ventana (generalmente me gusta el código multiplataforma) te aconsejo usar GTK, versión 2 ó 3.

Un ejemplo de código que te podría servir, aunque necesitas documentarte:

Código
  1. #include <gtk/gtk.h>
  2.  
  3. int main(int argc, char *argv[]) {
  4. /*! Los widgets que usaremos */
  5. GtkWidget *win = NULL; // Ventana
  6. GtkWidget *close = NULL; // Botón cerrar
  7.  
  8. /*! Inicializar GTK+ */
  9. g_log_set_handler("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc)gtk_false, NULL);
  10. gtk_init(&argc, &argv);
  11. g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
  12.  
  13. /*! Hacer la ventana */
  14. win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  15. gtk_container_set_border_width(GTK_CONTAINER(win), 10);
  16. gtk_widget_realize(win);
  17.  
  18. /*! Botón que ayudará a cerrar la ventana */
  19. close = gtk_button_new_with_label("CERRAR VENTANA");
  20. gtk_container_add(GTK_CONTAINER(win), close);
  21.  
  22. /*! Devoluciones de llamadas (Callbacks) */
  23. g_signal_connect((gpointer)close, "clicked", G_CALLBACK(gtk_main_quit), NULL); // Botón cerrar
  24. g_signal_connect((gpointer)win, "destroy", G_CALLBACK(gtk_main_quit), NULL); // Ventana
  25.  
  26. /*! Entrar en bucle principal */
  27. gtk_widget_show_all(win);
  28. gtk_main();
  29. return 0;
  30. }
  31.  

También puedes crear tu propia ventana con la API nativa de windows haciendo uso de funciones como: CreateWindowEx, RegisterClass, ShowWindow.
Espero que te haya servido de ayuda, puedes encontrar documentos de interés en:

http://www.winprog.org/tutorial/start.html
26  Programación / Programación C/C++ / Re: [Codigo] Interesante codigo imprime numero primo de mayor cifras en: 13 Octubre 2013, 21:13 pm
La cosa estaba en poner los códigos de la manera más ofuscada posible  :xD
27  Programación / Programación C/C++ / [Ayuda-C] Algo falla... en: 12 Octubre 2013, 15:16 pm
Dado el siguiente código:

Código
  1. char lista_instrucciones[NUM_INSTR][10] = {
  2. {"PRINT"},
  3. {"SUM"},
  4. {"EXIT"}
  5. };
  6.  
  7. char *codigo = "PRINT BASURA!", *codigo2 = "EXIT TRASH";
  8.  
  9. void identificador_cadena(unsigned char *codigo) {
  10. unsigned short int pos_buffer = 0;
  11. char *buffer = (char *)malloc(1 * sizeof(char));
  12.  
  13. while(saber_letra(codigo[pos])) {
  14. buffer[pos_buffer] = codigo[pos];
  15. pos++;
  16. pos_buffer++;
  17. buffer = (char *)realloc(buffer, (pos_buffer + 1) * sizeof(char));
  18. }
  19.  
  20. buffer[pos_buffer] = '\0';
  21.  
  22. // Reutilizar variable pos_buffer
  23. for(pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
  24. if(!strcmp(buffer, lista_instrucciones[pos_buffer]))
  25. printf("Encontrado %s en %s\n", lista_instrucciones[pos_buffer], buffer);
  26.  
  27. free(buffer);
  28. return;
  29. }
  30.  

Se espera que al pasar las variables codigo y codigo2 a la función identificador_cadena, esta imprima en pantalla:

Código:
Encontrado PRINT en PRINT
Encontrado EXIT en EXIT

Pero en su lugar, imprime:
Código:
Encontrado SUM en PRINT
Encontrado EXIT en PRINT
Encontrado PRINT en EXIT
Encontrado SUM en EXIT

¿Alguien podría determinar el error?, no entiendo porque esto sucede
28  Programación / Programación C/C++ / [Codigo] Interesante codigo imprime numero primo de mayor cifras en: 12 Octubre 2013, 14:07 pm
Solo por interés, les dejo un código proveniente de una fuente web que les dejo más abajo:

Código
  1. #include <stdio.h>
  2.  
  3. int m = 1711276033, N = 1, t[1 << 25] = { 2 }, a, *p, i, e = 39717691, s, c, U = 1;
  4.  
  5. void g(int d, int h) {
  6. for(i = s; i < 1 << 24; i *= 2)
  7. d = d * 1LL * d % m;
  8. for(p = t; p < t + N; p += s)
  9. for(i = s, c = 1; i; i--)
  10. a = p[s] * (h ? c : 1LL) % m, p[s] = (m * 1U + *p - a) * (h ? 1LL : c) % m, *p = (a * 1U + *p) % m, p++, c = c * 1LL * d % m;
  11. }
  12.  
  13. int main() {
  14. while(e /= 2) {
  15. N *= 2;
  16. U = U * 1LL * (m + 1) / 2 % m;
  17. for(s = N; s /= 2;)
  18. g(40, 0);
  19. for(p = t; p < t + N; p++)
  20. *p = *p * 1LL ** p % m * U % m;
  21. for(s = 1; s < N; s *= 2)
  22. g(983983719, 1);
  23. for(a = 0, p = t; p < t + N;)
  24. a += *p << (e & 1), *p++ = a % 10, a /= 10;
  25. }
  26. while(!*--p);
  27. for(t[0]--; p >= t;)
  28. putchar(48 + *p--);
  29.  
  30. return 0;
  31. }
  32.  

[1] http://ijunkey.com/a-small-c-program-to-print-the-biggest-prime-number/
29  Programación / Programación C/C++ / Re: [Ayuda-C] Bucle infinito en: 11 Octubre 2013, 15:51 pm
Gracias por la ayuda, al final resultó ser un problema estúpido. No aumentaba la variable pos en un determinado caso: que los paréntesis sean escritos juntos.

Respecto al comentario de rir3760:

La falta de consistencia está solucionado. Si te preguntas el porqué paso código como parámetro se debe a que en un futuro implementaré hilos para hacer el proceso más rápido (analizar varios archivos al mismo tiempo). Utilizo funciones (podría hacerlo con un #define pero aumentaría tamaño del código) propias porque me han resultado ser más rápidas (linux).
Los mensajes de error prefiero especificarlos yo, para tener un control absoluto del sistema de errores que se produzcan en el programa.
La forma en la que tengo implementada el código no podría admitir el uso de fgetc() para leer el tamaño del archivo, a no ser que la lectura y el analizado se hagan de una forma atómica. No se producirá ningún error, porque carácteres como ' ', '\t', '\n', '\r'... serán descartados de análisis.

El código resultante:

Código
  1. /*! Ejemplo de lector de archivo */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6.  
  7. #define NUM_INSTR 2
  8.  
  9. /*! Declaración de variables locales */
  10. enum {lex_PARI = '(', lex_PARD = ')', lex_LLAI = '{', lex_LLAD = '}'};
  11.  
  12. unsigned short int pos = 0x00;
  13. unsigned int codigo_volumen;
  14. char lista_instrucciones[NUM_INSTR][10] = {
  15. {"PRINT"},
  16. {"EXIT"}
  17. };
  18.  
  19. void siguiente_lexema(unsigned char *codigo);
  20. int saber_letra(char caracter);
  21.  
  22. void buscar_caracter(char caracter, unsigned char *codigo) {
  23. pos++;
  24. while((codigo[pos] != caracter) && (pos < codigo_volumen))
  25. siguiente_lexema(codigo);
  26.  
  27. if(pos == codigo_volumen)
  28. printf("Se esperaba '%c'", caracter);
  29. }
  30.  
  31. /*
  32.  * TODO: Identificar palabra reservada ó símbolo
  33. */
  34. // modo == 0 (si cadena)
  35. // modo == 1 (si entero)
  36. void identificador_cadena(unsigned char *codigo) {
  37. unsigned short int pos_buffer = 0;
  38. char *buffer = (char *)malloc(1 * sizeof(char));
  39.  
  40. while(saber_letra(codigo[pos])) {
  41. buffer[pos_buffer] = codigo[pos];
  42. pos++;
  43. pos_buffer++;
  44. buffer = (char *)realloc(buffer, (pos_buffer + 1) * sizeof(char));
  45. }
  46.  
  47. // Reutilizar variable pos_buffer
  48. for(pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
  49. if(strcmp(buffer, lista_instrucciones[pos_buffer]))
  50. printf("Encontrado %s en %s", lista_instrucciones[pos_buffer], buffer);
  51.  
  52. free(buffer);
  53. return;
  54. }
  55.  
  56. int saber_letra(char caracter) {
  57. return ((caracter >= 'A') && (caracter <= 'Z')) || ((caracter >= 'a') && (caracter <= 'z'));
  58. }
  59.  
  60. int saber_numero(char caracter) {
  61. return (caracter >= '0') && (caracter <= '9');
  62. }
  63.  
  64. void siguiente_lexema(unsigned char *codigo) {
  65. switch(codigo[pos]) {
  66. case lex_PARI:
  67. printf("Encontrado: %c\n", lex_PARI);
  68. buscar_caracter(lex_PARD, codigo);
  69. break;
  70. case lex_LLAI:
  71. printf("Encontrado: %c\n", lex_LLAI);
  72. buscar_caracter(lex_LLAD, codigo);
  73. break;
  74. default:
  75. if(saber_letra(codigo[pos]))
  76. identificador_cadena(codigo);
  77. else if(saber_numero(codigo[pos]))
  78. //identificador(codigo, 1);
  79. ;
  80. /*
  81. * TODO: Mostrar error. Ignorar espacios, salto de línea y tabulador
  82. */
  83. else
  84. ;
  85. break;
  86. }
  87.  
  88. pos++;
  89. return;
  90. }
  91.  
  92. int main(int argc, char **argv) {
  93. if(argc < 2) {
  94. printf("Uso: %s <archivo>\n", argv[0]);
  95. return 0;
  96. }
  97. FILE *codigo_archivo = fopen(argv[1], "r");
  98. if(!codigo_archivo) {
  99. printf("[ASM] Error al leer el archivo %s\n", argv[1]);
  100. return 0;
  101. }
  102.  
  103. /* Calcular tamaño (volumen) del código */
  104. fseek(codigo_archivo, 0, SEEK_END);
  105. codigo_volumen = ftell(codigo_archivo);
  106. rewind(codigo_archivo);
  107. if(!codigo_volumen) {
  108. printf("[ASM] No hay instrucciones...\n");
  109. fclose(codigo_archivo);
  110. return 0;
  111. }
  112.  
  113. /* Reservar el espacio necesario para almacenar
  114. * el código en memoria. Si existe, copiarlo. */
  115. unsigned char *codigo = (unsigned char *)malloc(codigo_volumen);
  116. if(!fread(codigo, 1, codigo_volumen, codigo_archivo)) {
  117. printf("[ASM] Error en lectura de archivo...\n");
  118. fclose(codigo_archivo);
  119. return 0;
  120. } else fclose(codigo_archivo);
  121.  
  122. while(pos < codigo_volumen)
  123. siguiente_lexema(codigo);
  124.  
  125. return 0;
  126. }
  127.  
30  Programación / Programación C/C++ / [Ayuda-C] Bucle infinito en: 10 Octubre 2013, 18:43 pm
Estaba programando en C un ensamblador para programas de mi máquina virtual (decidí continuar un proyecto). Tengo el siguiente código:

Código
  1. /*! Ejemplo de lector de archivo */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. /*! Declaración de variables locales */
  7. enum {lex_PARI = '(', lex_PARD = ')', lex_LLAI = '{', lex_LLAD = '}'};
  8. unsigned short int pos = 0x00;
  9. unsigned int codigo_volumen;
  10. unsigned char *codigo;
  11. FILE *codigo_archivo;
  12.  
  13. void siguiente_lexema(unsigned char *codigo);
  14.  
  15. void buscar_caracter(char caracter) {
  16. while((caracter != codigo[pos]) && (pos < codigo_volumen)) {
  17. siguiente_lexema(codigo);
  18. pos++;
  19. }
  20. if(pos == codigo_volumen)
  21. printf("Se esperaba '%c'", caracter);
  22. }
  23.  
  24. // modo == 0 (si cadena)
  25. // modo == 1 (si entero)
  26. void identificador(unsigned char *codigo, char modo) {
  27.  
  28. return;
  29. }
  30.  
  31. int saber_letra(char caracter) {
  32. return (((caracter >= 'A') && (caracter <= 'Z')) || ((caracter >= 'a') && (caracter <= 'z')));
  33. }
  34.  
  35. int saber_numero(char caracter) {
  36. return ((caracter >= '0') && (caracter <= '9'));
  37. }
  38.  
  39. void siguiente_lexema(unsigned char *codigo) {
  40. switch(codigo[pos]) {
  41. case lex_PARI:
  42. printf("Encontrado: %c\n", lex_PARI);
  43. buscar_caracter(lex_PARD);
  44. break;
  45. case lex_LLAI:
  46. printf("Encontrado: %c\n", lex_LLAI);
  47. buscar_caracter(lex_LLAD);
  48. break;
  49. default:
  50. if(saber_letra(codigo[pos]))
  51. identificador(codigo, 0);
  52. else if(saber_numero(codigo[pos]))
  53. identificador(codigo, 1);
  54. /*
  55. * TODO: Mostrar error. Ignorar espacios, salto de línea y tabulador
  56. */
  57. else
  58. ;
  59. break;
  60. }
  61.  
  62. return;
  63. }
  64.  
  65. int main(int argc, char **argv) {
  66. if(argc < 2) {
  67. printf("Uso: %s <archivo>\n", argv[0]);
  68. return 0;
  69. }
  70. codigo_archivo = fopen(argv[1], "r");
  71. if(!codigo_archivo) {
  72. printf("[ASM] Error al leer el archivo %s\n", argv[1]);
  73. return 0;
  74. }
  75.  
  76. /* Calcular tamaño (volumen) del código */
  77. fseek(codigo_archivo, 0, SEEK_END);
  78. codigo_volumen = ftell(codigo_archivo);
  79. rewind(codigo_archivo);
  80. if(!codigo_volumen) {
  81. printf("[ASM] No hay instrucciones...\n");
  82. fclose(codigo_archivo);
  83. return 0;
  84. }
  85.  
  86. /* Reservar el espacio necesario para almacenar
  87. * el código en memoria. Si existe, copiarlo. */
  88. codigo = (unsigned char *)malloc(codigo_volumen);
  89. if(!fread(codigo, 1, codigo_volumen, codigo_archivo)) {
  90. printf("[ASM] Error en lectura de archivo...\n");
  91. fclose(codigo_archivo);
  92. return 0;
  93. } else fclose(codigo_archivo);
  94.  
  95. while(pos < codigo_volumen) {
  96. siguiente_lexema(codigo);
  97. pos++;
  98. }
  99.  
  100. return 0;
  101. }
  102.  

El problema está en que dado un archivo:

Código
  1. {
  2. {
  3. {
  4. ( {} )( } } }
  5.  

Entra en un bucle infinito. He revisado muchas veces el código pero no veo ningún error de direcciones, punteros... ¿Alguien puede determinar a causa de que?
Páginas: 1 2 [3] 4 5 6 7 8 9
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines