Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo funciona QQ?

¿Cómo funciona QQ?

¿I.Cifrado de contraseña?

La contraseña de cada cuenta oicq se almacena en un archivo local. Al iniciar sesión en oicq, la contraseña ingresada se compara primero con un archivo local

. Si la contraseña no coincide con la contraseña guardada en el archivo, se le preguntará: "La contraseña que ingresó no coincide con la contraseña utilizada para el último inicio de sesión exitoso

¿Desea verificarla en el servidor? ??

El archivo de contraseña de OICQ 99c es Matrix.cnt El archivo de contraseña de OICQ 99b es matric.ewh ?

El prototipo de función del algoritmo de cifrado de contraseña es: ?

void.CalcPassword(char *contraseña, int len, char *outbuffer)?

Parámetros: ?

¿Contraseña es la contraseña pura ingresada?

len: ¿Longitud de la contraseña?

outbuffer: ¿Longitud fija de la contraseña cifrada de 16 bytes?

Descripción: esta función utiliza herramientas de depuración para encontrar la dirección de entrada 15f:456718 para la contraseña. cifrado y comunicación entre usuarios.

p>

La contraseña más larga conocida es de 20 bytes, ¿consulte a continuación la comunicación cifrada entre usuarios?

El archivo de contraseña de Oicq99b es

matrix.Ewh, se almacena en el directorio de cada cuenta de oicq y la contraseña calculada por CalcPassword es exactamente de 16 bytes. Por lo tanto, usar este archivo puede usar fuerza bruta para descifrar la contraseña de

Oicq99c. El archivo de contraseña es mucho más complejo. Varias veces, CalcPassword se usa para calcular la contraseña explícita primero, y luego el resultado del cálculo se usa nuevamente como contraseña, y el número de cálculos se representa mediante una palabra doble de 4 bytes para cada cuenta oicq. Sección

Tanto el recuento de bytes como la contraseña calculada se guardan en un archivo Matrix.cnt, que tiene exactamente 20 bytes de longitud. Debido a las múltiples iteraciones del cálculo, el tiempo de cálculo de la contraseña es extremadamente largo. y por lo tanto es casi imposible usar la fuerza bruta para descifrar la contraseña de oicq99

c?

¿Ver el historial de chat?

El historial de chat de cada uno. La persona tiene su propio número oicq. En el directorio, el nombre del archivo es el número oicq de la otra parte.msh(99b) o

.msj(99c).

¿El prototipo de? la función principal de descifrado es: ?

<. p>BOOL Decode(char *src,int srclen,char *decodekey, char outbuffer,int * p

outlen)?

Parámetros: ?

src: ¿Búfer para almacenar datos cifrados?

Srclen: Número de bytes src. ?

Decodekey: Clave fija de 16 bytes. ?

Outbuffer: la dirección del búfer de texto sin formato de salida. ?

Poutlen: la dirección donde se almacena la longitud del descifrado. ?

Descripción: Dirección de entrada de función: 15f:456D33. Esta función utiliza la clave para descifrar. Devuelve VERDADERO en caso de éxito y FALSO en caso de error

. ?

Obviamente, la clave para el descifrado es cómo obtener la clave de descifrado de la clave de 16 bytes. ?

No se requiere contraseña para generar la clave y ver el historial de chat. El algoritmo es: ?

1. Utilice el número oicq utilizado actualmente como contraseña, llame a la función de cálculo de contraseña CalcPassword para obtener el texto cifrado temporal

keycode1. ?

2. Utilice keycode1 como clave de descifrado.

Los datos del archivo Matrix2.ewh (matrix.ewh es 99b) son el byte 17 a partir de 0

, tienen una longitud de 32 bytes y descifran la clave de 16 bytes de keycode2. ?

3. Usando keycode2 como clave, puedes desbloquear el historial de chat con cualquier persona. ?

Por ejemplo, para ver el historial de chat del número oicq 123456, el algoritmo es: ?

BYTE keycode1<16> ?

BYTE filebuffer<; 32>; ?

//Lea el archivo array2.ewh, lea la palabra número 17 comenzando desde 0, la longitud es 32 y guárdela en filebuffer.

ReadToBuffer(filebuffer) ?

//Calcular código clave1 con el número oicq actual ?

CalcPassword('123456', 6 , código clave1).?

//Calcular código clave2 ?

BYTE código clave2<16>; ?

int len ​​​​= 16;

Deocode(filebuffer, 32, código clave1,código clave2,&len); /p>

// Ahora keycode2 es la clave que puede ver cualquier historial de chat. ?

// Si desea ver el historial de chat de 888888, lea el archivo 888888.msj en un búfer más grande.

¿Decodificar (largerbuffer,largerbufferlen,keycode2,outbuffer,*outlen), después del éxito?

outbuffer contiene el historial de chat descifrado. ?

En tercer lugar, cifrar la comunicación con el servidor.

Correspondiente a Decode está la función de cifrado Encode. ?

void Encode(char *src,int srclen,char *encodekey,char *outbuffer,int * ?

poutlen)?

Parámetros: ?

src:búfer de texto sin formato.?

Srclen: La longitud del búfer de texto sin formato. ?

Encodekey: Clave utilizada para el cifrado fijo de 16 bytes. ?

Búfer de salida: búfer cifrado de salida. ?

Poutlen: la dirección de almacenamiento de la longitud de salida. ?

Descripción: La dirección de entrada de esta función es: 15f:456b62 Utilice encodekey para cifrar el texto sin formato.

Función ecode y la misma clave puede descifrar. ?

l Iniciar sesión en el servidor:?

¿Qué se envía el paquete de datos?

{BYTE b1; ¿fijado en 0x2?

¿BYTE b2; fijado en 0x3?

¿BYTE b3?

¿BYTE b4; está fijo en 0X0?

BYTE cmd; El servidor de inicio de sesión es 0X15. ?

Número de serie WORD, almacenado de mayor a menor ?

Número oicq DWORD; Número OICQ binario, almacenado sin problemas de mayor a menor. ?

Clave BYTE<16> ; Clave de 16 bytes generada aleatoriamente. ?

Búfer BYTE<64>;Contenido cifrado de 64 bytes.

?

BYTE endchar ;Fijado en 0x3.

El núcleo es el contenido del búfer <64>. CalcPassword realiza un cálculo con la contraseña, luego usa ?

como clave para cifrar el texto sin formato de longitud 0 para obtener 16 bytes y luego lo envía cifrado. Por ejemplo, ¿el puerto?

la secuencia es "abc123" y el algoritmo es?

Clave de acceso BYTE<16> ?

CalcPassword('abc123', 6',contraseña ) ?

BYTE código clave<16> ?

int keycodelen=16 ?

Codificar(0,0,contraseña,código clave,&keycodelen; ) ?

int keycodelen=16; p>

BYTE sndbuffer<51>; ?

memset(sndbuffer,0,51) ?

memcpy (sndbuffer,keycode,16) ?

// ¿El resto del sndbuffer es la dirección IP de la máquina actual, etc., y no tiene nada que ver con verificar la contraseña?

BYTE resultado<64> ?

int sresultlen=64 ?

Codificar (sndbuffer,51, generar aleatoriamente 16 bytes de clave, resultado y resultados)?

Finalmente, la clave aleatoria de 16 bytes se enviará al servidor junto con la contraseña cifrada de 64 bytes para su verificación. Si puede utilizar el sniffe

r para escuchar las comunicaciones de alguien con el servidor, entonces podrá descifrar contraseñas. Por supuesto, el descifrado de contraseñas en línea también se puede realizar a través del servidor, pero la velocidad es muy lenta y no tiene ningún valor práctico. ?

l Si el inicio de sesión es exitoso, el servidor devolverá la clave ServerKey de 16 bytes. ?

l ¿Cuál es el formato del paquete UPD?

BYTE b1; ¿Fijado en 2?

BYTE b2; ¿Fijado en 1?

BYTE b3; b4; ¿fijado en 0?

BYTE cmd; registrado como 0X15?

SECUENCIA DE PALABRA dispuesta en orden ascendente, consistente con la secuencia enviada. ?

BYTE msg<56>; ?

BYTE endchar ;Corregido 0x3.

Después de un cálculo de CalcPassword, use la contraseña para descifrar el mensaje y obtenga un 16 -Clave de sección de palabras. Los 16 bytes a partir del primer byte

son la clave para comunicarse con el servidor, llamada temporalmente ServerKey.

Las claves cambian con frecuencia.

Esta clave se utiliza para cifrar y descifrar todas las comunicaciones con el servidor después de iniciar sesión.

Descifra mensajes cifrados de otros usuarios.

Descifra mensajes cifrados de otros usuarios.

El formato de la información cifrada de otros usuarios es:?

¿BYTE b1; fijado en 0x0?

BYTE b2?

BYTE b3; ¿fijado en 0xA o 0x2?

¿Número BYTE OICQ utilizado para el cifrado?

DWORD EncodeOicqID; Número OICQ cifrado de mayor a menor. ?

DWORD seq; número de secuencia ?

BYTE msg ?

l Descifrar el número oicq de la otra parte.

?

Separe los 4 bytes de EncodeOicqID con sal y luego inviértalos. ?

Dado que Salt = 0XA0, EncodeOicqID = 0X 5F5EBD1F. ?

// ¿Realizar operaciones XOR por separado?

0X 5F5EBD1F XOR 0XA0A0A0A0 = 0X FFFE1DBF ?

// ¿Luego invertir la operación?

NOT 0X FFFE1DBF = 0X1E240, que convertido a decimal es 123456. Entonces el número oicq de la otra parte es 123456. ?

l Descifrar el mensaje. ?

Primero sintetice una contraseña de 20 bytes. Los primeros 4 bytes son el número oicq de la otra parte, ordenados en forma binaria de mayor a menor. Los últimos 16 bytes son la clave del servidor

. La fuente de las claves del servidor se presentará en la Sección 3. ?

Si el número oicq de la otra parte es 123456, ¿cuál es la contraseña de 20 bytes?

00 01 E2 40 + clave de servidor de 16 bytes. ?

Utilice el algoritmo de contraseña para calcular la contraseña de 20 bytes y obtener la clave de 16 bytes, y luego podrá descifrar la información de la otra parte

. ?

V. ¿Cifrar la información enviada a otros usuarios?

Después de iniciar sesión, el servidor notificará la dirección IP y el puerto del amigo, así como una clave de 16 bytes. Es el número OI

CQ actual más la clave del servidor de 16 bytes de la otra parte calculada mediante CalcPass. ?

Al enviar información a la otra parte, solo necesita usar estos 16 bytes para cifrarla. ?

VI.Algunas conclusiones

El cifrado de oicq 99c es muy estricto y no es fácil de descifrar. Es imposible falsificar información a menos que tengas la contraseña de alguien

etc. Si tuviera un millón de computadoras capaces de realizar decenas de miles de millones de operaciones por segundo, podría descifrar la clave del servidor de 16 bytes que la otra parte usa para comunicarse con el servidor, y eso tendría que ser realmente rápido. En resumen, oicq 99c es seguro y este artículo no considera los primeros protocolos para la comunicación de texto sin cifrar entre usuarios que todavía están en uso

.