Colección de citas famosas - Frases elegantes - ¿Quiere saber cuál es la nueva versión QQ de la tecnología de cifrado de teclado dinámico?

¿Quiere saber cuál es la nueva versión QQ de la tecnología de cifrado de teclado dinámico?

A continuación se ofrece una explicación del algoritmo para los archivos de contraseñas almacenados localmente de QQ. Te recomiendo que le eches un vistazo. Hay un código fuente cerca, que es cifrado circular MD5. . .

Texto:

Algoritmo de cifrado de contraseña de inicio de sesión de QQ 2005 Lunar New Year Edition y su código fuente

Binni (Binni@vip.163.com)

Después de obtener la versión de Año Nuevo de QQ en 2005, descubrí que no había nuevos cambios en su principio de cifrado. Después del seguimiento y análisis, desarrollé un programa para descifrar violentamente la contraseña QQ local.

Después de iniciar sesión con la contraseña QQ correcta, el resultado del cifrado se guardará en el archivo ewh.db en el directorio del usuario. El cifrado utiliza el algoritmo público MD5 y el resultado del cifrado se calculará finalmente después de n ciclos e inversión XOR. Después de comparar con el texto cifrado en el archivo ewh.db del usuario, aparecerá "La contraseña ingresada no coincide con la contraseña del último inicio de sesión exitoso. ¿El servidor ha verificado $0A (este mensaje se encuentra en los recursos de BasicCtrlDll?") .dll, $0A es un retorno de carro en formato C). De acuerdo con este mensaje, complete el descifrado por fuerza bruta de la contraseña QQ local.

En el sistema QQ, el símbolo "QD" representa datos QQ. Por ejemplo, podemos encontrar la estructura de datos que comienza con QD en el archivo User.db o ewh.db

1 datos originales de ewh.db

51 44 01 01 03 00 04. 03 00 BD AF A8 04 00 00 00

00 2E 06 00 07 03 00 B9 AB B4 65438

B7 2B BD 2D 34 4A 04 03

B2 04 00 00 00 3C A8 93 06

Entre ellos, el rojo es el número de ciclo AST, el azul es la cadena cifrada EWH, el verde es el número UIN QQ (110340156 = 0x 00693 a83c, el orden en el sistema Intel la memoria es 3CA89306).

2. Estructura de datos ewh.db

Hex

Desplazamiento DEC

Variable de comentario de datos de desplazamiento

Símbolo

0000 1 51 44 QD, indicador de datos QQ.

0002 3 01 01 Estructura de datos reservada reservada

000450300 Número total de segmentos de datos

0006 7 04 El primer segmento de datos (llamado 1S, lo mismo a continuación) El rango de tipos puede ser de 0x001 a 0x0F, 04 significa que estos datos no están cifrados. Tipo 1S

Longitud 0007 8 03 00 Marca 1S. LenFlag1S

0009 10 Los indicadores BD AF A8 1S (como AST, UIN, EWH, etc.) se procesan mediante operaciones simples de inversión y XOR. Aquí está el AST, que puede ser el número de cambios de algoritmo. ¡También podría ser la cantidad de conmutadores Axxx, lo que sea! Bandera 1S

000c 13 04 00 00 1s longitud de datos LenData1S.

0010 17 00 2E

= (404992) Datos 1S, aquí está el número de conversiones MD5.

Este dato está relacionado con el rendimiento del ordenador. Cuanto mayor sea el rendimiento de la computadora, mayores serán las variables de control de bucle generadas después del registro QQ exitoso. Datos 1S

0014 21 07 Tipo de datos 2S, 07 representa el tipo 2S cifrado con MD5.

Longitud 0015 22 03 00 2S logo lenflag 2S

0017 24 B9 AB B4 2S logo, aquí está EWH, lo que indica que este segmento de datos son datos de contraseña de EWH, que pueden ser la abreviatura de Flag2S Cifrado con Hash.

001A 27 10 00 00 2S longitud de datos LenData2S

001E 31 07 22 AA 96

56 19 A3 9E

82 19 B7 2B

Los datos BD 2D 34 4A 2S se generan después del cálculo del cifrado MD5. Por supuesto, también se someten a cálculos XOR y de inversión. Consulte la línea 1000B858 del código en el programa siguiente. Datos 2S

002E 47 04 3S tipo de datos tipo 3S

Longitud 002F 48 03 00 3S logo LenFlag3S

0031 50 A9 B5 B2 3S bandera, donde está UIN , lo que indica que este segmento de datos es un número QQ, que puede ser la abreviatura del número de identificación del usuario.

0034 53 04 00 00 00 Longitud de datos 3S LenData3S

0038 57 3C A8 93 06 Datos 3S, 3ca 893 06 = 110340156 datos 3S.

Tercero, principio de cifrado

Los siguientes símbolos del pseudocódigo VB se citan de las etiquetas de variables en el segundo punto "Descripción estructural" anterior, preste atención a su comprensión:

Pwd = MD5(Pwd, Len(Pwd))

Pwd es la contraseña ingresada por el usuario. Después del primer MD5, Pwd se convierte en una cadena MD5 con una longitud de 16 bytes.

XorKey As Long = 0 'XorKey es el byte utilizado para el descifrado.

Para k = 1 todadata 1s–1 'Debido a que ya se hizo una ronda antes, es necesario restar una aquí.

Contraseña = MD5(contraseña, 16)

Siguiente k

XorKey = XorKey Y ampHFFFF

Tecla xor =(LenData2S Y amp ;HFF) XOR (LenData2S\256)

) = Pwd(k) Xor La contraseña es inconsistente ;vbcrlf amp "¿Quieres ir al servidor para verificar? ”

Terminará si...

A través del proceso anterior, realmente admiro a los diseñadores de QQ con una cantidad tan grande de bucles y la aleatoriedad del número de bucles. , es imposible producir un diccionario QQ MD5. En teoría, se puede generar un diccionario MD5, pero este diccionario tendrá 1.15E 77 * 16 bytes, por lo que debe descifrarse por fuerza bruta en función de los datos proporcionados por ewh. db file.

Sin embargo, mi sensación es que más bucles deberían generar más conflictos MD5, lo cual no es necesariamente algo bueno

También hay una idea genial, que puede serlo. Más directo, más adelante. El artículo lo discutirá en detalle. Pero no estoy calificado para comentar hasta que tenga tiempo de completar el experimento. Esto está más allá del alcance de este artículo.

Cuarto, descifrar el algoritmo.

Repito: Cientos de miles de cifrados MD5 consumirán mucho tiempo de computadora. Si usa VB o VC tradicionales, el tiempo dedicado a esperar una contraseña también es considerable (por ejemplo, usando el código VB). El tiempo consumido puede ser 400 veces mayor que el del ensamblaje). Compilo el algoritmo de cifrado y descifrado subyacente en lenguaje ensamblador, lo compilo y lo conecto a través de MASM32 y finalmente uso el lenguaje de alto nivel para llamarlo Proporcionando una biblioteca dinámica del algoritmo. Otros lectores interesados ​​pueden agregar funciones enriquecidas, como agregar subprocesos múltiples, que se implementarán en una discusión posterior.

No lo discutiremos en profundidad aquí.

El ejemplo adjunto es un ejemplo de VB y VC llamando a una biblioteca dinámica en lenguaje ensamblador. El código VB simplemente implementa la función de descifrado de un solo subproceso a través del diccionario de contraseñas y los lectores pueden enriquecer su contenido. Añade más funciones.

Análisis de la estructura de datos QQ del verbo (abreviatura de verbo)

El siguiente es el código de desmontaje y el análisis del código en la biblioteca dinámica BasicCtrlDll.dll, que se utiliza principalmente para analizar la estructura de datos. en EWH. Algoritmos de demodulación de datos DB y QQ. Además, este algoritmo también puede extraer datos de User.db. Después de más investigaciones, no es difícil crear un visor del historial de chat y otro software.

1000 b 71D B8 AC 160110 mov eax, básico CTR 1001116AC

1000B722 E8 89460000 llamada básica

1000 b727 83EC 3C 3C sucursal esp

1000b72a8b45 08moveax, dword ptrss: [EBP 8] Asigne la dirección inicial de los datos a eax, los datos reales son **Datos, EAX=*Datos.

1000B72D 53 push ebx

1000B72E 56 push esi

1000B72F 57 push edi

1000b730b30movesi, dword ptrds: [EAX] para convertir Una cadena donde EAX representa una estructura y el primer miembro es el puntero de datos real.

1000 b732 894 D8 mov dword ptrss: [ebp-28], la variable local ECX [ebp-28] guarda la estructura del indicador global, ECX es la dirección del parámetro global, seguida al llamar a esta función.

1000B7358B46F8 MOVEAX, DWORD PTR DS: [ESI-8] es el miembro de longitud de la estructura CString, que indica cuántos bytes hay en total * * *.

1000B738 83F8 06 cmp eax, 6 Si la longitud es menor que 6, son datos no válidos.

1000 b 73 b 0 f 82 81020000 JB basic CTR.1000b9c2 Si es menor que 6, saltará, lo que indica que la cantidad de datos no es suficiente para la demodulación.

1000 b 741 803 e 51 CMP byte ptr ds: [ESI], si 51 son datos QQ, si QD es una marca de datos QQ.

1000 b744 0f 85 78020000 jnz basic CTR 1000 b9c 2

1000 b74a 807 e 01 44 CMP bytes ptr ds: [esi 1], 44

1000 b74e 0f 85 6e 020000 jnz basic CTR 1000 b9c 2

1000B754 66: 8B7E04movdi, wordptrds: [ESI 4] Para EWH, es el cuarto byte, que es 0003.

1000b758 83c604addiesi, el número de 4 segmentos de datos.

1000B75B 46 inc esi

1000B75C583C0FA ADEAX, -6EAX elimina 6 bytes, dejando 36H bytes para EWH.

1000B75F 46 inc esi

1000 b760 8945 08 movdword ptrs: [EBP 8], EAX apunta al primer segmento de datos.

1000 b 763 e8ce 050000 Call Basic CTR 1000 BD 36 abre un espacio de (100H) bytes en la memoria (ECX 9C) y la dirección del espacio devuelve EAX.

1000b768 8365e00 y dword ptrs: [ebp-20], 0 variable local [ebp-20] borrada.

1000b76c0fb7c7movzx EAX, di convertido a EAX, para EWH, di=3. Indica que hay tres datos.

1000B76F 85C0 test eax, eax

1000 b 771 8945 b 8 movdword ptrss: [ebp-48], variable local EAX [ebp-48] El número de segmentos para almacenar datos .

1000 b774 0F8E 21020000 jle basic CTR 1000 b99b

1000 b77a 837d 0807 CMP DWORD PTRS: [EBP 8], 7 Si la longitud total es inferior a 7, el resto debería. ser números QQ. Primera entrada = 36H

1000B77E0F823E020000JB Centro Básico. 1000B9C2 Si la longitud de los datos restantes es inferior a 7, salga.

1000b7848a06moval, byte ptr ds: [ESI] Cuando se ingresa por primera vez, ESI apunta al séptimo dato, que es el tipo de segmento de datos, como 04.

1000 b786 66:8b4e 01 mov CX, wordptrds: [ESI 1] CX = últimos datos y la longitud del indicador del segmento de datos, como 0003.

1000B78A 46 inc esi

1000B78B8B55 08movedx, dword ptrs: [EBP 8] longitud de datos restante, como 36H.

1000 b78e 836d 0803 subdword ptrss: [EBP 8], elimina tres de 3, por ejemplo, se convierte en 33H=51.

1000 B792 894 DC 8 mov dword ptrs: [ebp-38], la variable local ECX [ebp-38] almacena la longitud de la bandera en el segmento de datos.

1000 B795 0FB7F9 MOVZX EDI, CX EDI es la longitud del símbolo.

1000B798 46 inc esi

1000 b799 8845 E4 mov byte ptrs: [ebp-1C], y la variable local al [ebp-1C] guarda el tipo de este párrafo.

1000B79C8D4F04LEA ECX, DWORD PTR DS: [EDI 4] ECX es la longitud de la marca obtenida más 4, por ejemplo =7.

1000B79F 46 inc esi la primera vez, esi apunta al campo de bandera del primer segmento de datos, como BDAFA8, y comienza el noveno dato.

1000 b7a 0 394d 08 cmpdword ptrss: [EBP 8], ECX Si los datos restantes son menores que "longitud de bandera 4", no hay datos y no se realiza ningún procesamiento.

1000 b7a 3 0f 82 19020000 JB basic CTR 1000 b9c 2

1000b7a9 8b0c37movECX, dword ptrds: [EDI ESI] Omita la parte de la bandera del segmento de datos y cambie la longitud de. el segmento de datos asignado a ECX.

Por ejemplo, [edi esi]=4.

1000 b 7 AC 8d 1 c 37 lea ebx, dword ptrds: [EDI ESI] ebx guarda un nuevo puntero que apunta a la longitud de la parte de datos en el segmento de datos, por ejemplo, [EBX]= 4.

1000 b7af 895d c4mov dword ptrss: [ebp-3C], la variable local EBX [ebp-3C] guarda el puntero de longitud de la parte de datos en el segmento de datos.

1000b7b28d4c0f07Leaecx, dword ptrds: [EDI ecx 7] A partir de la bandera (su propia longitud es 3, más 4 bits de longitud = 7), más la longitud de los datos, es la longitud completa de los datos. Por ejemplo

1000B7B6 3BCA cmp ecx, edx Si la longitud de datos restante (como 36H) no es suficiente, salga.

1000 b7b 8 894d ccmov dword ptrs: [ebp-34], la variable local ECX [ebp-34] guarda la longitud total de este segmento de datos.

1000 b7bb 0 f 87 01020000 ja Basic CTR.1000B9C2 Si es menor que, salga del programa.

1000b7c1 8365f00 y dword ptrs: [ebp-10], 0 variable local [ebp-10] borrada.

1000b7c53c01cmpal, 1al guarda el tipo de este segmento, el tipo válido es 4 o 7.

1000 b7c 7 74 18 je CTR básico corto 1000 b7e 1

1000B7C9 3C 02

1000 b7cb 74 14 je CTR básico corto 1000 b7e 1<. /p>

1000B7CD 3C 03

1000 b7cf 74 10 je corto básico CTR 1000 b7e 1

1000B7D1 3C 04 cmp al, 4

1000. b7d 3 74 0C je CTR básico corto 1000 b7e 1

1000B7D5 3C 05 cmp al, 5

1000 b7d 7 74 08 je CTR básico corto 1000 b7e 1

.

1000B7D9 3C 07 cmp al, 7

1000 b7db 74 04 je corto básico CTR 1000 b7e 1

1000B7DD 3C 06 cmp al, 6

1000B7DF 75 19 jnz short baseline tr.1000B7FA

1000 b7e 1 51 push ecx es la longitud total del segmento, incluidos (tipo de segmento, longitud de la bandera, longitud de los datos de la bandera), por ejemplo, para el segmento de cifrado = 1AH.

1000B7E2 E8 23430000 teléfono ltMFC42.operator nuevo gt

1000 b 7 e 7 ff 75 cc push dword ptrs: [ebp-34]n = [ebp-34], variable local [EBP-34] Guarda la longitud total de este segmento de datos.

1000b7ea8d4e fdlea ecx, dword ptrds: [ESI-3] [ESI-3] apunta al comienzo de esta sección (contado a partir del tipo de sección).

1000 b7ed 8945 f 0 mov dword ptrss: [ebp-10], la variable local EAX [ebp-10] guarda los datos copiados.

1000B7F0 51 push ecx src

1000B7F1 50 push eax destino

1000B7F2 E8 E5450000 llama a ltMSVCRT.memcpy gtMemcpy, copia todos los datos de esta sección a un nuevo coloque y guarde el puntero de datos en la variable local [ebp-10].

1000B7F7 83C4 10 add esp, 10

1000b7FA8B45c8moveax, dword ptrss: [ebp-38] La variable local [ebp-38] contiene la longitud de la bandera en el segmento de datos.

1000B7FD 33C9 xor ecx, ecx

1000B7FF 32C4 xor al, ah usa la longitud XOR del bit alto del bit bajo, por ejemplo 3 xor 0=3.

1000b801 85ft prueba EDI. EDI es la longitud de la bandera EDI.

1000 b 803 76 12 jbe CTR básico corto 1000 b 817 Si este párrafo no tiene una marca de segmento, omítalo.

1000 b 8058 a 1431 movdl, bytestrds: [ecx ESI] Inicie el bucle, el número de bucles es la longitud de la etiqueta. La primera vez que ECX es 0, los primeros datos se cargan en DL.

1000B808 32D0 xor dl, al AL es el xor de los bits alto y bajo de la longitud, que es 3.

1000 b 80 af 6d 2 not dl dl = not([datos]xor[longitud del indicador del segmento de datos bit alto xor longitud del indicador del segmento de datos bit bajo])

1000 b 80 c 81431 mov byte ptrds: [ecx ESI], los datos DL se almacenan en el lugar correspondiente en la memoria original.

1000B80F 41 inc ecx

1000B810 3BCF cmp ecx,edi

1000 b 812 72 f 1 JB línea de base corta

1000b814b5d4mov ebx, dword ptrss: [ebp-3C] La variable local [ebp-3C] contiene el puntero de longitud de la parte de datos en el segmento de datos.

1000b81757 Push EDI es la longitud del bit de bandera.

1000b81856 Push ESI ESI se refiere a datos descifrados, como AST.

1000 b 8198d 4 E8 leaecx, dword ptrss: [ebp-18] La variable local [ebp-18] almacena el puntero del puntero de datos después de la conversión del tipo de conversión, como AST.

1000B81C E8 5B430000Teléfono ltMFC42. CString::CString gt; Cambia los datos descifrados al tipo CString. El tipo devuelto se coloca en la dirección especificada por EAX.

1000b821 8365fc00 y dword ptrs: [ebp-4], 0 variable local [ebp-4] borrada.

1000B825 6A FC push -4

1000B827 58 popular eax EAX=-4=FFFFFFFC

1000b828 8BF3movesi, EBX EBX guarda la longitud de la parte de datos en el puntero del segmento de datos.

1000B82A 2BC7 sub eax, EDI EAX = EAX-EDI = FFFFFFFC-3 = fffffff 9

1000b82c8b1emov ebx, dword ptrds: [ESI] ebx es la longitud de la parte de datos en el segmento de datos.

1000 b82e 014508 Añadir dword ptrs: [EBP 8], primer EAX, [EBP 8]=33. Después de la ejecución = 2C, equivalente a 33H-7H = 2CH.

1000 b 831 83c 604 addiesi, 4esi apunta a la parte de datos en el segmento de datos.

1000 b834 395d 08 CMP dword ptr ss: [ebp 8], ebx [ebp 8]=2C, ebx=4

1000 b837 0F82 6a 010000 JB directorio base 1000B9A7 p>

1000 b 83d 807 de 407 CMP byte ptrss: [ebp-1C], 7 variables locales [ebp-1C] almacenan el tipo de este segmento, 4 o 7.

1000B841 74 06 je short baseline tr 1000 b 849

1000b843 807de406cmp byte ptrs: [EBP-1c], 6 Si el tipo no es 6, ejecute 1000B862.

1000B847 75 19 jnz short baseline tr.1000B862

1000B849 8AC3 mov al, bl Si el tipo de segmento de datos es 7, ejecute esta declaración. BL contiene la longitud de este segmento.

1000B84B 33FF XOR edi, edi

1000B84D 32C7 xor al, bh al=(bit bajo de longitud y bit alto de longitud xor)

1000B84F 85DB prueba ebx, ebx

1000 b 851 760 f jbe short basic CTR 1000 b 862 Si la longitud es 0, significa que no hay contraseña.

1000B853 8A0C37 mov cl, byte puntero ds: [edi esi]

1000B856 32C8 xor cl, al

1000 b 858 f6d 1 NOT CLDL = NOT ( [datos]xor[longitud alta del indicador del segmento de datos xor longitud baja del indicador del segmento de datos])

1000B85A 880C37 mov byte ptr ds: [edi esi], cl

1000B85D 47 inc edi

1000B85E 3BFB cmp edi, ebx

1000b860 72f1JB bucle básico corto CTR.1000b853 hasta que se demodulen todos los datos.

1000B862 53 empuja la longitud de la cadena de datos ebx

1000B863 56 empuja los datos sin procesar esi para convertir

1000b864 8d4dec lea ecx, dword ptrss: [ ebp-14] La variable local [ebp-14] almacena el puntero del puntero de datos después de la conversión forzada del tipo CString, como DB2E0600.

1000B867 E8 10430000Teléfono ltMFC42.

CString::CString gt;

1000b86c8a45e4moval, byte ptrss: [ebp-1C] La variable local [ebp-1C] almacena el tipo de este segmento, 4 o 7.

1000 b 86 f 295d 08 subdword ptrss: [EBP 8], ebx elimina los datos procesados, después de la ejecución [ebp 8] = 28H, EBX es la longitud de la parte de datos en el segmento de datos.

1000b87203f3addiesi, ebxesi apunta al comienzo del siguiente segmento de datos y ebx guarda el puntero de longitud de la parte de datos en el segmento de datos.

1000B874 33FF XOR edi, edi

1000B876 84C0 prueba al, al prueba si el tipo de segmento es 0.

1000 b 878 c 645 fc 01 mov byte ptrs: [ebp-4], 1 variable booleana local [ebp-4]=1.

1000 b 87 c 0 f 86 a 3010000 jbe basic CTR.1000BA25 Si el tipo de datos de este segmento es 0, ejecute 1000BA25 y salga.

1000B882 3C 07 cmp al, 7

1000B8840F86B 6000000JBE basic CTR.1000B940 Si es menor o igual a 7, salte a 1000B940 para su ejecución. EWH termina aquí

1000B88A 3C 08 cmp al, 8

1000 b 88 c 0 f 84 7401000 je basic CTR.1000ba06 Si el tipo de datos es 8, salga directamente.

1000B892 3C 09 cmp al, 9

1000 b894 74 5D je corto básico tr 1000 b8f 3

1000B896 3C 0A cmp al, 0A

1000 b898 0f 85 87010000 jnz basic CTR 1000 ba25

1000b89E8B4D8movecx, dword ptrss: [EBP-28] Cuando el tipo de datos sea A, ejecute este código de programa.

1000B8A1 8D45 D4 leax, dword ptr ss: [ebp-2C]

1000B8A4 50 push eax

1000 b8 a5 E8 47 feffff llamada básica CTR 1000. b6f 1

1000B8AA 8B45 D4 mov eax, dword ptr ss: [ebp-2C]

1000 b8ad FF75 EC push dword ptr ss: [ebp-14]

1000B8B0 8B08 mov ecx, dword ptr ds: [eax]

1000B8B2 53 push ebx

1000B8B3 50 push eax

1000 b8 B4 ff 91 BC 000000 llamar a dword ptr ds: [ecx BC]

1000B8BA 8BD8 mov ebx, eax

1000B8BC 85DB test ebx, ebx

1000 b8be 0f 85 12010000 jnz basic CTR 1000 b9d 6

1000B8C4 8B45 D4 mov eax, dword ptr ss: [ebp-2C]

1000B8C7 6A 04 push 4

1000 b8c 9 8945 DC. mov dword ptr ss: [ebp-24], eax

1000B8CC 8D45 DC mov dword ptr ss: [ebp-24]

1000B8CF 50 push eax

1000B8D0 8D4D C0 eax, doble palabra ptr ss: [ebp-40]

1000B8D3 E8 A4420000 teléfono ltMFC42. CString::CString gt;

1000B8D8 50 push eax

1000B8D9 8D4D EC lea ecx, dword ptr ss: [ebp-14]

1000B8DC C645 FC 03 mov byte ptr ss: [ebp-4], 3

1000B8E0 E8 C3400000 teléfono ltMFC42. CString::operator=gt;

1000 b8e 5 C645 FC 01 mov byte ptr ss: [ebp-4], 1

1000B8E9 8D4D C0 LEAX, palabra doble ptr ss: [ ebp-40]

1000B8EC E8 AB400000 teléfono ltMFC42. CString: :~CString gt;

1000B8F1 EB 50 jmp base corta Ctr.1000B943

1000b8f3b4d8movecx, dword ptrss: [EBP-28] Realice esta operación cuando el tipo de datos sea 9.

1000B8F6 8D45 D0 lea eax, dword ptr ss: [ebp-30]

1000B8F9 50 push eax

1000B8FA E8 4E180000 centro base de llamadas 1000D14D

1000B8FF 8B45 D0 mov eax, dword ptr ss: [ebp-30]

1000 b902 FF75 EC push dword ptr ss: [ebp-14]

1000B905 8B08 mov ecx, dword ptr ds: [eax]

1000B907 53 push ebx

1000B908 50 push eax

1000B909 FF51 78 llamada dword ptr ds: [ecx 78]

1000B90C 8BD8 mov ebx, eax

1000B90E 85DB test ebx, ebx

1000 b 910 0f 85d 4000000 jnz basic CTR 1000 b9ea

<. p>1000 b 916 8b 45 D0 mov eax, dword ptr ss: [ebp-30]

1000B919 6A 04 push 4

1000 b 91B 8945 DC mov dword ptr ss: [ ebp-24], eax

1000B91E 8D45 DC leax, dword ptr ss: [ebp-24]

1000B921 50 push eax

1000B922 8D4D BC lea ecx , dword ptr ss: [ebp-44]

1000B925 E8 52420000 teléfono ltMFC42. CString::CString gt;

1000B92A 50 push eax

1000B92B 8D4D EC lea ecx, dword ptr ss: [ebp-14]

1000B92E C645 FC 02 mov byte ptr ss: [ebp-4], 2

1000B932 E8 71400000 teléfono ltMFC42. CString: :operator=gt;

1000 b937 C645 FC 01 mov byte ptr ss: [ebp-4], 1

1000B93B 8D4D BC lea ecx, dword ptr ss: [ ebp -44]

1000 b93e EB AC jmp short basic CTR 1000 b8ec

1000 b 9406 a 01 Tipo de segmento de datos al presionar 1

1000B942 5F pop edi.

1000b943 8B5D8movebx, dword ptrss: [ebp-28] La variable local [ebp-28] contiene la estructura de bandera global.

1000b9468d45ec leaeax, dword ptrss: [ebp-14] La variable local [ebp-14] almacena el puntero del puntero de datos después de la conversión, como DB2E0600.

1000b949 50pusheax almacena el puntero de datos después de la conversión.

1000b94a8d45ee8leaeax, dword ptrss: [ebp-18] La variable local [ebp-18] almacena el puntero del puntero de datos después de la conversión, como AST.

1000 b 94 dff 75 e 4 push dword ptrss: [ebp-1C] El primer byte de la variable local [ebp-1C] guarda el tipo de este segmento, 4 o 7.

1000B950 8BCB mov ecx, ebx

1000B952 50 push eax

1000B953 E8 B4FCFFFF llama a BasicCtr.1000B60C llama a 1000B60C(CString, Flag, CString)

1000B958 85FF Prueba de intercambio electrónico de datos

1000B95A 74 18 je base corta

1000b95c8b45e0emovax, dword ptrss: [EBP-20] variable local [ebp-28] la primera vez es 0, que es un contador.

1000b95f8b4b64movecx, dword ptrds: [ebx 64] existe en la estructura de la bandera y es una dirección global.

1000B9628B55F0MOVEDX, DWORD PTRSS: [ebp-10] La variable local [ebp-10] guarda los datos copiados, es decir, no ha sido procesado. Por ejemplo, 040300BDAF…………

EAX No. 2 SHL eax 1 E0 02 = EAX * 2

1000 b968 891401 movdword ptrds: [ECX EAX], EDX no demodulará El Los datos sin procesar se colocan en la memoria indicada por el puntero en la estructura global.

1000b96b8b4b78movecx, dword ptrds: [ebx 78] existe en la estructura de la bandera y es una dirección global.

1000b96E8B55ccmovedx, dword ptrss: [ebp-34] La variable local [ebp-34] guarda la longitud total de este segmento de datos.

1000 b 971891401 movdword ptrds: [ECX EAX], EDX coloca la longitud de los datos en la memoria indicada por el puntero en la estructura global.

1000b974 8065fc00 y bytestrss: [ebp-4], 0 variable booleana local [ebp-4]=0.

1000B978 8D4D EC lea ecx, dword ptr ss: [ebp-14]

1000B97B E8 1C400000 teléfono ltMFC42. CString:: ~ CString gt; Borra la parte de datos CString en el segmento de datos.

1000b980834d fcff o dword ptrs: [EBP-4], ffffffff variable booleana local [ebp-4]=-1, cuál es verdadera.

1000B984 8D4D E8 lea ecx, dword ptr ss: [ebp-18]

1000B987 E8 10400000 teléfono ltMFC42. CString:: ~ CString gt; borra la parte de la bandera CString en el segmento de datos, como AST.

1000 b 98 CFF 45 e 0 incdword ptrss: [EBP-20] Contador de variable local [ebp-28] incrementado en uno.

1000B98F 8B45 E0 mov eax, dword ptr ss: [ebp-20]

1000b992b45b8cmepeax, dword ptrss: [ebp-48] Variable local [ebp-48] Número de segmentos a almacenar datos.

1000 b 9950 f8c dffdffffjl basic CTR 1000 b77a demodula cíclicamente cada segmento de datos.

1000b99b8b45 08moveax, dword ptrss: [EBP 8] Última longitud restante.

1000B99E F7D8 neg eax

1000B9A0 1BC0 sbb eax, eax

1000B9A2 83E0 04 y eax, 4

1000 B9 a5 EB 1E jmp CTR básico corto 1000 B9 C5

1000 b9a 7 837d F0 00 CMP dword ptr ss: [ebp-10], 0

1000B9AB 74 09 je línea base corta tr.1000B9B6<. /p>

1000 b9ad FF75 F0 push dword ptr ss: [ebp-10]

1000B9B0 E8 FF3F0000 teléfono ltMFC42.operator eliminar gt

1000B9B5 59 pop ecx

1000B9B6 834D FC FF o dword ptr ss: [ebp-4], FFFFFFFF

1000B9BA 8D4D E8 lea ecx, dword ptr ss: [ebp-18]

1000B9BD E8 DA3F0000 teléfono ltMFC42.

CString:: ~ CString gt;

1000B9C2 6A 04 push 4

1000B9C4 58 pop eax

1000B9C5 8B4D F4 mov ecx, dword ptr ss: [ebp- C]

1000B9C8 5F pop edi

1000B9C9 5E pop esi

1000B9CA 5B pop ebx

1000 b9cb 64: 890d 000000 mov dword ptr fs: [0], ecx

1000B9D2 C9 salir

1000B9D3 C2 0400 volver 4

1000 b9d 6 837d F0 00 CMP dword ptr ss: [ebp -10], 0

1000B9DA 74 09 je línea base corta tr.1000B9E5

1000 b9dc FF75 F0 push dword ptr ss: [ebp-10]

1000B9DF E8 D03F0000 teléfono ltMFC42.operator eliminar gt

1000B9E4 59 pop ecx

1000B9E5 8B45 D4 mov eax, dword ptr ss: [ebp-2C]

1000B9E8 EB 12 jmp base corta Ctr.1000B9FC

1000 b9ea 837d F0 00 CMP dword ptr ss: [ebp-10], 0

1000B9EE 74 09 je base corta tr.1000B9F9

1000 b9f 0 FF75 F0 push dword ptr ss: [ebp-10]

1000B9F3 E8 BC3F0000 teléfono ltMFC42.operator eliminar gt

1000B9F8 59 pop ecx

1000B9F9 8B45 D0 mov eax, dword ptr ss: [ebp-30]

1000B9FC 8B08 mov ecx, dword ptr ds: [eax]

1000B9FE 50 push eax p>

1000B9FF FF51 08 call dword ptr ds: [ecx 8]

1000BA02 8BF3 mov esi, ebx

1000BA04 EB 03 jmp short baseline tr.1000BA09

1000BA06 6A 04 push 4

1000BA08 5E pop esi

1000BA09 8065 FC 00 y puntero de byte ss: [ebp-4], 0