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
1  Programación / Programación C/C++ / Re: Programa de Calculadora con sockets en: 31 Agosto 2022, 19:33 pm
Un entero de 16 bits puede almacenar los valores entre -32768 y 32767, lo más sencillo es utilizar stdint.h
Ejemplo:
Código
  1. #include <stdint.h>
  2. int16_t entero_16bits = 12345;
Ver:
https://cplusplus.com/reference/cstdint/

Otra manera es con un arreglo de bytes:
Código
  1. // Advertencia: puede no funcionar para valores negativos
  2. int valor = 12345;
  3. unsigned char data[2];
  4. data[0] = valor & 0xFF;
  5. data[1] = (valor >> 8) & 0xFF;
  6. // El valor quedo guardado en data y ocupa 2 bytes
  7.  
  8. int recuperar_valor = data[0] | data[1] << 8;
2  Programación / Programación General / Re: Traducir Texto Hex en notepad++ o 010 editor en: 3 Junio 2022, 18:27 pm
Te recomiendo que pruebes con CheatEngine y HxD
En CE podes buscar tipos simples como int, float, double. Y también structs (seleccionando grouped).
Si lo que buscas es una fecha, posiblemente este codificada con 4 Bytes conteniendo los segundos desde 1970 (UNIX Time)
3  Programación / Ingeniería Inversa / Ayuda para identificar algoritmo de compresion zlib en: 24 Diciembre 2021, 16:26 pm
Hola, tengo un archivo que fue comprimido con zlib y estoy tratando de averiguar el método que fue utilizado para comprimirlo.

Este archivo en particular usa un nivel 9 de compresión, y por lo que pude descifrar la entrada se divide en bloques de 8KiB, y se hace Z_SYNC_FLUSH luego de comprimir cada bloque, pero cada 8 bloques el algoritmo parece hacer otra cosa.

Este es el código que escribí para descomprimir y comprimir el archivo.
Para descomprimir funciona bien, pero solo comprime correctamente los primeros 7 bloques del archivo.
Código
  1. import sys
  2. import zlib
  3.  
  4. # python3 zlib-flate.py -d output.bin input.bin
  5. # python3 zlib-flate.py -9 input.bin output_test.bin
  6.  
  7. def usage():
  8. print("Usage:")
  9. print(f"python3 {sys.argv[0]} -[1-9,d] input.bin output.bin")
  10. exit()
  11.  
  12. def main():
  13. argc = len(sys.argv)
  14. if argc != 4:
  15. usage()
  16. try:
  17. if sys.argv[1] == "-d":
  18. # Decompress file
  19. with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file:
  20. data = input_file.read()
  21. comp_obj = zlib.decompressobj()
  22. data_plain = comp_obj.decompress(data)
  23. output_file.write(data_plain)
  24. else:
  25. # Compress file
  26. level = -int(sys.argv[1])
  27. if level < 1 or level > 9:
  28. print("Invalid compression level")
  29. with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file, open("output.bin", "rb") as test_file:
  30. comp_obj = zlib.compressobj(level)
  31. data = input_file.read(8 * 1024) # Read block of 8KiB
  32. i = 1
  33. while data != b"":
  34. data_zip = comp_obj.compress(data)
  35. data_zip += comp_obj.flush(zlib.Z_SYNC_FLUSH)
  36.  
  37. # Check if compressed data differs
  38. lenght = len(data_zip)
  39. data_test = test_file.read(lenght)
  40. if data_zip == data_test:
  41. print(f"Block #{i}: correctly compressed")
  42. else:
  43. print(f"Block #{i}: invalid data")
  44. exit()
  45.  
  46. output_file.write(data_zip)
  47. data = input_file.read(8 * 1024)
  48. i = i + 1
  49. print("File compressed correctly!")
  50. except (IOError, ValueError) as error:
  51. print("Invalid parameters")
  52.  
  53. main()
  54.  

Archivo comprimido con zlib:
https://mega.nz/file/8a5C1SyQ#xqy9nCycTrWfrnwuvWa39xd128s9huSFuf8kOr6kK8Q

4  Programación / Programación General / Programa que imprime un número entre 0 y un billón como texto [SWI-Prolog] en: 8 Octubre 2020, 23:34 pm
Siempre quise hacer un programa que dado un numero lo imprima como texto, por ejemplo 132 -> ciento treinta y dos, pero nunca me puse, hasta hoy que vi gramáticas de cláusulas definidas en programación lógica y en poco más de media hora salió.
Los casos más difíciles de hacer fueron por ejemplo 16 (dieciséis), 21 (veintiuno) que son una única palabra y 1002 (mil dos) que no es “un mil dos” o “uno mil dos”.
Como no chequeo que el resto sea distinto de cero pueden generarse casos como “40 -> cuarenta y cero” o “41 -> cuarenta y cero y uno, cuarenta y cero… y cero y uno” que son quitados con el operador cut (!).
Les dejo acá el código y algunos ejemplos.
17 diecisiete
29 veintinueve
547 quinientos cuarenta y siete
1234 mil doscientos treinta y cuatro
3597426 tres millones quinientos noventa y siete mil cuatrocientos veintiséis
742258963 setecientos cuarenta y dos millones doscientos cincuenta y ocho mil novecientos sesenta y tres
100000000000 cien mil millones
999999999999 novecientos noventa y nueve mil novecientos noventa y nueve millones novecientos noventa y nueve mil novecientos noventa y nueve
1000000000000 un billon
31000 treinta y uno mil*
* Y aquí encontré un bug, debería decir treinta y un mil

Código
  1. % Imprime un numero como texto
  2. print_number(N) :- numero(N, L, []), !, atomic_list_concat(L, ' ', A), writeln(A).
  3.  
  4. % Crea una lista [0..N]
  5. create_list(N, L) :- findall(X, between(0, N, X), L).
  6.  
  7. % Imprime los numeros entre 0 y N
  8. print_numbers(N) :- create_list(N, L), print_aux(L).
  9. print_aux([]).
  10. print_aux([X|L]) :- print_number(X), print_aux(L).
  11.  
  12. % Convierte un numero en una lista de palabras
  13. % ej: numero(132, L, []) -> [ciento, treinta, y, dos].
  14. numero(0) --> [cero].
  15. numero(1) --> [uno].
  16. numero(2) --> [dos].
  17. numero(3) --> [tres].
  18. numero(4) --> [cuatro].
  19. numero(5) --> [cinco].
  20. numero(6) --> [seis].
  21. numero(7) --> [siete].
  22. numero(8) --> [ocho].
  23. numero(9) --> [nueve].
  24.  
  25. numero(10) --> [dies].
  26. numero(11) --> [once].
  27. numero(12) --> [doce].
  28. numero(13) --> [trece].
  29. numero(14) --> [catorce].
  30. numero(15) --> [quince].
  31.  
  32. numero(20) --> [veinte].
  33. numero(30) --> [treinta].
  34. numero(40) --> [cuarenta].
  35. numero(50) --> [cincuenta].
  36. numero(60) --> [sesenta].
  37. numero(70) --> [setenta].
  38. numero(80) --> [ochenta].
  39. numero(90) --> [noventa].
  40. numero(100) --> [cien].
  41.  
  42. % Convertir numeros entre 16 y 19
  43. numero(N) --> {N > 15, N < 20, U is N mod 10, numero(U, X, []), atomic_list_concat([dieci|X], S)}, [S].
  44. % Convertir numeros entre 21 y 29
  45. numero(N) --> {N > 20, N < 30, U is N mod 10, numero(U, X, []), atomic_list_concat([veinti|X], S)}, [S].
  46. % Convertir numeros entre 31 y 99
  47. numero(N) --> {N > 30, N < 100, D is N - (N mod 10), U is N mod 10}, numero(D), [y], numero(U).
  48.  
  49. numero(200) --> [doscientos].
  50. numero(300) --> [trescientos].
  51. numero(400) --> [cuatrocientos].
  52. numero(500) --> [quinientos].
  53. numero(600) --> [seiscientos].
  54. numero(700) --> [setecientos].
  55. numero(800) --> [ochocientos].
  56. numero(900) --> [novecientos].
  57. numero(1000) --> [mil].
  58.  
  59. % Convertir numeros entre 101 y 199
  60. numero(N) --> {N > 100, N < 200, D is N mod 100}, [ciento], numero(D).
  61. % Convertir numeros entre 201 y 999
  62. numero(N) --> {N > 200, N < 1000, C is N - (N mod 100), D is N mod 100}, numero(C), numero(D).
  63.  
  64. % Convertir numeros entre 1001 y 1999
  65. numero(N) --> {N > 1000, N < 2000, D is N mod 1000}, [mil], numero(D).
  66. % Convertir numeros entre 2000 y 999 000 que terminan en 000, ej: 7000
  67. numero(N) --> {N >= 2000, N =< 999000, C is N div 1000, D is N mod 1000, D = 0}, numero(C), [mil].
  68. % Convertir numeros entre 2001 y 999 999
  69. numero(N) --> {N > 2000, N < 1000000, C is N div 1000, D is N mod 1000}, numero(C), [mil], numero(D).
  70.  
  71. numero(1000000) --> [un, millon].
  72.  
  73. % Convertir numeros entre 1 000 001 y 1 999 999
  74. numero(N) --> {N > 1000000, N < 2000000, D is N mod 1000000}, [un, millon], numero(D).
  75. % Convertir numeros entre 2 000 000 y 999 999 000 000 que terminan en 000 000, ej: 7 000 000
  76. numero(N) --> {N >= 2000000, N =< 999999000000, C is N div 1000000, D is N mod 1000000, D = 0}, numero(C), [millones].
  77. % Convertir numeros entre 2000001 y 999 999 999 999
  78. numero(N) --> {N > 2000000, N < 1000000000000, C is N div 1000000, D is N mod 1000000}, numero(C), [millones], numero(D).
  79.  
  80. numero(1000000000000) --> [un, billon].
  81.  

Para ejecutar instalan SWI-Prolog
Guardan el código como “numtext.pl”
Abren cmd en el directorio donde guardaron el archivo
> swipl numtext.pl
?- print_number(N). # donde N es el número a mostrar
5  Programación / Programación C/C++ / Re: Ayuda con HTTP Proxy en C en: 14 Febrero 2020, 16:08 pm
Ok, encontre el error, las imagenes no terminan con un salto de linea. Primero se envia un HTTP request con el tamaño del archivo y luego los datos del archivo.

Código
  1. void* pushData(void* args) {
  2. sockets* src_dst = (sockets*)args;
  3. int src = src_dst->source;
  4. int dst = src_dst->dest;
  5. char* data = new char[1048576];
  6. while (true) {
  7. strcpy(data, "");
  8. int msg_size = recv(src, data, 1048576, 0);
  9. if (msg_size > 0) {
  10. printf("%d->%d Reenviando %d bytes\n", src, dst, msg_size);
  11. send(dst, data, msg_size, 0);
  12. }
  13. }
  14. delete (sockets*)args;
  15. delete[] data;
  16. close(src);
  17. close(dst);
  18. return NULL;
  19. }
6  Programación / Programación C/C++ / Ayuda con HTML Proxy en C en: 11 Febrero 2020, 17:39 pm
Supongamos que tengo una página web en un servidor Apache corriendo en 192.168.1.1:80 y quiero acceder a él desde 127.0.0.1:8080 (las ip y puertos son solo de ejemplo).

El siguiente programa me muestra la página pero las imágenes no cargan, tampoco puedo hacer login. No se que es lo que tengo mal.

Código
  1. // g++ -Wall -Werror tcp_proxy.cpp -o tcp_proxy -lpthread -lws2_32
  2.  
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <pthread.h>
  9. #include <winsock2.h>
  10. #include <ws2tcpip.h>
  11.  
  12. #define Localhost "127.0.0.1"
  13. #define ProxyPort 8080
  14. #define HTTP_Server "192.168.1.1"
  15. #define HTTP_Port "80"
  16.  
  17. #define MaxUsersQueue 10
  18. #define MaxMsgSize 2048
  19.  
  20. struct sockets {
  21. int source;
  22. int dest;
  23. };
  24.  
  25. void* conectarProxy(void*);
  26. void* pushData(void*);
  27.  
  28. int main(int argc, char* argv[]) {
  29. WSADATA wsaData;
  30. WSAStartup(MAKEWORD(2, 2), &wsaData);
  31.  
  32. int proxy_socket = socket(AF_INET, SOCK_STREAM, 0);
  33.  
  34. sockaddr_in server_addr;
  35. server_addr.sin_family = AF_INET;
  36. server_addr.sin_addr.s_addr = inet_addr(Localhost);
  37. if (argc < 2)
  38. server_addr.sin_port = htons(ProxyPort);
  39. else // Usar puerto pasado desde la terminal
  40. server_addr.sin_port = htons(atoi(argv[1]));
  41.  
  42. int server_addr_size = sizeof(server_addr);
  43. bind(proxy_socket, (sockaddr*) &server_addr, server_addr_size);
  44.  
  45. listen(proxy_socket, MaxUsersQueue);
  46.  
  47. while (true) {
  48. sockaddr_in client_addr;
  49. int client_addr_size = sizeof(client_addr);
  50. int socket_client = accept(proxy_socket, (sockaddr*) &client_addr, &client_addr_size);
  51.  
  52. pthread_t hilo_conectarProxy;
  53. pthread_create(&hilo_conectarProxy, NULL, conectarProxy, &socket_client);
  54. }
  55. close(proxy_socket);
  56. return 0;
  57. }
  58.  
  59. void* conectarProxy(void* sc_param) {
  60. int socket_client = *((int*)sc_param);
  61.  
  62. int httpServerSock = socket(AF_INET, SOCK_STREAM, 0);
  63. addrinfo hints;
  64. memset(&hints, 0, sizeof(hints));
  65. hints.ai_family = AF_INET;
  66. hints.ai_socktype = SOCK_STREAM;
  67. addrinfo* res;
  68. getaddrinfo(HTTP_Server, HTTP_Port, &hints, &res);
  69. connect(httpServerSock, res->ai_addr, res->ai_addrlen);
  70. freeaddrinfo(res);
  71.  
  72. sockets* cliente_proxy = new sockets{socket_client, httpServerSock};
  73. pthread_t hilo_cliente_proxy;
  74. pthread_create(&hilo_cliente_proxy, NULL, pushData, cliente_proxy);
  75.  
  76. sockets* proxy_cliente = new sockets{httpServerSock, socket_client};
  77. pthread_t hilo_proxy_cliente;
  78. pthread_create(&hilo_proxy_cliente, NULL, pushData, proxy_cliente);
  79.  
  80. pthread_join(hilo_cliente_proxy, NULL);
  81. pthread_join(hilo_proxy_cliente, NULL);
  82. return NULL;
  83. }
  84.  
  85. void* pushData(void* args) {
  86. sockets* src_dst = (sockets*)args;
  87. int src = src_dst->source;
  88. int dst = src_dst->dest;
  89. char* data = new char[MaxMsgSize];
  90. char buffer[MaxMsgSize];
  91. while (true) {
  92. strcpy(data, "");
  93. strcpy(buffer, "");
  94. int msg_size = 0;
  95. do {
  96. msg_size += recv(src, buffer, MaxMsgSize, 0);
  97. if (msg_size == 0) break;
  98. if (msg_size == -1) break;
  99. printf("%d->%d Recibido: %d bytes\n", src, dst, msg_size);
  100. strcat(data, buffer);
  101. } while (strchr(data, '\n') == NULL);
  102. if (msg_size == -1) break;
  103. int sent_msg_size = send(dst, data, msg_size, 0);
  104. printf("%d->%d Enviado: %d bytes\n", src, dst, msg_size);
  105. if (sent_msg_size == -1) break;
  106. }
  107. delete (sockets*)args;
  108. delete[] data;
  109. close(src);
  110. close(dst);
  111. return NULL;
  112. }
  113.  
7  Foros Generales / Foro Libre / Re: Ideas para algoritmo matemático para cifrado? en: 24 Septiembre 2019, 01:36 am
Hola, ANSI X9.23 es una forma bastante sensilla de padding, simplemente agrega ceros y la cantidad de ceros que agregaste hasta completar un multiplo del tamanio del bloque.

Citar
In ANSI X9.23, between 1 and 8 bytes are always added as padding. The block is padded with zeros and the last byte of the block is set to the number of bytes added.
Example: In the following example the block size is 8 bytes, and padding is required for 4 bytes (in hexadecimal format)

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |


En cuanto al algoritmo de cifrado puedes inventar uno basado en AES con un tamanio de clave distinto.
8  Informática / Hardware / Re: pregunta sobre procesadores??? en: 7 Julio 2019, 23:52 pm
Depende de la laptop, en el 99.9% de los casos el socket es BGA (Ball Grid Array) y esta soldado a la placa base por lo que es practicamente imposible de cambiar el procesador.
Salvo en algunas excepciones el socket es PGA (Pin Grid Array) o LGA (Land Grid Array) y si es posible cambiarlo de igual forma que en las PC de escritorio.
Para saber el tipo de socket si tienes un procesador Intel vas a ark.intel.com buscas el modelo de procesador y si en Sockets Soportados dice algo que contenga BGA (ej: FCBGA1356) es porque esta soldado.
9  Programación / Programación C/C++ / Re: Asignaciones e inicializacion de constructores.. en: 23 Junio 2019, 01:13 am
Puedes usar guion bajo siempre que no este al comienzo o hallan dos seguidos.
MAL:
int _numero;
int un__numero;
int __ARRAY_
BIEN:
int un_numero;
int esto_es_una_variable;
int estoTambien;

C++ implementa los siguientes metodos... a veces, no estoy seguro de cuando, depende de si una clase hereda de otra, es virtual o virtual pura, usa un template, etc. Igual no importa mucho, si lo usas y te da error al compilar entonces no esta definido y tienes que implementarlo vos, si te da error en la ejecucion quizas lo implemento y no hace lo que quieres y tienes que redefinirlo*.

Código
  1. class array {
  2. private:
  3.  int inicio, tamanio;
  4.  int* datos;
  5. public:
  6.  // Constructor por defecto (sin parametros):
  7.  array();
  8.  // Constructor por copia
  9.  array(const array&);
  10.  // Constructor por movimiento
  11.  array(array&&);
  12.  // Operador de asignacion
  13.  array operator=(const array&);
  14.  // Operador de asignacion por movimiento
  15.  array& operator=(array&&);
  16.  // Destructor
  17.  ~array();
  18.  
  19.  // NO implementa otros constructores
  20.  array(int, int, int*);
  21.  // NO implementa la comparacion
  22.  bool operator==(const array&);
  23.  bool operator<=(const array&);
  24. };
  25.  

*
Código
  1. // Lo que hace por defecto
  2. array::array(const array& arr) {
  3.  start = arr.start;
  4.  size = arr.size;
  5.  data = arr.data;
  6. }
  7.  
  8. // Lo que tu quieres que haga
  9. array::array(const array& arr) {
  10.  start = arr.start;
  11.  size = arr.size;
  12.  data = new int[size];
  13.  for (int32_t i = 0; i < size; i++)
  14.    data[i] = arr.data[i];
  15. }
  16.  

10  Programación / Programación C/C++ / Re: Asignaciones e inicializacion de constructores.. en: 22 Junio 2019, 22:29 pm
C++ crea de forma implicita un contructor por defecto (sin parametros) y sobrecarga el operando de asignacion en el caso de que la clase sea bastante trivial, es decir implementa lo siguiente a partir de tu codigo:

Código
  1. class s {
  2. private:
  3. int x;
  4. public:
  5. s() { x = 0}
  6. s(int x1) { x = x1; }
  7. s operator=(int x1) { x = x1; return *this; }
  8. void p() const { std::cout << x; }
  9. int getx() const { return x; }
  10. };

La linea s t = 6; en el main llama al constructor por defecto s() y pone x = 0, luego llama s.operator=(6) y pone x = 6

Otra cosa que no tiene que ver con tu pregunta, NUNCA pongas uno o dos guion bajo al principio del nombre de una variable en C++, esos nombres estan reservados para las librerias del lenguaje y es una mala practica de programacion que deriva de los lenguajes no case-sensitive como Visual Basic donde para diferenciar User y user escribes _user.

Citar
"Don't overlegislate naming, but do use a consistent naming convention: There are only two must-dos: a) never use "underhanded names," ones that begin with an underscore or that contain a double underscore;" (p2 , C++ Coding Standards, Herb Sutter and Andrei Alexandrescu)

Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines