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

 

 


Tema destacado: Top 20 herramientas Hacking más populares de 2020


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 230
131  Programación / Programación C/C++ / Re: Linked List en: 18 Noviembre 2020, 04:08 am
pero los elementos que estaban después ya no los imprime.

Código
  1. void insertAfter(int llave, int dato) {
  2.    struct node *l,*t;
  3.  
Código
  1.     if (start == NULL) { // Primera vez
  2.      start = t;//t en este punto no esta inicializado a nada.
  3.  
132  Programación / Programación C/C++ / Re: Linked List en: 18 Noviembre 2020, 03:48 am
Pues claro que no lo puedes generar por que esta vacía esa función.

Código
  1. void insertAfter(int llave, int dato) {
  2.  
  3. }

Llevas algo de ese parte ?
133  Seguridad Informática / Seguridad / Como proteger una cartera Bitcoin en: 18 Noviembre 2020, 01:45 am
Como proteger una cartera Bitcoin

No sabemos qué pasará en el futuro, es decir no sabemos si nos robaran la cartera o la perderemos en algún USB y alguien la encontrara. Tampoco sabemos la cantidad de poder de computo que existira.

Pero además de tener cifrada nuestra cartera con un buen passphrase de más de 40 caracteres, se puede lograr una mejor seguridad, para en el caso de que sea robada sea inviable que por medio de fuerza bruta directo contra el passphrase.

Nuestra Cartera está protegida con el resultado de un hash sha512 derivado N veces a partir de nuestro Passphrase y un salt.

Es decir:

Código:
(key,IV) = PBKDF2_algo("sha512",passphrase+salt,N);

Normalmente el cliente bitcoin-core calcula ese N de tal forma que la Operación en total no lleve más de 1 Segundo

¿Por que? ¿Por que ponérsela fácil a los crackers de wallets?

Se puede editar el código fuente del bitcoin-core de tal forma que cuando nosotros cambiemos el passphrase este utilice un número N tal que N el proceso completo de PBKDF2_algo lleve al menos uno o dos minutos por passphare, es un pequeño precio de espera. Y el resultado será sumamente desalentador para quien se robe o encuentre la cartera.

¿Como hacer esta modificacion?

Si revisamos la versión estable y actual al dia de hoy, el bitcoin core 0.20 el archivo wallet.cpp tiene la solución:

https://github.com/bitcoin/bitcoin/blob/0.20/src/wallet/wallet.cpp En la linea 322 tenemos lo siguiente:

Código
  1. bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase)
  2. {
  3.    bool fWasLocked = IsLocked();
  4.  
  5.    {
  6.        LOCK(cs_wallet);
  7.        Lock();
  8.  
  9.        CCrypter crypter;
  10.        CKeyingMaterial _vMasterKey;
  11.        for (MasterKeyMap::value_type& pMasterKey : mapMasterKeys)
  12.        {
  13.            if(!crypter.SetKeyFromPassphrase(strOldWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
  14.                return false;
  15.            if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, _vMasterKey))
  16.                return false;
  17.            if (Unlock(_vMasterKey))
  18.            {
  19.                int64_t nStartTime = GetTimeMillis();
  20.                crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
  21.                pMasterKey.second.nDeriveIterations = static_cast<unsigned int>(pMasterKey.second.nDeriveIterations * (100 / ((double)(GetTimeMillis() - nStartTime))));
  22.  
  23.                nStartTime = GetTimeMillis();
  24.                crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
  25.                pMasterKey.second.nDeriveIterations = (pMasterKey.second.nDeriveIterations + static_cast<unsigned int>(pMasterKey.second.nDeriveIterations * 100 / ((double)(GetTimeMillis() - nStartTime)))) / 2;
  26.  
  27.                if (pMasterKey.second.nDeriveIterations < 25000)
  28.                    pMasterKey.second.nDeriveIterations = 25000;
  29.  
  30.                WalletLogPrintf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);
  31.  
  32.                if (!crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
  33.                    return false;
  34.                if (!crypter.Encrypt(_vMasterKey, pMasterKey.second.vchCryptedKey))
  35.                    return false;
  36.                WalletBatch(*database).WriteMasterKey(pMasterKey.first, pMasterKey.second);
  37.                if (fWasLocked)
  38.                    Lock();
  39.                return true;
  40.            }
  41.        }
  42.    }
  43.  
  44.    return false;
  45. }

Y solo tendria que quedar de la siguiente manera:

Código
  1. bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase)
  2. {
  3.    bool fWasLocked = IsLocked();
  4.  
  5.    {
  6.        LOCK(cs_wallet);
  7.        Lock();
  8.  
  9.        CCrypter crypter;
  10.        CKeyingMaterial _vMasterKey;
  11.        for (MasterKeyMap::value_type& pMasterKey : mapMasterKeys)
  12.        {
  13.            if(!crypter.SetKeyFromPassphrase(strOldWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
  14.                return false;
  15.            if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, _vMasterKey))
  16.                return false;
  17.            if (Unlock(_vMasterKey))
  18.            {
  19.                pMasterKey.second.nDeriveIterations = 133707331;
  20.  
  21.                WalletLogPrintf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);
  22.  
  23.                if (!crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
  24.                    return false;
  25.                if (!crypter.Encrypt(_vMasterKey, pMasterKey.second.vchCryptedKey))
  26.                    return false;
  27.                WalletBatch(*database).WriteMasterKey(pMasterKey.first, pMasterKey.second);
  28.                if (fWasLocked)
  29.                    Lock();
  30.                return true;
  31.            }
  32.        }
  33.    }
  34.  
  35.    return false;
  36. }

Si quitamos todo lo relacionado con el calculo del tiempo y agregamos la linea:

Código
  1. pMasterKey.second.nDeriveIterations = 133707331;

En mi caso con el bitcoin-core oficial recompilado y con un procesador Intel Xeon CPU E3-1271 v3 @ 3.60GHz cambiar el passphrase toma alrededor de un minuto

Saludos!

134  Programación / Programación General / Re: O.S en: 17 Noviembre 2020, 23:33 pm
Personalmente recomiendo:

FreeBSD o Slackware

Son versiones bastante personalizables y pueden quedar muy compactas.

Saludos!
135  Programación / Programación C/C++ / Re: Escribir fichero dejándolo accesible en: 14 Noviembre 2020, 20:45 pm
Depende de como lo maneje el sistema operativo, ahorita mismo acabo de testear este código en windows 10,

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5.  
  6. int main() {
  7. char buffer[200];
  8. FILE *archivo = fopen("archivo.txt","w");
  9. fprintf(archivo,"Log....\n");
  10. fgets(buffer,200,stdin); //Pausa
  11. fclose(archivo);
  12. }
  13.  

Y aparece el archivo en el navegador mientras el programa se sigue ejecutando, pero si lo abro con el bloc de notas apare en blanco, no es si no hasta que terminó el programa y vuelvo a abrir el archivo este ya aparece con el texto "Log..." Pero no me marca error ni me dice que este ocupado antes de finalizar el programa.

Saludos
136  Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML en: 14 Noviembre 2020, 06:28 am
No se si todos tus eml tengan algún detalle, uno de ellos como te comente por correo estaba "dañado", se supone que deberia de estar X cantidad de información en una línea y en tu archivo tenia un salto de linea en medio eso colgó el programa.

Ya funciona para los ejemplos que me pasaste mira las imágenes





El codigo esta actualizado en el post donde lo publique, en este mismo Hilo.

Saludos
137  Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML en: 11 Noviembre 2020, 15:07 pm
hola, muchas gracias por todo, pero no consigo que me extraiga el adjunto..

Que tal ya veo algo no esta bien pero no puedo saber que es si no veo el eml que le pasas, si gustas puedes mandarme el EML a mi correo, mi informacion esta por ahi publica
138  Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML en: 10 Noviembre 2020, 18:20 pm
Lo hice pero actualmente solo para un solo archivo eml, ya que me da flojera hacerlo para todo un directorio y que busque los archivos eml etc etc etc...

Lo hice en C. se que este es el subforo de VB, pero la verdad VB no me gusta mucho para este tipo de operaciones, de hechos me gusta el VBA para automatizar trabajos en Excel

Imagen de prueba que funciona:


Y el archivo se crea en el directorio pasado como segundo parametro.



Por cierto si el siguiente código fuente si se compila en algunos compiladores de Windows puede dar muchos warning, pero con gcc de MinGW no me tira ningun warning ni error como esta en la imagen.

Código
  1. /*
  2. gcc -o dump_eml.exe dump_eml_attachments.c
  3. */
  4.  
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. #include<stdint.h>
  9.  
  10. static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  11.                                'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  12.                                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  13.                                'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  14.                                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  15.                                'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  16.                                'w', 'x', 'y', 'z', '0', '1', '2', '3',
  17.                                '4', '5', '6', '7', '8', '9', '+', '/'};
  18. static char *decoding_table = NULL;
  19. static int mod_table[] = {0, 2, 1};
  20.  
  21. unsigned char *base64_decode(const char *data,
  22.                             size_t input_length,
  23.                             size_t *output_length);
  24. void build_decoding_table();
  25. void base64_cleanup();
  26.  
  27. int open_and_extract_from_eml(char *filename,char *path_destino);
  28. int isEmptyLine(char *line);
  29. char *content_disposition = "Content-Disposition: attachment;";
  30.  
  31. int main(int argc, char **argv ) {
  32. if(argc != 3) {
  33. printf("Uso: %s <Carpeta_con_EMLs> <Carpeta_destino_adjuntos>\n",argv[0]);
  34. exit(0);
  35. }
  36. open_and_extract_from_eml(argv[1],argv[2]);
  37. return 0;
  38. }
  39.  
  40. int  open_and_extract_from_eml(char *filename,char *path_destino) {
  41. FILE *eml_file, *temp_file;
  42. char *dest_file,*temp0,*temp1;
  43. char *line,*buffer_base64 = NULL,*buffer_decoded;
  44. char *full_writen_file;
  45. int len_dest_file_name,offset,len_content_disposition,len_base64_line,len_base64_buffer, len_output,len_path_destino,entrar;
  46. len_content_disposition = strlen(content_disposition);
  47. len_path_destino = strlen(path_destino);
  48. line = malloc(1024);
  49. eml_file = fopen(filename,"rb");
  50. offset = 0;
  51. while(!feof(eml_file) && fgets(line,1024,eml_file) != NULL) {
  52. if(memcmp(line,content_disposition,len_content_disposition) == 0) {
  53. printf("Encontrado: %s",line);
  54. temp0 = strstr(line,"filename=");
  55. if(temp0 ==NULL ) {
  56. //tal vez la proxima linea?
  57. memset(line,0,1024);
  58. fgets(line,1024,eml_file);
  59. }
  60.  
  61. temp0 = strstr(line,"filename=");
  62. if(temp0 !=NULL ) {
  63. temp1 = strstr(temp0 +10,"\"");
  64. if(temp1 == NULL) {
  65. //No hay " finales
  66. exit(0);
  67. }
  68. len_dest_file_name = temp1 - (line + (temp0 - line) + 10 );
  69. //printf("len_dest_file_name %i\n",len_dest_file_name);
  70. dest_file = malloc(len_dest_file_name+1);
  71. strncpy(dest_file,(line + (temp0 - line) + 10),len_dest_file_name);
  72. dest_file[len_dest_file_name] = '\0';
  73.  
  74. memset(line,0,1024);
  75. fgets(line,1024,eml_file);
  76. //printf("Nueva linea leida \"%s\"",line);
  77. if(!isEmptyLine(line)) {
  78. //Deberia de ser una linea vacia;
  79. exit(0);
  80. }
  81. buffer_base64 = NULL;
  82. offset = 0;
  83. memset(line,0,1024);
  84. entrar = 1;
  85. while(entrar && fgets(line,1024,eml_file) != NULL &&  !isEmptyLine(line) ) { //leemos hasta la proxima linea vacia o hasta encontrar un '=' al final de la linea
  86. len_base64_line = strlen(line);
  87. buffer_base64 = realloc(buffer_base64,offset+len_base64_line+1);
  88. if(line[len_base64_line-1] == '\n'  || line[len_base64_line-1] == '\r'){
  89. line[len_base64_line-1] ='\0';
  90. len_base64_line--;
  91. }
  92. if(line[len_base64_line-1] == '\n'  || line[len_base64_line-1] == '\r'){
  93. line[len_base64_line-1] ='\0';
  94. len_base64_line--;
  95. }
  96.  
  97. memcpy(buffer_base64+offset,line,len_base64_line);
  98. offset+=len_base64_line;
  99. if(line[len_base64_line-1] == '=') {
  100. entrar = 0;
  101. }
  102. memset(line,0,1024);
  103. }
  104. buffer_base64[offset] = '\0';
  105. //printf("Encoded buffer: %s\n",buffer_base64);
  106. len_base64_buffer = strlen(buffer_base64);
  107. buffer_decoded = base64_decode(buffer_base64,len_base64_buffer,&len_output);
  108. buffer_decoded[len_output] = '\0';
  109. /*
  110. printf("OK\n");
  111. printf("Decoded buffer: %s\n",buffer_decoded);
  112. printf("Path destino: %s\n",path_destino);
  113. printf("len_dest_file_name: %i\n",len_dest_file_name);
  114. printf("len_path_destino: %i\n",len_path_destino);
  115. */
  116. full_writen_file = malloc(len_dest_file_name + len_path_destino+10);
  117. sprintf(full_writen_file,"%s/%s",path_destino,dest_file);
  118. printf("Destino: %s\n",full_writen_file);
  119. temp_file = fopen(full_writen_file,"wb");
  120. fwrite(buffer_decoded,1,len_output,temp_file);
  121. fclose(temp_file);
  122.  
  123. free(buffer_base64);
  124. free(dest_file);
  125. free(full_writen_file);
  126. }
  127. else {
  128. printf("Se encontro %s, pero no se encontro Filename omitiendo!\n",content_disposition);
  129. }
  130. }
  131. memset(line,0,1024);
  132. }
  133. free(line);
  134. }
  135.  
  136. int isEmptyLine(char *line) {
  137. if(line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
  138. return 1;
  139. return 0;
  140. }
  141.  
  142. unsigned char *base64_decode(const char *data,
  143.                             size_t input_length,
  144.                             size_t *output_length) {
  145.  
  146.    if (decoding_table == NULL) build_decoding_table();
  147.  
  148.    if (input_length % 4 != 0) return NULL;
  149.  
  150.    *output_length = input_length / 4 * 3;
  151.    if (data[input_length - 1] == '=') (*output_length)--;
  152.    if (data[input_length - 2] == '=') (*output_length)--;
  153.  
  154.    unsigned char *decoded_data = malloc(*output_length);
  155.    if (decoded_data == NULL) return NULL;
  156.  
  157.    for (int i = 0, j = 0; i < input_length;) {
  158.  
  159.        uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  160.        uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  161.        uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  162.        uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  163.  
  164.        uint32_t triple = (sextet_a << 3 * 6)
  165.        + (sextet_b << 2 * 6)
  166.        + (sextet_c << 1 * 6)
  167.        + (sextet_d << 0 * 6);
  168.  
  169.        if (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
  170.        if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
  171.        if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
  172.    }
  173.  
  174.    return decoded_data;
  175. }
  176.  
  177. void build_decoding_table() {
  178.    decoding_table = malloc(256);
  179.    for (int i = 0; i < 64; i++)
  180.        decoding_table[(unsigned char) encoding_table[i]] = i;
  181. }
  182.  
  183.  
  184. void base64_cleanup() {
  185.    free(decoding_table);
  186. }

El programa lo puedes utilizar para todo un directorio pero con ayuda de batch creo recordar que existe una instrucción for que te ayuda a procesar todos los archivos de un subdirectorio y pasarlos a un programa.

Saludos!
139  Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML en: 10 Noviembre 2020, 15:59 pm
Te puedo ayudar , pero no tengo compilador de VB ni de tecnologías Microsoft en este momento, pasame un archivo EML y con gusto le hecho un ojo para extraer todas los adjuntos, por cierto que ya debería de existir un programa que haga eso no?



Edito ya vi la estructura del archivo y no esta tan complicada.

Pregunta:

Quieres todos los adjuntos incluidos los que aparecen en el body del mensaje como imagenes y demas o solo considerados realmente "attachment" ?

Las imágenes del body y demás tienen un "inline" en el código ejemplo
Código:
Content-Disposition: inline; filename="background.gif"

O solo los "attachment"
Código:
Content-Disposition: attachment; filename="attachment.txt"


Saludos!
140  Programación / Programación C/C++ / Re: COMPRESOR LZ78 en: 8 Noviembre 2020, 20:55 pm
No se hacen tareas.

Saludos!
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 230
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines