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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 19
1  Programación / Bases de Datos / Como debería organizar la información? Postgresql en: 27 Noviembre 2021, 17:55 pm
Estoy creando una red social usando postgresql y node. Tengo dudas a cerca de como debería organizar los datos. Esta es mas o menos toda la información  que quiero almacenar:
numero_telefono, correo, nombre_usuario, contraseña, nombre, primer_apellido, segundo_apellido, genero, pais, ciudad, enlace_foto_perfil, codigo_verificacion, esta_activo, esta_reportado, esta_bloqueado, fecha_creacion, fecha_actualizacion, biografia, mensajes_privados, mensajes_publicos, amigos, grupos, perfil_publico_o_privado, ...

Probablemente necesite añadir mas información como puedan ser ajustes, reportes y lo típico de una red social.

Mi duda es como debería organizar esta información. Creo solo una tabla usuarios? Multiples tablas con el mismo id?

Cualquier consejo es bienvenido.
2  Seguridad Informática / Análisis y Diseño de Malware / Cómo puedo evitar la detección por los AV? en: 1 Noviembre 2021, 04:41 am
Hice un crypter cli (comando) en C# al que le pasas la ruta de un exe como argumento y te genera un código (listo para compilar) que descifra y ejecuta el exe en memoria para evitar detecciones estáticas.

Por lo que parece este comportamiendo es detectado como malicioso.

https://www.virustotal.com/gui/file/25e60c67ac1c177cfa60eb9637ffb4b27dfbf247a5ce00b66c27eb3c3a7882a5/detection

Lo que subí a virustotal, es un hola_mundo.exe pasado por el crypter, es decir el nuevo exe generado a partir del hola_mundo.exe que se encarga de descifrar su binario y correrlo en memoria.

Conoceis alguna forma simple de evitar estas detecciones?

Aquí el código (del hola_mundo.exe compilado) generado antes de compilarlo. Este es el que subí a virustotal una vez compilado:
https://gist.github.com/StringManolo/6a3f7205e8cc7f075fcfb177bc9728f3

Adjunto también el .exe compilado:
https://github.com/StringManolo/share/raw/master/hello_world.exe
md5sum 058e321a21469b6fd3983f143b8af787
sha256sum 25e60c67ac1c177cfa60eb9637ffb4b27dfbf247a5ce00b66c27eb3c3a7882a5
3  Programación / Programación C/C++ / fread modifica algunos bytes tratando de volcar parte de un archivo en otro en: 9 Agosto 2021, 23:39 pm
Estoy haciendo un cifrado CBC y añado 1024 bytes generados de forma pseudoaleatoria al final del archivo que el usuario eliga cifrar. Por motivos de debug, estos 1024 bytes a parte de añadirlos al archivo, también creo un archivo llamado lastIV.txt con estos 1024 bytes.

Estoy programando la parte que descifra y el primer paso que estoy haciendo es obtener esos últimos 1024 bytes del final del archivo cifrado que corresponden al IV generado aleatoriamente. Para ver el resultado, escribo estos 1024 bytes en un archivo externo al que llamo extractedIV.txt

Al comparar ambos archivos, que deberían ser exactamente iguales, algunos bytes no coinciden y no tengo ni idea de porque ambos archivos no son iguales.

Aquí adjunto sus hex creados con xxd:

lastIV.txt
Código:
00000000: 5dcf c46c d3d7 561f 5b23 2c8c d252 c5c9  ]..l..V.[#,..R..
00000010: 8cf5 8070 706e df2b 2fe8 5d2b f3ff f2d8  ...ppn.+/.]+....
00000020: bd7e 8c99 edc4 a87a 26f1 077f 5d2f 132b  .~.....z&...]/.+
00000030: 2b83 1319 4e76 0e0f 0822 0d9b f686 071d  +...Nv..."......
00000040: 0ea2 b106 5cf6 1401 48a8 a95e f9b7 2ade  ....\...H..^..*.
00000050: 194e 5e80 c744 1fac 81c3 af2b ae30 2ba9  .N^..D.....+.0+.
00000060: 3f56 7b6c c413 e4af c24b 2cc4 001e b74f  ?V{l.....K,....O
00000070: f1a2 1a2b 8881 20fc b41f 12bd 14e0 9017  ...+.. .........
00000080: d8ee 866e cea9 6759 36a6 6c7d c55c b389  ...n..gY6.l}.\..
00000090: ae80 d81f 2c2b 8049 826c b9df 071b d5cd  ....,+.I.l......
000000a0: 943f acd7 0f20 4f13 1956 5c23 0b89 81c4  .?... O..V\#....
000000b0: 95e2 f3f2 7b90 f174 bdc9 0df4 ec81 6ea9  ....{..t......n.
000000c0: 132a 5e42 93e0 0d5e a4ca 13ec d013 63dc  .*^B...^......c.
000000d0: a218 5dca c54e 2ea9 0607 d53c b022 2781  ..]..N.....<."'.
000000e0: 0b7e 7142 135b de22 c5de df6d 825d 755c  .~qB.[."...m.]u\
000000f0: 6c81 1a53 6c1b 2e2b d32a fdd0 0bd6 d629  l..Sl..+.*.....)
00000100: 816e 5780 4e0b bde1 13c9 1159 4950 5c88  .nW.N......YIP\.
00000110: 927d 235c c9e8 e83c 0b9e 7fbd 959f 830d  .}#\...<........
00000120: 3b8c d7ca d7ef c3a2 2e8e ff5e dae2 f494  ;..........^....
00000130: 9fbd 5be1 a65d abe8 d8d5 862d 42b7 0ba9  ..[..].....-B...
00000140: e6ed 3ccc 2ca8 30f2 a950 883b 6722 225d  ..<.,.0..P.;g""]
00000150: 3c5c 1907 f2f7 9ab7 01b3 2cd5 98da 4080  <\........,...@.
00000160: 2319 9859 1a1a 22e8 2f21 f5c2 363d c918  #..Y.."./!..6=..
00000170: 9990 e842 ef1b efab 5e3d a2bd 2b1f 2b2a  ...B....^=..+.+*
00000180: 922f 80f5 4b36 e636 aba6 5d17 c375 8095  ./..K6.6..]..u..
00000190: 8de8 e813 aef4 ce04 33d8 f221 e8c5 d801  ........3..!....
000001a0: 93b7 ed1b 9a95 bf3d b72b 08da a4bf b165  .......=.+.....e
000001b0: bd71 c77d ee2b a853 79c0 9e52 2092 c5d8  .q.}.+.Sy..R ...
000001c0: 19e8 4052 1fde 83a1 4e8c 30b3 e619 361e  ..@R....N.0...6.
000001d0: 6cd0 9248 13d8 7bae 9536 5d44 d5e4 131b  l..H..{..6]D....
000001e0: 8c40 49f3 c38d 5d26 c3ec f790 131f f95b  .@I...]&.......[
000001f0: 635c e679 75f3 42e8 a41e 52b4 8852 2bfd  c\.yu.B...R..R+.
00000200: 7a87 d759 f43d c988 537d 6380 cfa4 b7f4  z..Y.=..S}c.....
00000210: b41b ecc7 ccfd 825c e46e 6eb4 e4c9 e83d  .......\.nn....=
00000220: 2ad1 f2a2 1fd7 7df1 843f 01f1 9664 185c  *.....}..?...d.\
00000230: 0000 0000 0000 0000 8776 ec75 5ba2 4052  .........v.u[.@R
00000240: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000250: 0000 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000260: 0010 0000 0000 0000 0010 0000 0000 0000  ................
00000270: d0d0 53d5 7f00 0000 5453 55f9 7c00 0000  ..S.....TSU.|...
00000280: 4841 01f9 7c00 0000 5417 2ce1 2c13 3c04  HA..|...T.,.,.<.
00000290: 90d1 53d5 7f00 0000 54da 5cf9 7c00 0000  ..S.....T.\.|...
000002a0: 0d17 da1a 2220 1f18 47b3 0000 0000 0000  ...." ..G.......
000002b0: 9fcc 1400 0000 0000 8081 0000 0100 0000  ................
000002c0: 8f27 0000 8f27 0000 0000 0000 0000 0000  .'...'..........
000002d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000002e0: 0010 0000 0000 0000 0000 0000 0000 0000  ................
000002f0: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000300: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000310: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000320: 0000 0000 0000 0000 843f 01f1 9664 185c  .........?...d.\
00000330: 40ce 53d5 7f00 0000 0100 0000 0000 0000  @.S.............
00000340: 20d2 53d5 7f00 0000 4841 01f9 7c00 0000   .S.....HA..|...
00000350: b0d1 53d5 7f00 0000 08f4 5cf9 7c00 0000  ..S.......\.|...
00000360: 4841 01f9 7c00 0000 0004 0000 0004 0000  HA..|...........
00000370: 10d2 53d5 7f00 0000 28d3 5cf9 7c00 0000  ..S.....(.\.|...
00000380: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000390: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000003a0: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
000003b0: 40ce 53d5 7f00 0000 0100 0000 0000 0000  @.S.............
000003c0: 0004 0000 0000 0000 4841 01f9 7c00 0000  ........HA..|...
000003d0: 80d2 53d5 7f00 0000 f410 5ef9 7c00 0000  ..S.......^.|...
000003e0: 38d2 53d5 7f00 0000 0100 0000 7c00 0000  8.S.........|...
000003f0: 0004 0000 0000 0000 40ce 53d5 7f00 0000  ........@.S.....

extractedIV.txt
Código:
00000000: 5dcf c46c d3d7 561f 5b23 2c8c d252 c5c9  ]..l..V.[#,..R..
00000010: 8cf5 8070 706e df2b 2fe8 5d2b f3ff f2d8  ...ppn.+/.]+....
00000020: bd7e 8c99 edc4 a87a 26f1 077f 5d2f 132b  .~.....z&...]/.+
00000030: 2b83 1319 4e76 0e0f 0822 0d9b f686 071d  +...Nv..."......
00000040: 0ea2 b106 5cf6 1401 48a8 a95e f9b7 2ade  ....\...H..^..*.
00000050: 194e 5e80 c744 1fac 81c3 af2b ae30 2ba9  .N^..D.....+.0+.
00000060: 3f56 7b6c c413 e4af c24b 2cc4 001e b74f  ?V{l.....K,....O
00000070: f1a2 1a2b 8881 20fc b41f 12bd 14e0 9017  ...+.. .........
00000080: d8ee 866e cea9 6759 36a6 6c7d c55c b389  ...n..gY6.l}.\..
00000090: ae80 d81f 2c2b 8049 826c b9df 071b d5cd  ....,+.I.l......
000000a0: 943f acd7 0f20 4f13 1956 5c23 0b89 81c4  .?... O..V\#....
000000b0: 95e2 f3f2 7b90 f174 bdc9 0df4 ec81 6ea9  ....{..t......n.
000000c0: 132a 5e42 93e0 0d5e a4ca 13ec d013 63dc  .*^B...^......c.
000000d0: a218 5dca c54e 2ea9 0607 d53c b022 2781  ..]..N.....<."'.
000000e0: 0b7e 7142 135b de22 c5de df6d 825d 755c  .~qB.[."...m.]u\
000000f0: 6c81 1a53 6c1b 2e2b d32a fdd0 0bd6 d629  l..Sl..+.*.....)
00000100: 816e 5780 4e0b bde1 13c9 1159 4950 5c88  .nW.N......YIP\.
00000110: 927d 235c c9e8 e83c 0b9e 7fbd 959f 830d  .}#\...<........
00000120: 3b8c d7ca d7ef c3a2 2e8e ff5e dae2 f494  ;..........^....
00000130: 9fbd 5be1 a65d abe8 d8d5 862d 42b7 0ba9  ..[..].....-B...
00000140: e6ed 3ccc 2ca8 30f2 a950 883b 6722 225d  ..<.,.0..P.;g""]
00000150: 3c5c 1907 f2f7 9ab7 01b3 2cd5 98da 4080  <\........,...@.
00000160: 2319 9859 1a1a 22e8 2f21 f5c2 363d c918  #..Y.."./!..6=..
00000170: 9990 e842 ef1b efab 5e3d a2bd 2b1f 2b2a  ...B....^=..+.+*
00000180: 922f 80f5 4b36 e636 aba6 5d17 c375 8095  ./..K6.6..]..u..
00000190: 8de8 e813 aef4 ce04 33d8 f221 e8c5 d801  ........3..!....
000001a0: 93b7 ed1b 9a95 bf3d b72b 08da a4bf b165  .......=.+.....e
000001b0: bd71 c77d ee2b a853 79c0 9e52 2092 c5d8  .q.}.+.Sy..R ...
000001c0: 19e8 4052 1fde 83a1 4e8c 30b3 e619 361e  ..@R....N.0...6.
000001d0: 6cd0 9248 13d8 7bae 9536 5d44 d5e4 131b  l..H..{..6]D....
000001e0: 8c40 49f3 c38d 5d26 c3ec f790 131f f95b  .@I...]&.......[
000001f0: 635c e679 75f3 42e8 a41e 52b4 8852 2bfd  c\.yu.B...R..R+.
00000200: 7a87 d759 f43d c988 537d 6380 cfa4 b7f4  z..Y.=..S}c.....
00000210: b41b ecc7 ccfd 825c e46e 6eb4 e4c9 e83d  .......\.nn....=
00000220: 2ad1 f2a2 1fd7 7df1 843f 01f1 9664 185c  *.....}..?...d.\
00000230: 0000 0000 0000 0000 8776 ec75 5ba2 4052  .........v.u[.@R
00000240: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000250: 0000 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000260: 0010 0000 0000 0000 0010 0000 0000 0000  ................
00000270: d0d0 53d5 7f00 0000 5453 55f9 7c00 0000  ..S.....TSU.|...
00000280: b040 01f9 7c00 0000 5417 2ce1 2c13 3c04  .@..|...T.,.,.<.
00000290: 90d1 53d5 7f00 0000 54da 5cf9 7c00 0000  ..S.....T.\.|...
000002a0: 0d17 da1a 2220 1f18 47b3 0000 0000 0000  ...." ..G.......
000002b0: 3b78 0c00 0000 0000 8081 0000 0100 0000  ;x..............
000002c0: 8f27 0000 8f27 0000 0000 0000 0000 0000  .'...'..........
000002d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000002e0: 0010 0000 0000 0000 0000 0000 0000 0000  ................
000002f0: ed8d 1161 0000 0000 00a0 2526 0000 0000  ...a......%&....
00000300: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000310: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000320: 0000 0000 0000 0000 843f 01f1 9664 185c  .........?...d.\
00000330: 2ce7 53d5 7f00 0000 0100 0000 0000 0000  ,.S.............
00000340: 20d2 53d5 7f00 0000 b040 01f9 7c00 0000   .S......@..|...
00000350: b0d1 53d5 7f00 0000 08f4 5cf9 7c00 0000  ..S.......\.|...
00000360: b040 01f9 7c00 0000 ee39 806d 2bd7 3d50  .@..|....9.m+.=P
00000370: 10d2 53d5 7f00 0000 843f 01f1 9664 185c  ..S......?...d.\
00000380: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000390: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000003a0: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
000003b0: 40ce 53d5 7f00 0000 0100 0000 0000 0000  @.S.............
000003c0: 0004 0000 0000 0000 b040 01f9 7c00 0000  .........@..|...
000003d0: 80d2 53d5 7f00 0000 f410 5ef9 7c00 0000  ..S.......^.|...
000003e0: 38d2 53d5 7f00 0000 0100 0000 0000 0000  8.S.............
000003f0: 0004 0000 0000 0000 40ce 53d5 7f00 0000  ........@.S.....

Aquí el código:
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. // add operation between 2 buffers
  6. void addBuffers(char * buf1, char * buf2, int bufSize) {
  7.  for(int i = 0; i < bufSize; ++i) {
  8.    buf1[i] = (buf1[i] + buf2[i]);
  9.  }
  10. }
  11.  
  12. // substract operation between 2 buffers
  13. void substractBuffers(char * buf1, char * buf2, int bufSize) {
  14.  for(int i = 0; i < bufSize; ++i) {
  15.    buf1[i] = (buf1[i] - buf2[i]);
  16.  }
  17. }
  18.  
  19. // make key match the block size
  20. void securizeKey(char * keyBuf, char * key, int keySize, int chunkSize) {
  21.  for (int i = 0, j = 0; i < chunkSize; ++i, ++j) {
  22.    if (j > keySize) {
  23.      j = 0;
  24.    }
  25.    keyBuf[i] = key[j];
  26.  }
  27. }
  28.  
  29. // generate pseudorandom buffer
  30. char *allocate_random_heap_buffer(size_t size) {
  31.  time_t current_time = time(NULL);
  32.  srandom((unsigned int) current_time);
  33.  char* allocatedMemory = (char *) malloc(size);
  34.  
  35.  for (int bufferIndex = 0; bufferIndex < size; bufferIndex++) {
  36.    uint8_t randomNumber = (uint8_t) random();
  37.    allocatedMemory[bufferIndex] = randomNumber;
  38.  }
  39.  
  40.  return allocatedMemory;
  41. }
  42.  
  43. // generate a pseudorandom IV
  44. void generateIV(char * ivBuf, int chunkSize) {
  45.  char * random = allocate_random_heap_buffer(chunkSize);
  46.  for (int i = 0; i < chunkSize; ++i) {
  47.    if (random[i] < chunkSize) {
  48.      ivBuf[i] = random[random[i]];
  49.    } else {
  50.      ivBuf[i] = random[i];
  51.    }
  52.  }
  53. }
  54.  
  55. char * GENERATED_IV;
  56. // block cipher encryption
  57. void cipherBlock(char * bufferBlock, char * bufferBlock2, char * key, int blockSize, int round) {
  58.  if (round == 1) { // add IV to first block
  59.    char IV[blockSize];
  60.    generateIV(IV, blockSize);
  61.    addBuffers(bufferBlock, IV, blockSize);
  62.    GENERATED_IV = IV;
  63.  } else { // add Last Block to Current Block
  64.    addBuffers(bufferBlock, bufferBlock2, blockSize);
  65.    addBuffers(bufferBlock, key, blockSize);
  66.  }
  67. }
  68.  
  69.  
  70. // reverse
  71.  
  72.  
  73. int main(int argc, char *argv[]) {
  74.  /*** Fetch CLI Arguments */
  75.  char * filename; int filenameSet = 0; // file to work on
  76.  char * mode;     int modeSet = 0; // encrypt or decrypt
  77.  char * key;      int keySet = 0; // simmetric key
  78.  char * output;   int outputSet = 0; // file to output results on
  79.  for(int i = 0; i < argc; ++i) {
  80.    // -f or --file
  81.    if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0) {
  82.      filename = argv[i + 1];
  83.      filenameSet = 1;
  84.    // -m or --mode
  85.    } else if (strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--mode") == 0) {
  86.      mode = argv[i + 1];
  87.      modeSet = 1;
  88.    // -k or --key
  89.    } else if (strcmp(argv[i], "-k") == 0 || strcmp(argv[i], "--key") == 0) {
  90.      key = argv[i + 1];
  91.      keySet = 1;
  92.    } else if (strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "--output") == 0) {
  93.      output = argv[i + 1];
  94.      outputSet = 1;
  95.    }
  96.  }
  97.  
  98.  // Check if mandatory arguments are set
  99.  if (filenameSet != 1) {
  100.    printf("Missing filename argument, use -f ./myFile");
  101.    return 0;
  102.  }
  103.  
  104.  if (modeSet != 1) {
  105.    printf("Please select a mode, use -m cipher or use -m reverse");
  106.    return 0;
  107.  }
  108.  
  109.  if (keySet != 1) {
  110.    printf("Missing key argument, use -k mySecretKey");
  111.    return 0;
  112.  }
  113.  
  114.  if (outputSet != 1) {
  115.    printf("Missing output argument, use -o ./newFile");
  116.    return 0;
  117.  }
  118.  /* Fetch CLI Arguments ***/
  119.  
  120.  
  121.  #define BLOCK_SIZE 1024
  122.  const int keySize = strlen(key);
  123.  char keyBuf[BLOCK_SIZE];
  124.  securizeKey(keyBuf, key, keySize, BLOCK_SIZE);
  125.  
  126.  
  127.  if (strcmp(mode, "cipher") == 0) { // user selected encryption mode
  128.    char buf[BLOCK_SIZE];
  129.    char lastBuf[BLOCK_SIZE];
  130.    FILE *file;
  131.    size_t nread;
  132.  
  133.    file = fopen(filename, "r");
  134.    FILE * encrypted = fopen(output, "w"); // file to output the encrypted file
  135.    if (file) {
  136.      int i = 0;
  137.      while ((nread = fread(buf, 1, sizeof buf, file)) > 0) {
  138.        cipherBlock(buf, lastBuf, keyBuf, BLOCK_SIZE, ++i);
  139.        memcpy(lastBuf, buf, BLOCK_SIZE);
  140.        fwrite(buf, 1, nread, encrypted);
  141.      }
  142.      fwrite(GENERATED_IV, 1, BLOCK_SIZE, encrypted);
  143.  
  144.      FILE * lastIV = fopen("./lastIV.txt", "w");
  145.      fwrite(GENERATED_IV, 1, BLOCK_SIZE, lastIV); // debug IV
  146.  
  147.      if (ferror(file)) {
  148.        // deal with error
  149.      }
  150.      fclose(file);
  151.    }
  152.  } else if (strcmp(mode, "reverse") == 0) {
  153.    /* TODO: READ REVERSE IN CHUNKS */
  154.    char buf[BLOCK_SIZE];
  155.    char lastBuf[BLOCK_SIZE];
  156.    FILE *file;
  157.    size_t nread;
  158.  
  159.    file = fopen(filename, "r");
  160.    FILE * decrypted = fopen(output, "w"); // file to output the decrypted file
  161.  
  162.    if (file) {
  163.      int i = 0;
  164.      fseek(file, 0, SEEK_END);
  165.      int sz = ftell(file); // file size
  166.      char IV[BLOCK_SIZE];
  167.  
  168.      char aux[BLOCK_SIZE];
  169.  
  170.  
  171.      for (int j = sz - BLOCK_SIZE; /* j > 0 */; j -= BLOCK_SIZE, ++i) {
  172.        fseek(file, j, SEEK_SET);
  173. fread(aux, 1, BLOCK_SIZE, file);
  174.        if (i == 0) {
  175.          memcpy(IV, aux, BLOCK_SIZE);
  176.          FILE * extractedIV = fopen("./extractedIV.txt", "w");
  177.          fwrite(IV, 1, BLOCK_SIZE, extractedIV); // debug IV
  178.          fclose(extractedIV);
  179.          return 0;
  180.        }
  181.  
  182. if (j <= 0) {
  183.          break;
  184. }
  185.      }
  186.      fclose(file);
  187.    }
  188.  
  189.  } else {
  190.    printf("Select -m cipher or -m reverse");
  191.    return 0;
  192.  }
  193.  return 0;
  194. }

PD: Adjunto output de radiff2 de los bytes que son transformados:
Código:
0x00000280 4841 => b040 0x00000280
0x000002b0 9fcc14 => 3b780c 0x000002b0
0x000002f0 3a9e => ed8d 0x000002f0
0x000002f9 92fe1e => a02526 0x000002f9
0x00000330 40ce => 2ce7 0x00000330
0x00000348 4841 => b040 0x00000348
0x00000360 4841 => b040 0x00000360
0x00000368 0004000000040000 => ee39806d2bd73d50 0x00000368
0x00000378 28d35cf97c000000 => 843f01f19664185c 0x00000378
0x000003c8 4841 => b040 0x000003c8
0x000003ec 7c => 00 0x000003ec
4  Programación / Programación C/C++ / Asignar tipo a variables en C++ en: 9 Abril 2021, 15:05 pm
Estoy generando código C++ a partir de otro código de un lenguaje que estoy desarrollando. La funciones las estoy implementando rollo bash.

Sabeis como puedo declarar los argumentos? Estoy forzado a hacer type inference en el preprocesador/compilador y declarar un template por cada llamada que utilice un tipo distinto (la única solución que se me ocurrió hasta el momento) o conoceis alguna alternativa más sencilla?

CÓDIGO A TRANSPILAR/COMPILAR:
Código
  1. x = "Hello World";
  2. showHelloWorld() {
  3.  out($1);
  4.  return 6 * 7;
  5. }
  6.  
  7. showHelloWorld(x);
  8. x = 8;


CÓDIGO QUE GENERO:
Código
  1. #include <string>
  2.  
  3. using namespace std;
  4.  
  5. auto showHelloWorld($1);
  6.  
  7. int main() {
  8.  auto x = "Hello World" ;
  9.  showHelloWorld ( x ) ;
  10.  x = 8 ;
  11.  
  12.  return 0;
  13. }
  14.  
  15. auto showHelloWorld($1) {
  16.  cout << $1 << endl;
  17.  return 6 * 7 ;
  18. }


Lo que necesito hacer es asignarle un tipo (para que no de error) a los $1, $2, $3... y al $. Este último es un array con todos los argumentos dentro como en bash.

Hay que tener en cuenta que cada llamada a la función puede tener el mismo argumento con distinto tipo, ejemplo:
Código
  1. imprimir($1) {
  2.  cout << $1 << endl;
  3. }
  4.  
  5. int main() {
  6.  imprimir("hola");
  7.  imprimir(7);
  8.  // ...
  9. }

Se os ocurre alguna solución sencilla?
5  Foros Generales / Sugerencias y dudas sobre el Foro / Duda a cerca de la norma de no resolver tareas a los usuarios del foro. en: 5 Abril 2021, 14:57 pm
Hola, quería exponer una duda a cerca de una respuesta que hice a un usuario en el foro de C/C++.
En concreto este es el mensaje al que hago referencia: https://foro.elhacker.net/programacion_cc/crash_en_la_consola-t509690.0.html;msg2239804#msg2239804

Mi duda es a cerca de la norma de no resolver tareas a los usuarios del foro. E publicado una respuesta en la que incluyo un ejemplo completo del programa que necesita realizar a posteriori de que el usaurio ya ha conseguido dar con una solución y la ha publicado en el tema.

Mi motivación para aportar una respuesta completa a la tarea viene a coalición con lo que he expuesto en el mismo mensaje. En concreto trato de ejemplificar el uso de identación, funciones puras (lo que trata de usar el usuario que abre el tema) y proponer otra alternativa más organizada a la resolución de la tarea.

La razón de mi duda viene tras recibir un mensaje privado

No entendí cual era el problema asique respondí explicando mi motivación al publicar el código y preguntando cual era el motivo. No me convenció el argumento de la cantidad de lineas de código con respecto al usuario ya que el usuario omitió varios saltos de lineas que yo si añadí para que el código quedase mejor organizado así como el uso de más includes y funciones por mi parte en lugar de meter todo en una sola función, lo cual de por sí cada función son mínimo 4 o 5 lineas más. El prototipo, la declaracion, el return, el corchete final de la declaración y las llamadas que hago en cout, que decidí utilizar 3 llamadas independientes de cout en lugar de una sola para que el código quedase más claro

Tras lo cual:

Yo personalmente creo que mi código no es excesivo ni innecesario, asique en lugar de seguir respondiendo por privado y seguir argumentando (algo que obviamente no va a llevar a ningún lugar porque ya ambas partes hemos expuesto nuestra opinión a cerca del tema y no parece que vayamos a llegar a ningún lado) decido exponer mi duda aquí para zanjar el debate a cerca de si es correcta mi respuesta o no.
En caso de no serlo no tengo ningua objeción en que sea eliminado, modificado o lo que sea.

También me gustaría tener unas directrices claras de cuanto código es excesivo para poder seguir participando sin inclumplir las normas. O si la cantidad de código permitido en una respuesta mantiene algún tipo de relación con la cantidad de código sin identar que publica el usuario que abre el tema.

[MOD] Retirados los MP, estos no deben ser publicados en publico, al ser privados.
6  Comunicaciones / Android / Crear APKs en Termux en: 31 Marzo 2021, 04:18 am
Crear APKs en Termux
Siempre he querido programar apks (el .exe de android) directamente en Android. Tras varias búsquedas a lo largo del tiempo encontré una forma de crear apks usando comandos. Tanto Java como Kotlin son lenguajes que no me entusiasman precisamente asique he desarrollado un script en javascript y un par de repos para poder construir la apk a partir de una url o una carpeta con archivos html, css, js y demás de tal forma que no tengas que tocar ni una sola linea de código de java, kotlin, xml, etc. No es nada complejo, solo tienes que correr 2 comandos.

Instalación
Mi script utiliza unos cuantos paquetes de Termux:
  Quickjs
  Git
  Aapt
  Apksigner
  Dx
  Ecj
  Curl
  buildAPKs

Hice un commando para que simplemente lo copies y pegues, te deja todo listo. Si acabas de descargarte termux, corre termux-setup-storage antes de nada. Si ya tenías acceso a la carpeta storage no hace falta.

Aquí el comando:
Código:
yes | pkg install quickjs git aapt apksigner dx ecj curl; curl -O https://raw.githubusercontent.com/BuildAPKs/buildAPKs/master/setup.buildAPKs.bash && yes | bash setup.buildAPKs.bash && cp ~/buildAPKs/scripts/bash/build/build.one.bash ~/../usr/bin/ && chmod +775 ~/../usr/bin/build.one.bash; git clone https://github.com/StringManolo/APKGenerator && cd APKGenerator
La instalación va a crear un par de apks para comprobar que todo funciona. Si te pide permisos para poder levantar termux en segundo plano, te recomiendo aceptarlo ya que te puede ser útil en el futuro cuando hagas o corras algún programa que lo necesita. Cuando finalice la instalación ya podrás crear tu app de Android utilizando APKGenerator

Creando la apk
El método de creación es muy sencillo. Tienes 2 comandos para elegir la fuente que se utilizará para generar la app, desde una url o desde una carpeta con tu index.html, estilos.css, codigo.js, etc.
Para crear desde una url, corre el comando
Código:
qjs --std APKGenerator.js -u https://example.com -n com.example.miApp -t Example
Para crear desde carpeta pon
Código:
qjs --std APKGenerator.js -a myAssets -n com.example.miApp -t Example
En este caso se usará la carpeta myAssets que ya se descargó con un index.html, un archivo css y uno javascript para que no tengas que crearlos a mano en caso de que vayas a programar una web de 0. El único requisito es que el archivo se llame index.html.
La única diferencia entre ambos comandos es el primer agumento, que indica si usar una url o una carpeta.

El argumento -n es el nombre del paquete. Es una convención usar un dominio si tienes uno. Esto sirve para que Android sepa diferenciar entre apps que se llamen igual. Puedes poner el nombre que quieras en caso de no tener un dominio.

El argumento -t es el título de la app. Será el nombre que vea el usuario al instalar la app.

Creando desde url
Cuando creas la apk desde una url, se crea un navegador sin barra de direcciones (webview) que va a visitar esa url al abrirla. Todas las peticiones realizadas por el webview incluyen la cabecera HTTP X-Request-With: nombre.del.paquete asique puedes utilizar esta información para servir una versión especial de tu sitio web cuando se te solicite al servidor la web con esta cabecera. Obviamente necesitas internet para que funciones la app. En futuras versiones añadiré caché al webview y un script para cachear tu sitio, así podrás cargar tu sitio web sin conexión a internet.

Creando desde carpeta
Cuando creas desde carpeta esta es añadida a la apk por lo que funciona totalmente offline. Tendrás que manejar tu las actualizaciones de la app para que el usuario pueda actualizar la web. También puedes añadir un script online a la web para encargarte de ello. Recomendado también que utilices la push notifications api de javascript si provees otra forma de actualizarla.

Cambiando archivos de la apk
Cuando realices cualquier tipo de cambio tendrás que generar una nueva apk. Para ello ve a la carpeta de tu proyecto por ejemplo com.example.miApp/src/main y corre el comando build.one.bash
La apk generada se incluye en la carpeta del proyecto (para debug con herramientas si lo necesitas) y en la carpeta Download/builtAPKs para instalar/distribuir. Puedes visitar el repositorio del proyecto en github si desear ver el código, reportar algún fallo, solicitar alguna característica o contribuir en el proyecto. APKGenerator
7  Programación / Desarrollo Web / [javascript] Métodos map, reduce y filter explicados. Extendiendo String para añadirle map. en: 31 Marzo 2021, 02:46 am
Map, reduce y filter
A muchos programadores les cuesta entender o encontrar uso para el método
Código
  1. .map()
En este post vamos a programar el método, así podrás entender exactamente que es.

map
Para no ensuciar el array de javascript, vamos a crear una nueva versión del array extendiendo la clase.
Código
  1. class CustomArray extends Array {
  2.  map() {
  3.    return "metodo custom";                                              
  4.  }
  5. }

Ahora tenemos 2 clases array iguales. La de javascript y la nuestra. La nuestra es casi igual que la de javascript, solo cambia el método map.
Puedes comprobar que funciona con el siguiente código
Código
  1. class CustomArray extends Array {
  2.  map() {
  3.    return "metodo custom";
  4.  }
  5. }
  6.  
  7. let numeros = new CustomArray(1, 2, 3); // Crea un array custom
  8. let numeros2 = [1, 2, 3]; // Crea un array normal
  9. numeros.map( num => num + 1); // "metodo custom"
  10. numeros2.map( num => num + 1); // 2, 3, 4

En la primera llamada a map (nuestro método custom) no pasa nada especial porque nuestro método no tiene definido que acepte ningún parámetro, asique se ejecuta el método sin más ignorando los parámetros. En cambio en la segunda llamada a map (el .map() original de javascript) se toma la función como argumento y se le suma 1 a cada elemento del array.

Una función que se pasa por parámetro a otra función/método (con intención de que se ejecute dentro de la función llamada) se le conoce como callback.                                                               
Vamos a hacer que nuestro método acepte una función y la llame:
Código
  1. class CustomArray extends Array {
  2.  map(callback) { // acepta un parametro cualquiera
  3.    return callback("metodo custom"); // llamalo pasandole el texto como argumento
  4.  }
  5. }
  6.  
  7. let numeros = new CustomArray(1, 2, 3); // Crea un array custom
  8. let numeros2 = new Array(1, 2, 3); // Crea un array normal
  9.  
  10. numeros.map( num => num + 1 ); // "metodo custom1"
  11. numeros2.map( num => num + 1 ); // 2, 3, 4

Así añadimos el callback. Aceptamos que se pase una función como argumento de map, llamamos la función que se pasa usando nombreArgumento(); y le pasamos al argumento un argumento en la llamada tal que nombreArgumento("método custom");
Actualmente nuestro map solo añade 1 a nuestro texto, pero el objetivo es que sume 1 a todos los elementos del array. Para ello usaremos this para acceder al CustomArray y sus elementos:
Código
  1. class CustomArray extends Array {
  2.  map(callback) {
  3.    return callback(this);
  4.  }
  5. }
  6.  
  7. let numeros = new CustomArray(1, 2, 3);
  8. let numeros2 = new Array(1, 2, 3);
  9.  
  10. numeros.map( num => num + 1 ); // "1, 2, 31"
  11. numeros2.map( num => num + 1 ); // 2 , 3, 4

Al usar this como parámetro del callback accedemos al array y como no.se pueden sumar arrays y números, javascript opta por un tipo intermedio entre ambos que se pueda sumar, sumándose los strings "1, 2, 3" + "1". Lo que hace map es llamar a la función que le pasamos sobre cada elemento y nos retorna un array con los resultados. Asique acabamos el map con:
Código
  1. class CustomArray extends Array {
  2.  map(callback) {
  3.    for (let i = 0; i < this.length; ++i) {
  4.      this[i] = callback(this[i])
  5.    }
  6.    return this;
  7.  }
  8. }
  9.  
  10. let numeros = new CustomArray(1, 2, 3);
  11. let numeros2 = new Array(1, 2, 3);
  12.  
  13. numeros.map( num => num + 1 ); //2, 3, 4
  14. numeros2.map( num => num + 1); //2, 3, 4
Ya conseguimos crear nuestra versión del método map. Map es un método de los arrays, por lo que no puedes usarlo con otras clases como String.
Puedes modificar el código para extender la clase String y añadirle el método map:
Código
  1. class CustomString extends String {
  2.  map(callback) {
  3.    let aux = "";
  4.    for (let i = 0; i < this.length; ++i) {
  5.      aux += callback(this[i])
  6.    }
  7.    return aux;
  8.  }
  9.  
  10. }
  11.  
  12. const texto = new CustomString("hola");
  13.  
  14. texto.map(letra => letra + 1) // "h1o1l1a1"

Creo que queda claro que hace exactamente map. Aplica la funcion que le pasamos a cada elemento y nos retorna el resultado.
Es el mismo efecto que si hiciésemos:
Código
  1. let arr = [1, 2, 3];
  2. let auxiliar = [];
  3. const suma1 = argumento => argumento + 1;
  4.  
  5. auxiliar.push( suma1(arr[0]) );
  6. auxiliar.push( suma1(arr[1]) );
  7. auxiliar.push( suma1(arr[2]) );
  8.  
  9. console.log(auxiliar) // 2, 3, 4


reduce
El método reduce es prácticamente igual que map, pero en lugar de devolver todos los elementos devuelve solo el resultado de operar con ellos.
Código
  1. let numeros = [1, 2, 3];
  2. numeros.reduce( (res, num) => res + num); // 6
El código también es muy similar al de map, trata de realizar tu propia implementación y jugar pásandole distintos parámetros. Recuerda que estos ejemplos son básicos. Los métodos map, reduce y similares son más completos que estas implementaciones, puedes consultar algunos polyfills para hacerte una idea más cercana a todo lo que hace cada método.

filter
Con filter en lugar de retornar el resultado, se retorna o no el elemento del array dependiendo de si la condición que indiques se cumple o no. Por ejemplo puedes filtrar los elementos de un array para obtener solo los números pares:
Código
  1. let numeros = [1, 2, 3];
  2. numeros.filter( num => num % 2 == 0 ); // 2

Recuerda que se retorna un nuevo array, el original no es modificado.
8  Comunicaciones / Android / Como hacer público un servidor web express sobre node en arch linux termux android sin root. en: 31 Marzo 2021, 01:51 am
Como hacer público un servidor web express sobre node en arch linux termux android sin root.

1 - Instalar termux.
Puedes instalar termux directamente desde la PlayStore https://play.google.com/store/apps/details?id=com.termux

Si tu dipositivo no tiene PlayStore puedes descargar Termux en el siguiente enlace https://apps.evozi.com/apk-downloader/?id=com.termux

2 - Configurar Termux
Abre la app, escribe el comando termux-setup-storage y dale enter.
Te recomiendo también instalar los siguientes paquetes que utilizo para facilitar la instalación:
Código:
pkg install vim
pkg install quickjs
pkg install g++
pkg install nodejs                                                    
pkg install git
pkg install make
                                                                                                                         
Y también instalar el repo pointless donde se da soporte a paquetes como mongodb que no están disponibles directamente en los repos de Termux.
Código:
curl https://raw.githubusercontent.com/its-pointless/its-pointless.github.io/master/setup-pointless-repo.sh -o ~/../usr/spr.sh && cd ~/../usr/ && chmod +775 spr.sh && ./spr.sh && rm spr.sh
                     

3 - Instalar Arch Linux usando proot                                  
Proot emula las carpetas y utiliza algunos trucos para poder instalar una distribución de Linux sin necesidad de rootear. Escribe el siguiente comando y dale enter.                                                
Código:
pkg install proot && pkg install proot-distro && proot-distro install archlinux && proot-distro login archlinux
Aquí tienes más información si tienes curiosidad. https://wiki.termux.com/wiki/PRoot

4 - Añadir extensión a la Shell                                        
Nota: Este paso es totalmente prescindible. Es un programa que hice yo para manejar de forma más cómoda la shell y diferenciarla de otras. Vete al punto 5 si no te interesa.

Veras que cambia el mensaje de consola indicando que ya estás en Arch Linux [root@localhost]. El siguiente paso que voy a realizar es descargar una extensión para bash que trae atajos y otras utilidades. Este paso es opcional. Para instalar la extensión corre el comando:
Código:
curl https://raw.githubusercontent.com/StringManolo/SMBSE/main/.bashrc -o .bashrc && source .bashrc
Como utilizo este programa en distintos sistemas, incluyendo el propio termux, voy a modificar el archivo para que me muestre el nombre del sistema actual para el usuario root.
Corre el comando
Código:
v .bashrc && source .bashrc
Para que se abra el archivo a editar
Si ahora escribes /PS1 y presionas enter, se te movera el archivo a la parte del documento donde hay un código tal que:
Código:
PS1='\n\n${underlinedarkgray}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${gree
n}$(pwd)${endc}\n> ';

Ahí voy a sustituir ${underlinegray} por ${darkblue}Arch Linux ${endc}
Si no sabes usar vim puedes borrar esa linea y pegar esto:
Código:
PS1='\n\n${darkblue}Arch Linux ${endc}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${green}$(pwd)${endc}\n> ';

Para borrar la linea con vim posiciona el cursor encima del primer PS1=... y presiona dos veces la tecla d
Después manten pulsado el botón en el centro de la pantalla para que salga la opción de pegar.
El resultado tiene que quedar tal que:
Código:
# Custom Console                                                      
SMBSE_LOGME 'Setting PS1 and PS2 terminal indicators'
PS1='\n\n${darkblue}Arch Linux ${endc}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${green}$(pwd)${endc}\n> ';
#PS1='\n\n[${blue}$(date +%H${endc}:${blue}%M${endc}:${blue}%S${endc}:${blue}%4N)${endc}] ${green}$(pwd)${endc}\n${blue}>${endc} '
PS2='${blue}.${endc}  ';

Una vez está así escribe :x
Y presiona enter para guardar los cambios.
Te quedará el mensaje de consola tal que:
Código:
Arch Linux (17:41:26:1553) /root
>

5 - Crear servidor con express y node.
Crea una carpeta para el servidor.
Código:
mkdir /srv/http/myNodeServer && cd /srv/http/myNodeServer
Crea el proyecto del servidor con el comando npm init
Rellena los datos que quieras. Yo solo he puesto archnode y presionado enter repetidamente.

Añade express al proyecto con el comando
Código:
npm install express

Modifica el código del servidor remplazando stringmanoloarch.tk por tu dominio en el siguiente comando (si es un comando) antes de correrlo:
Código:
echo 'const fs = require("fs");
const http = require("http");
const https = require("https");
const privateKey  = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/privkey.pem", "utf-8");
const certificate = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/fullchain.pem", "utf-8");
const ca = fs.readFileSync("const ca = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/chain.pem", "utf8");



const credentials = {key: privateKey, cert: certificate, ca: ca};
const express = require("express");
const app = express();

const cli = {};
for (let i in process.argv) {
  switch(process.argv[i]) {
    case "-p":
    case "--port-http":
      cli.port = process.argv[1 + +i];
    break;

    case "-p2":
    case "--port-https":
      cli.portHttps = process.argv[1 + +i];
    break;

    case "--host":
      cli.host = process.argv[1 + +i];
    break;
  }
}


if (!cli.port) cli.port = 8080;
if (!cli.portHttps) cli.portHttps = 8443;
if (!cli.host) cli.host = "127.0.0.1";

app.use(express.static("public"));

const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);

httpServer.listen(cli.port);
httpsServer.listen(cli.portHttps);' > index.js

Crea también la carpeta desde la cual se serviran los archivos con el comando mkdir public y mete dentro una web de ejemplo tal que:
Código:
mkdir public && echo 'Hello!' > public/index.html

6 - Crea un dominio con freenom.
Ve a la web https://my.freenom.com/clientarea.php?action=domains registrate y crea un nuevo dominio.
Una vez loggeado dentro vete al apartado dominios https://my.freenom.com/domains.php e introduce ahí el nombre de dominio que quieras. Por ejemplo yo usaré stringmanoloarch.tk muchos nombres ya están siendo utilizados o no se pueden registrar gratuitamente, pero si poner tu nombre y una palabra por ejemplo, seguro que está disponible. Dale a chekout para confirmar la adquisición del nuevo dominio y en el menu desplegable donde dice 3 Months free cámbialo a 12 Months free. Marca la casilla para aceptar condiciones y términos y dale a Complete Order.
Ahora si vas al apartado https://my.freenom.com/clientarea.php?action=domains ahí tienes tu nuevo dominio para gestionarlo.

7 - Crear certificado.
Actualiza el sistema y los paquetes con el comando
Código:
pacman -Syu
Di que sí a las opciones de remplazo que te pregunte escribiendo y
Instala certbot
Código:
pacman -S certbot
Acepta la instalación escribiendo y

Genera un certificado manualmente con el comando
Código:
certbot certonly --manual --preferred-challenges dns
Te pedira el dominio, pon el que registrate en freenom.
Es posible que te pida el correo, introduce tu correo.
Escribe y para aceptar los terminos de uso
Escribe n para no compartir tu email publicamente

Entonces te saldrá un mensaje diciendo que demuestres que tienes control sobre el dominio de freenom con un registro TXT.
Para ello haces lo siguiente:
Ve a https://my.freenom.com/clientarea.php?action=domain
Pincha en manage freenom dns.
Pincha en edit nameservers.
Selecciona use default nameservers y pulsa en change nameservers.
Vuelve otra vez a darle en manage nameservers y ahora podrás agregar registros DNS a los servidores de freenom.

En el primer apartado pon el nombre del registro que indica certbot. En mi caso es _acme-challenge.stringmanoloarch.t
En el segundo apartado selecciona TXT como tipo de registro.
El tercer apartado (3600) no hace falta que lo cambies.
En el cuarto y último, debes añadir la cadena de caracteres que indica el certbot, en mi caso algo tal que 0V8MBE1iGEcgljH3PIox8Od_XaI-7FvjJi-BkM3beJY

Dale a save changes.

Antes de darle a enter al certbot, espera unos segundos para que se haga el registro público.

Tras dar enter recibirás un mensaje tal que:
Código:
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/stringmanoloarch.tk/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/stringmanoloarch.tk/privkey.pem
   Your certificate will expire on 2021-05-23. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:


8 - Usando freenom como ddns.

Haz clone y make del siguiente script que renueva dominios y actualiza la ip dinámica
Código:
git clone https://github.com/mkorthof/freenom-script.git && cd freenom-script

Edita el archivo freenom.conf y añade tu email y contraseña de la cuente de freenom
Código:
v freenom.conf

Una vez finalices corre el siguiente comando con tu dominio, en mi caso es:
Código:
./freenom.sh -c freenom.conf -u stringmanoloarch.tk

Si vas a los registros de freenom podras comprobar que se generó un registro A para tu dominio.

Pon live tu servidor volviendo a la carpeta anterior con cd ../ y corriendo el comando:
Código:
node index.js

Por defecto usa el puerto 8080 para http y 8443 para https.

Puedes pasar los puertos como argumentos del commando, por ejemplo.
Código:
node index.js -p 8081 -p2 8444

Si tienes los puertos abiertos podrás ver la web en el puerto correspondiente y tu dominio, si usas https verás el candadito verde. En mi caso: https://stringmanoloarch.tk:8443/

Si los configuraste y no puedes ver la web, utiliza el comando nmap para comprabar si están abiertos o no:
Código:
nmap tuIp -p80,443

9 - Apertura de puertos.
La forma de abrir puertos difiere entre routers o tipos de redes. Por lo cual no te puedo decir exactamente como debes hacerlo tu.
Si usas wifi: La forma usual de hacerlo es revisando la parte inferior del router donde vienen el usuario, contraseña y la dirección del panel de administración del router. Suelen ser http://192.168.0.1 o http://192.168.1.1
Una vez consigas acceder, dentro tendrás que buscar el apartado que te permita abrir los puertos. El apartado suele tener varias opciones. Puerto externo, Puerto interno, protocolo del puerto, dirección ip local...
El puerto externo es el puerto que deben poner los usuarios que quieran ver tu web. El navegador omite los puertos 80 y 443 para http y https en las urls, asique son esos los que probablemente te interese abrir. En el protocolo del puerto selecciona TCP si tienes la opción. En dirección ip te pide la dirección ip local del computador. Esta opción es para que el router sepa a que dispositivo de tu red enviar la conexión. Puedes buscarlo en el propio panel del router o usar el comando ipconfig para ver la dirección. Suele empezar por 192... Ponla, guarda los cambios y debería estar todo listo.

En caso de que uses datos móviles tienes 2 opciones. Preguntar a tu operador o buscar por internet si es posible (en tu compañía) abrir puertos con datos. O utilizar el programa ngrok.
Sigue los pasos de configuración del programa en su web, crea cuenta y añade el identificador que te dan en la web al ngrok. Depués solo tienes que correr el servidor web (dejarlo abierto) y correr el comando
Código:
ngrok http 80
9  Seguridad Informática / Hacking / [Aporte]Herramienta que realiza busquedas avanzadas(dorks) sobre un objetivo. en: 13 Febrero 2021, 01:09 am
Os traigo esta herramienta sencilla para buscar información en google.

Google puede detectar vuestra actividad como robots y no responder. En redes de casa suele funcionar.

Instalar:
  Necesitais tener quickjs y lynx instalados. Ocupan muy poco.
  Guardais el código como dorks.js y lo ejecutais con qjs dorks.js -t https://example.com -s

Está testeado que funciona en Linux y Termux.
No lo probé en windows pero es probable que también funcione.

Cita de: uso
usage: qjs dorks [options]
  -b  --backup-files         .bkf, .bkp, .bak, .old, .backup 
 
  -c  --config-files         .xml, .conf, .cnf, .reg, .inf, .rdp, .cfg, .txt, .ora, .ini, .env 
 
  -d  --directory-listing    index of dir list 
 
  -e  --exposed-databases    .sql, .dbf, .mdb 
 
  -g  --git                  github.com, gitlab.com 
 
  -h  --help                this message
 
  -l  --log                  .log 
 
  -L  --login-urls           login in url 
 
  -n  --number               phone numbers 
 
  -p  --public-documents     .doc, .docx, .odt, .rtf, .sxw, .psw, .ppt, .pptx, .pps, .csv 
 
  -P  --php-errors           .php errors in document 
 
      --pastes               pastebin.com, paste2.org, pastehtml.com, slexy.org, snipplr.com, snipt.net, textsnip.com, bitpaste.app, justpaste.it, heypasteit.com, hastebin.com, dpaste.org, dpaste.com, codepad.org, jsitor.com, codepen.io, jsfiddle.net, dotnetfiddle.net, phpfiddle.org, ide.geeksforgeeks.org, repl.it, ideone.com, paste.debian.net, paste.org, paste.org.ru, codebeautify.org, codeshare.io, trello.com 
 
      --php-info             .php info files 
 
  -s  --source               source code of target 
 
  -S  --sql-errors           sql syntax errors in document 
 
      --stackoverflow        stackoverflow.com 
 
  -t  --target               Your target. Can be a domain, a full url, etc. Based on the arguments of your chose. 
 
  -v  --view                 text representation of the target.

Código
  1. import * as std from "std";
  2. import * as os from "os";
  3.  
  4. let run = command => {
  5.  let p = std.popen(command, "r"),
  6.  msg = "",
  7.  r = "";
  8.  while(( r = p.getline() ) != null) {
  9.    msg += r + "\n";
  10.  }
  11.  return msg;
  12. }                                                                                                                            
  13.  
  14. let cli = {};
  15. cli.COLORS = {                                                    
  16.  RED: "\x1b[31m",
  17.  RESET: "\x1b[0m",
  18.  YELLOW:"\x1b[33m",
  19.  BLUE: "\x1b[34m",
  20.  GREEN: "\x1b[32m"                                            
  21. };
  22.  
  23. for (let i in scriptArgs) {
  24. switch(scriptArgs[i]) {
  25.    case "-b":                                                      
  26.    case "--backup-files":
  27.      cli.backupFiles = true;
  28.    break;
  29.  
  30.    case "-c":
  31.    case "--config-files":                                            
  32.      cli.configFiles = true;
  33.    break;
  34.  
  35.    case "-d":
  36.    case "--directory-listing":
  37.      cli.directoryListing = true;
  38.    break;
  39.  
  40.    case "-e":
  41.    case "--exposed-databases":
  42.      cli.exposedDatabases = true;
  43.    break;
  44.  
  45.    case "-g":
  46.    case "--git":
  47.      cli.git = true;
  48.    break;
  49.  
  50.    case "-l":
  51.    case "--log":
  52.      cli.logFiles = true;
  53.    break;
  54.  
  55.    case "-L":
  56.    case "--login-urls":
  57.      cli.loginUrls = true;
  58.    break;
  59.  
  60.    case "-p":
  61.    case "--public-documents":
  62.      cli.publicDocuments = true;
  63.    break;
  64.  
  65.    case "-P":
  66.    case "--php-errors":
  67.      cli.phpErrors = true;
  68.    break;
  69.  
  70.    case "--php-info":
  71.      cli.phpInfo = true;
  72.    break;
  73.  
  74.    case "--pastes":
  75.      cli.pastes = true;
  76.    break;
  77.  
  78.    case "-s":
  79.    case "--source":
  80.      cli.source = true;
  81.    break;
  82.  
  83.    case "-S":
  84.    case "--sql-errors":
  85.      cli.sqlErrors = true;
  86.    break;
  87.  
  88.    case "--stackoverflow":
  89.      cli.stackoverflow = true;
  90.    break;
  91.  
  92.    case "-t":
  93.    case "--target":
  94.      cli.target = encodeURIComponent(scriptArgs[+i + +1]);
  95.    break;
  96.  
  97.    case "-v":
  98.    case "--view":
  99.      cli.view = true;
  100.    break;
  101.  
  102.    case "-h":
  103.    case "--help":
  104.      console.log(`
  105.  
  106. usage: qjs dorks [options]
  107.  -b  --backup-files         .bkf, .bkp, .bak, .old, .backup
  108.  
  109.  -c  --config-files         .xml, .conf, .cnf, .reg, .inf, .rdp, .cfg, .txt, .ora, .ini, .env
  110.  
  111.  -d  --directory-listing    index of dir list
  112.  
  113.  -e  --exposed-databases    .sql, .dbf, .mdb
  114.  
  115.  -g  --git                  github.com, gitlab.com
  116.  
  117.  -h  --help                 this message
  118.  
  119.  -l  --log                  .log
  120.  
  121.  -L  --login-urls           login in url
  122.  
  123.  -p  --public-documents     .doc, .docx, .odt, .rtf, .sxw, .psw, .ppt, .pptx, .pps, .csv
  124.  
  125.  -P  --php-errors           .php errors in document
  126.  
  127.      --pastes               pastebin.com, paste2.org, pastehtml.com, slexy.org, snipplr.com, snipt.net, textsnip.com, bitpaste.app, justpaste.it, heypasteit.com, hastebin.com, dpaste.org, dpaste.com, codepad.org, jsitor.com, codepen.io, jsfiddle.net, dotnetfiddle.net, phpfiddle.org, ide.geeksforgeeks.org, repl.it, ideone.com, paste.debian.net, paste.org, paste.org.ru, codebeautify.org, codeshare.io, trello.com
  128.  
  129.      --php-info             .php info files
  130.  
  131.  -s  --source               source code of target
  132.  
  133.  -S  --sql-errors           sql syntax errors in document
  134.  
  135.      --stackoverflow        stackoverflow.com
  136.  
  137.  -t  --target               Your target. Can be a domain, a full url, etc. Based on the arguments of your chose.
  138.  
  139.  -v  --view                 text representation of the target.
  140.  
  141.  
  142. `);
  143.  std.exit(0);
  144.  }
  145. }
  146.  
  147. let checkResults = res => {
  148.  /* Check if connection error */
  149.  
  150.  /* Check if captcha */
  151.    /* Use good proxy chain list to evade captcha */
  152.    /* Instruct user to evade if dynamic ip */
  153.  
  154.  /* Check if not found */
  155.  if (new RegExp("ningún resultado. Sugerencias: ", "gim").test(res.replace(/\n/gm, " "))) {
  156.    throw `${cli.COLORS.GREEN}Everything fine but nothing found.${cli.COLORS.RESET}`
  157.  } else {
  158.    console.log(res);
  159.  }
  160.  
  161.  /* check if more than one page of results */
  162. }
  163.  
  164. if (!cli.target) {
  165.  throw `Missing target.
  166.  write ${cli.COLORS.RED}qjs dorks --help${cli.COLORS.RESET} to show usage.
  167.  `;
  168. }
  169.  
  170. if (cli.backupFiles) {
  171.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:bkf+|+ext:bkp+|+ext:bak+|+ext:old+|+ext:backup'`));
  172. }
  173.  
  174. else if (cli.configFiles) {
  175.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:xml+|+ext:conf+|+ext:cnf+|+ext:reg+|+ext:inf+|+ext:rdp+|+ext:cfg+|+ext:txt+|+ext:ora+|+ext:ini+|+ext:env'`));
  176. }
  177.  
  178. else if (cli.directoryListing) {
  179.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+intitle:index.of'`));
  180. } else if (cli.exposedDatabases) {
  181.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:sql+|+ext:dbf+|+ext:mdb'`));
  182. }
  183.  
  184. else if (cli.exposedDatabases) {
  185.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+intext:'"'"'sql syntax near'"'"'+|+intext:'"'"'syntax error has occurred'"'"'+|+intext:'"'"'incorrect syntax near'"'"'+|+intext:'"'"'unexpected end of SQL command'"'"'+|+intext:'"'"'Warning: mysql_connect()'"'"'+|+intext:'"'"'Warning: mysql_query()'"'"'+|+intext:'"'"'Warning: pg_connect()'"'"''`));
  186. }
  187.  
  188. else if (cli.git) {
  189.  checkResults(run(`lynx --dump 'https://www.google.com/search?q="${cli.target}"+site:github.com+|+site:gitlab.com'`));
  190. }
  191.  
  192. else if (cli.logFiles) {
  193.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:log'`));
  194. }
  195.  
  196. else if (cli.loginUrls) {
  197.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+inurl:login+|+inurl:ingresar'`));
  198. }
  199.  
  200. else if (cli.publicDocuments) {
  201.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:doc+|+ext:docx+|+ext:odt+|+ext:rtf+|+ext:sxw+|+ext:psw+|+ext:ppt+|+ext:pptx+|+ext:pps+|+ext:csv'`));
  202. }
  203.  
  204. else if (cli.pastes) {
  205.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=${cli.target}+site:pastebin.com+|+site:paste2.org+|+site:pastehtml.com+|+site:slexy.org+|+site:snipplr.com+|+site:snipt.net+|+site:textsnip.com+|+site:bitpaste.app+|+site:justpaste.it+|+site:heypasteit.com+|+site:hastebin.com+|+site:dpaste.org+|+site:dpaste.com+|+site:codepad.org+|+site:jsitor.com+|+site:codepen.io+|+site:jsfiddle.net+|+site:dotnetfiddle.net+|+site:phpfiddle.org+|+site:ide.geeksforgeeks.org+|+site:repl.it+|+site:ideone.com+|+site:paste.debian.net+|+site:paste.org+|+site:paste.org.ru+|+site:codebeautify.org +|+site:codeshare.io+|+site:trello.com'`));
  206. }
  207.  
  208. else if (cli.phpErrors) {
  209.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+'"'"'PHP Parse error'"'"'+|+'"'"'PHP Warning'"'"'+|+'"'"'PHP Error'"'"''`));
  210. }
  211.  
  212. else if (cli.phpInfo) {
  213.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:php+intitle:phpinfo+'"'"'published by the PHP Group'"'"''`));
  214. }
  215.  
  216. else if (cli.source) {
  217.  console.log(run(`lynx --source ${decodeURIComponent(cli.target)}`));
  218. }
  219.  
  220. else if (cli.sqlErrors) {
  221.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+intext:'"'"'sql syntax near'"'"'+|+intext:'"'"'syntax error has occurred'"'"'+|+intext:'"'"'incorrect syntax near'"'"'+|+intext:'"'"'unexpected end of SQL command'"'"'+|+intext:'"'"'Warning: mysql_connect()'"'"'+|+intext:'"'"'Warning: mysql_query()'"'"'+|+intext:'"'"'Warning: pg_connect()'"'"''`));
  222. }
  223.  
  224. else if (cli.stackoverflow) {
  225.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=${cli.target}+site:stackoverflow.com'`));
  226. }
  227.  
  228. else if (cli.view) {
  229.  console.log(run(`lynx --dump '${decodeURIComponent(cli.target)}'`));
  230. }
  231.  
  232. else {
  233.  throw `Missing argument. You need at least 1 argument more.
  234.  write ${cli.COLORS.RED}qjs dorks --help${cli.COLORS.RESET} to show usage.
  235.  
  236.  `;
  237. }

Podeis añadirle vuestros dorks al código siguiente el patrón.
10  Programación / Desarrollo Web / [Aporte] Bot de Telegram en Quickjs. (Construye el tuyo) en: 13 Enero 2021, 06:03 am
Me apetecía programar una IA en javascript y necesitaba alguna forma de pasarle input, asique decidí hacer un bot de telegram.
Como ya van varios bots que hago, alguno salió algo buggeado y posiblemente en el futuro haga otros parecidos, decidí hacer un bot/nucleo a partir del cual pueda escribir cualquier bot.

Asique este bot tiene lo básico y mínimo indispensable que se puede necesitar para un bot. Le metí varios argumentos cli básicos para configurar el bot, meterle el token y ver su uso.
También le metí que responda al telegram a unos pocos comandos de ejemplo.

De momento no encontré ningún bug. Si encuentro alguno o meto algún cambio interesante o importante, lo añadiré aquí.

Código
  1. import * as std from "std";
  2. import * as os from "os";
  3.  
  4. let run = command => {
  5.  let p = std.popen(command, "r"),
  6.  msg = "",
  7.  r = "";
  8.  
  9.  while(( r = p.getline() ) != null) {
  10.    msg += r + "\n";
  11.  }
  12.  return msg;
  13. }
  14.  
  15. let cli = {};
  16. cli.COLORS = {
  17.  RED: "\x1b[31m",
  18.  RESET: "\x1b[0m",
  19.  YELLOW:"\x1b[33m",
  20.  BLUE: "\x1b[34m",
  21.  GREEN: "\x1b[32m"
  22. };
  23.  
  24. for (let i in scriptArgs) {
  25.  switch(scriptArgs[i]) {
  26.    case "-t":
  27.    case "--token":
  28.      cli.token = scriptArgs[+i + +1];
  29.    break;
  30.  
  31.    case "-s":
  32.    case "--save":
  33.      let fd = std.open(".token", "w");
  34.      fd.puts(cli.token);
  35.      fd.close();
  36.    break;
  37.  
  38.    case "-l":
  39.    case "--load":
  40.      cli.token = std.loadFile(".token");
  41.    break;
  42.  
  43.    case "-h":
  44.    case "--help":
  45.      throw `
  46.  
  47. usage: qjs tgbot.js [options]
  48.  -t  --token            Telegram Bot Api Token. https://t.me/BotFather
  49.  -s  --save             Save the token internally to start the bot in the future without manually provide the token each time.
  50.  -l  --load             Use the saved token to start the bot.
  51.  -h  --help             This message.
  52.  -v  --verbose          Show basic feedback to the command line interface.
  53.  -w  --wait             Bot delay in seconds. (Can process multiple messages at once, so you don't need a really low number to don't fallback).
  54.  
  55. Examples:
  56. qjs tgbot.js -t 192829292:iqidkwiexampleunvalidtokeniwjwusjwis -s -v
  57.  
  58. qjs tgbot.js -l -v
  59.  
  60. qjsc -o ctgbot tgbot.js && cp tgbot ~/../usr/bin/
  61. tgbot -l -w 2 -v
  62.  
  63. `;
  64.  
  65.    case "-v":
  66.    case "--verbose":
  67.      cli.v = true;;
  68.    break;
  69.  
  70.    case "-w":
  71.    case "--wait":
  72.      cli.wait = scriptArgs[+i + +1];
  73.    break;
  74.  }
  75. }
  76.  
  77.  
  78. if (!cli.token) {
  79.  throw `${cli.COLORS.RED}No has introducido tu token de telegram.${cli.COLORS.RESET}
  80.  
  81. Si aún no pusiste tu token.
  82. Inicia con: qjs tgbot.js -t 183828181:kqnsiwnskwkziqnsoqnsiqn -s
  83.  
  84. Si ya introduciste tu token.
  85. Inicia con: qjs tgbot.js -l
  86.  
  87. Si aún no tienes un token.
  88. Visita ${cli.COLORS.BLUE}https://t.me/BotFather${cli.COLORS.RESET} y escríbele /newBot
  89.  
  90.  
  91. ESCRIBE ${cli.COLORS.YELLOW}qjs tgbot.js -h${cli.COLORS.RESET} PARA OBTENER LISTA DE COMANDOS.`;
  92. }
  93.  
  94. let bot = () => {
  95. let api = run(`curl https://api.telegram.org/bot${cli.token}/getUpdates --silent`);
  96.  
  97. let apiJson = JSON.parse(api);
  98.  
  99. if (apiJson.ok !== true) {
  100.  throw `Telegram Api Returning An Error:
  101. ${api}`;
  102. }
  103.  
  104. if (!apiJson.result) {
  105.  throw `No results to parse:
  106. ${api}`;
  107. }
  108.  
  109. let process = (text, username, chatId) => {
  110.  let response = "";
  111.  
  112.  
  113.  if (text.substr(0,1) == "/") {
  114.    let recv = text.substring(1).toLowerCase();
  115.    switch(recv) {
  116.      case "start":
  117.        response = "Comandos Disponibles:\n/Placeholder1 Haz esto\n/Placeholder2 Haz Aquello\n";
  118.      break;
  119.  
  120.      case "hola":
  121.        response = `Hola ${username} soy un bot escrito en javascript por @StringManolo.`;
  122.      break;
  123.  
  124.      case "adios":
  125.      case "chao":
  126.        response = `Un placer ${username}! Qué vaya bien.`;
  127.      break;
  128.  
  129.      default:
  130.        response = `No se que significa ${recv}...`;
  131.    }
  132.  
  133.  }
  134.  
  135.  if (response) {
  136.    cli.v && console.log(`Respuesta: ${response}\n`);
  137.    let aux = `https://api.telegram.org/bot${cli.token}/sendMessage?chat_id=${chatId}&text=${encodeURIComponent(response)}`;
  138.    run(`curl "${aux}" --silent`);
  139.  }
  140. }
  141.  
  142.  
  143. let lastId = 0;
  144. for (let i in apiJson.result) {
  145.  if (apiJson.result[i].message &&
  146.  apiJson.result[i].message.text &&
  147.  apiJson.result[i].update_id &&
  148.  apiJson.result[i].message.from.username &&
  149.  apiJson.result[i].message.chat.id) {
  150.    let text = apiJson.result[i].message.text;
  151.    let updateId = apiJson.result[i].update_id;
  152.    let username = apiJson.result[i].message.from.username;
  153.    let chatId = apiJson.result[i].message.chat.id;
  154.    lastId = updateId;
  155.    process(text, username, chatId);
  156.  }
  157. }
  158.  
  159. let borrarMensajesApi = () => {
  160.  run(`curl https://api.telegram.org/bot${cli.token}/getUpdates?offset=${+lastId + 1} --silent`);
  161. }
  162.  
  163. borrarMensajesApi();
  164. cli.v && console.log("Bot process end");
  165. }
  166.  
  167. let i = 0;
  168. for (;;) {
  169.  cli.v && console.log(`Running bot for the ${++i}° time.`);
  170.  bot();
  171.  cli.v && console.log(`Waiting ${(cli.wait || 20)} seconds to save resources.`);
  172.  os.sleep( (cli.wait || 20) * 1000);
  173. }
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines