¿Cuál es el método de cifrado del teclado de la última versión de Madman qq2007?
Texto:
Algoritmo de cifrado de contraseña de inicio de sesión de la versión del Año Nuevo Lunar QQ2005 y su código fuente
Binny (Binny@vip.163.com)
Después de obtener la versión del Año Nuevo Lunar QQ2005, descubrí que no había nuevos cambios en su principio de cifrado. Después del seguimiento y análisis, compilé un programa para forzar la contraseña local de QQ.
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 finalmente se calcula mediante N ciclos y heterocedasticidad recíproca. Después de compararlo con el resultado del cifrado en el archivo ewh.db del usuario, se emitirá "La contraseña ingresada no es consistente con la contraseña del usuario". último inicio de sesión exitoso". La contraseña ingresada no coincide con la contraseña del último inicio de sesión exitoso. ¿Se ha verificado $0A en el servidor? (Esta información se encuentra en el recurso de BasicCtrlDll.dll. El formato de $0A en lenguaje C es retorno de carro. Siga este mensaje para completar la operación local. Descifrado por fuerza bruta de la contraseña de QQ.
En el sistema QQ, el símbolo "QD" representa datos de QQ. QD en el archivo User.db o ewh.db
p>Datos sin procesar I.db
51 44 01 01 03 00 04 03 00 BD AF A8 04 00 00 00 00.
00 2E 06 00 07 03 00 B9 AB B4 10 00 00 07 22
AA 96 56 19 A3 9E 82 19 B7 2B BD 2D 34 4A 04 03
00 A9 B5 B2 04 00 00 00 3C A8 93 06
p>
Entre ellos, el rojo es el número de ciclos AST, el azul es la cadena cifrada EWH y el verde es el UIN QQ número (110340156=0x0693A83C, el orden en la memoria del sistema Intel es 3CA89306): 3CA89306
Estructura de datos II.db
HEX
Offset DEC
Variable de anotación de datos de compensación
Bandera
0000 1 51 44 QD, QQ bandera de datos de datos bandera
0002 3 01 01 Reserva de estructura de datos reserva
0004 5 5 Reservar estructura de datos reservar
0005 5 Estructura de datos reservada
0004 5 03 00 Número total de segmentos de datos
0006 7 04 El tipo del primer segmento de datos (en lo sucesivo, 1S) puede ser de 0x01 a 0x0F, donde 04 indica que estos datos no están cifrados
0007 8 03 00 La longitud del indicador 1S
p>0009 10 Bandera BD AF A8 1S (como AST, UIN, EWH, etc.), a través de un procesamiento de cálculo heterodino e inverso simple, aquí está AST, también puede ser el tiempo de cambio de algoritmo o el tiempo de conmutación Axxx, etc. .! Flag1S
000C 13 04 00 00 00 Longitud de datos 1S LenData1S
0010 17 00 2E 06 00
= (404992) Datos 1S, aquí está la frecuencia de conversión MD5 .
Estos datos están relacionados con el rendimiento de la computadora. Cuanto mayor sea el rendimiento de la computadora, mayor será la variable de control de bucle generada después del registro QQ exitoso.
Datos 1S
0014 21 07 Tipo de datos 2S, 07 representa el uso del tipo de cifrado MD5 2S
0015 22 03 00 Longitud del indicador 2S LenFlag2S
0017 24 B9 AB B4 El indicador 2S, en este caso EWH, significa que este segmento de datos son datos cifrados con EWH, que pueden ser la abreviatura de Encrypt With Hash Flag2S
001A 27 10 00 00 00 Longitud de datos 2S LenData2S p>
001E 31 07 22 AA 96
56 19 A3 9E
82 19 B7 2B
BD 2D 34 4A 2S MD5 Los datos generados después El cálculo de cifrado es, por supuesto, realizar diferentes cálculos directos e inversos, como se muestra en la línea 1000B858 del siguiente programa. Data2S
002E 47 04 3S Tipo de datos Type3S
002F 48 03 00 Longitud del indicador 3S LenFlag3S
0031 50 A9 B5 B2 Indicador 3S, aquí está UIN, representa El segmento de datos es el número QQ, o puede ser: Identificador de usuario Flag3S
0034 53 04 00 00 00 Longitud de datos 3S LenData3S
0038 57 3C A8 93 06 Datos 3S, 3C A8 93 06 = 110340156 Data3S
3. Principio de cifrado
Algunos símbolos en el siguiente pseudocódigo VB se citan de los símbolos variables en el segundo punto de la descripción de la estructura anterior. Preste atención. para entender:
Pwd = MD5(Pwd, Len(Pwd))
' Pwd es la contraseña ingresada por el usuario Después de la primera ronda de MD5, Pwd se convierte en una cadena MD5. con una longitud de 16 bytes.
XorKey As Long = 0 ' 1
Pwd = MD5(Pwd, 16)
Siguiente k
XorKey = XorKey Y &HFFFF
XorKey = (LenData2S And & ;HFF) Xor (LenData2S\ 256)
XorKey = &HFF - XorKey 'Reverse
Para k = 1 a 16
Pwd(k) = Pwd (k) Xor & vbcrlf & "¿Quieres ir al servidor para verificación?"
End If
A través del El proceso anterior, realmente admiro a los diseñadores de QQ. Con una cantidad tan grande de bucles, junto con Debido a la aleatoriedad del número de bucles, es simplemente imposible crear un diccionario QQ MD5. Aunque teóricamente es posible generar un diccionario MD5, este diccionario tendrá un tamaño de hasta 1,15E+77*16 bytes, por lo que debe descifrarse violentamente en función de los datos proporcionados por el archivo ewh.db.
Pero mi sensación es que agregar más bucles debería producir más colisiones MD5, lo cual no es necesariamente algo bueno.
Existe otro método de hackeo, quizás más directo, que exploraremos en detalle en un artículo futuro.
Pero no estoy calificado para comentar sobre ello hasta que haya realizado el experimento, y eso está más allá del alcance de este artículo.
IV. Algoritmo de descifrado
Repetir el cifrado MD5 cientos de miles de veces consumirá mucho tiempo de computadora. Si usa VB o VC tradicional, el tiempo de espera para obtener una contraseña también lo es. considerable (por ejemplo, usar código VB puede tardar 400 veces más que ensamblar), por lo que uso lenguaje ensamblador para compilar el algoritmo de cifrado y descifrado subyacente, compilo y me conecto a través de MASM32 y finalmente lo llamo usando un lenguaje de alto nivel. Al proporcionar una biblioteca dinámica de algoritmos, es conveniente que otros lectores interesados agreguen ellos mismos funciones ricas. Por ejemplo, agregar subprocesos múltiples, etc., también se implementarán en exploraciones futuras. Aquí no se llevará a cabo ninguna discusión en profundidad.
Los ejemplos adjuntos son ejemplos de VB y VC que llaman a bibliotecas dinámicas 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.
5. Análisis de la estructura de datos QQ
La siguiente biblioteca dinámica BasicCtrlDll.dll se utiliza para el desmontaje y análisis de código. Se utiliza principalmente para analizar la estructura de datos de EWH.DB y el problema del algoritmo de demodulación de datos QQ. Además, el algoritmo puede extraer datos de User.db. No es difícil profundizar en la creación de software como un visor de historial de chat.
1000B71D B8 AC160110 mov eax,BasicCtr.100116AC
1000B722 E8 89460000 call BasicCtr.1000FDB0
1000B727 83EC 3C sub esp,3C
1000B72A 8B4 5 08 mov eax,dword ptr ss: [ebp+8] Asigne la dirección inicial de los datos a EAX, los datos reales son ** data, EAX=*data
1000B72D 53 Push ebx
1000B72E 56 push esi
1000B72F 57 push edi
1000B730 8B30 mov esi,dword ptr ds: [Cadena a convertir, EAX representa la estructura, el primer miembro es el Puntero de datos reales
1000B732 894D D8 mov dword ptr ss: [ebp-28], la variable local ecx [ebp-28] guarda la estructura del indicador global, ECX es la dirección del parámetro global, siga esta dirección al llamar esta función
p>1000B735 8B46 F8 mov eax,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
1000B73B 0F82 81020000 jb BasicCtr.1000B9C2 Si la longitud es menor que 6, saltará, indicando que la cantidad de datos no es suficiente para la demodulación
1000B741 803E 51 cmp byte ptr ds:[esi],51 ¿Son datos QQ? QD es marca de datos QQ
1000B744 0F85 78020000 jnz BasicCtr.1000B9C2
1000B74A 807E 01 44 cmp byte ptr ds:[esi +1],44
1000B74E 0F85 6E020000 jnz BasicCtr.1000B9C2
1000B754 66:8B7E 04 mov di,word ptr ds: [Para EWH, es el 4º+1 de 0003 bytes
1000B758 83C6 04 suma esi,4 puntos al número de segmentos de datos
1000B75B 46 inc esi
1000B75C 83C0 FA agregar eax,-6 EAX eliminar 6 bytes, dejando 36H bytes para EWH
1000B75F 46 inc esi
1000B760 8945 08 mov dword ptr ss: [ebp+8], eax apunta al primer segmento de datos
1000B763 E8 CE050000 Llame a BasicCtr. 1000BD36 abre la memoria (ECX+9C) en un espacio de bytes (100H) y la dirección del espacio devuelve EAX
1000B768 8365 E0 00 y dword ptr ss:[ebp-20],0 variable local [ebp- 20 ] Borrado
1000B76C 0FB7C7 movzx eax,di convertido a EAX, a EWH.
di=3 significa que hay 3 segmentos de datos
1000B76F 85C0 test eax,eax
1000B771 8945 B8 mov dword ptr ss:[ebp-48],eax variable local [ebp-48 ] Número de segmentos de datos guardados
1000B774 0F8E 21020000 jle BasicCtr.1000B99B
1000B77A 837D 08 07 cmp dword ptr ss:[ebp+8],7 Si la longitud total es menor que 7, entonces la parte restante debe ser el número QQ. Cuando la primera entrada = 36H
1000B77E 0F82 3E020000 jb BasicCtr.1000B9C2 Si la longitud de los datos restantes es menor que 7, salga
1000B784 8A06 mov al,byte ptr ds:[esi ] Cuando se ingresa por primera vez, ESI apunta al séptimo dato, que es el tipo de segmento de datos, por ejemplo 04
1000B786 66:8B4E 01 mov cx,word ptr ds:[esi+1] CX= the últimos datos y el indicador de longitud del segmento de datos, como 0003. Por ejemplo, 0003
1000B78A 46 inc esi
1000B78B 8B55 08 mov edx,dword ptr ss:[ebp+8] La longitud de los datos restantes, como 36H
1000B78E 836D 08 03 sub dword ptr ss:[ebp+8],3 Elimina 3, por ejemplo, se convierte en 33H=51
1000B792 894D C8 mov dword ptr ss.[ebp-38 ],variable local ecx [ebp -38] Guarda la longitud de la bandera en el segmento de datos
1000B795 0FB7F9 movzx edi,cx EDI es la longitud de la bandera actual
1000B798 46 inc esi p>
1000B799 8845 E4 mov byte ptr ss: [
1000B79C 8D4F 04 lea ecx,dword ptr ds:[edi+4] ECX es la longitud de bandera obtenida más 4, por ejemplo: 7.
1000B79F 46 inc esi Por primera vez, ESI apunta al campo de bandera del primer segmento de datos, por ejemplo, a BDAFA8, comenzando desde el noveno segmento de datos
1000B7A0 394D 08 cmp dword ptr ss:[ebp+8],ecx Si los datos restantes son menores que "longitud de bandera + 4", no hay datos y por lo tanto no se procesan. Sin procesar
1000B7A3 0F82 19020000 jb BasicCtr.1000B9C2
1000B7A9 8B0C37 mov ecx,dword ptr ds:[edi+esi] Omita la parte de la bandera del segmento de datos y reemplace La longitud es asignado a ECX, [EBX]=4
1000B7AF 895D C4 mov dword ptr ss:[ebp -3C], la variable local ebx [ebp-3C] contiene el puntero de la longitud de la parte de datos en el segmento de datos
p>1000B7B2 8D4C0F 07 lea ecx,dword ptr ds:[edi+ecx+7] A partir del bit de bandera (la longitud en sí es 3, más 4 bits de longitud = 7), más el longitud de los datos, es la longitud de los datos completa.
Por ejemplo E
1000B7B6 3BCA cmp ecx,edx Si la longitud de datos restante (como 36H) no es suficiente, salga del programa
1000B7B8 894D CC mov dword ptr ss:[ebp -34],ecx La variable local [ebp-34] guarda la longitud total de este segmento de datos
1000B7BB 0F87 01020000 ja BasicCtr.1000
1000B7C1 8365 F0 00 y dword ptr ss: [ebp-10], 0 La variable local [ebp-10] se borra
1000B7C5 3C 01 cmp al,1 al Guarde el tipo de este segmento de datos, el tipo válido es 4 o 7
1000B7C7 74 18 je corto BasicCtr.1000B7E1
1000B7C9 3C 02 cmp al,2
1000B7CB 74 14 je corto BasicCtr.1000B7E1
1000B7CD 3C 03 cmp al,3
1000B7CF 74 10 je corto BasicCtr.1000B7E1
1000B7D1 3C 04 cmp al,4
1000B7D3 74 0C je corto BasicCtr.1000B7E1 p>
1000B7D5 3C 05 cmp al,5
1000B7D7 74 08 je corto BasicCtr.1000B7E1
1000B7D9 3C 07 cmp al,7
1000B7DB 74 04 je short BasicCtr.1000B7E1
1000B7DD 3C 06 cmp al,6
1000B7DF 75 19 jnz short BasicCtr.1000B7FA
1000B7E1 51 push ecx es la longitud total del segmento de datos, incluidos (tipo de segmento de datos + longitud de la bandera + bandera + longitud de los datos + datos), por ejemplo, para el segmento de contraseña = 1AH
1000B7E2 E8 23430000 llame a
1000B7E7 FF75 CC push dword ptr ss:[ebp-34] n=[ebp-34], la variable local [ebp-34] guarda la longitud total de este segmento
1000B7EA 8D4E FD lea ecx ,dword ptr ds: [esi-3 ] [esi-3] Apunta al comienzo de este segmento (calculado a partir del tipo de segmento)
1000B7ED 8945 F0 mov dword ptr ss:[ebp-10], eax variable local [ebp-10] guarda los datos copiados
1000B7F0 51 push ecx src
1000B7F1 50 push eax dest
1000B7F2 E8 E5450000 call
1000B7F7 83C4 10 add esp,10
1000B7FA 8B45 C8 mov eax,dword ptr ss: [ebp- 38] Variables locales[e
bp-38] Guarde la longitud del bit de bandera en el segmento de datos
1000B7FD 33C9 xor ecx,ecx
1000B7FF 32C4 xor al,ah Convierta la longitud inferior a la longitud superior Para Por ejemplo, por ejemplo: 3 bits de bandera, luego salta
1000B805 8A1431 mov dl,byte ptr ds:[ecx+esi] Comienza el bucle, el número de ciclos es la longitud del bit de bandera. La primera vez que ecx es 0, los primeros datos se cargan en DL.
1000B808 32D0 xor dl,al AL es el OR exclusivo de los bits altos y bajos de la longitud, aquí está 3
1000B80A F6D2 not dl DL=NOT ([datos] xor [indicador de segmento de datos] El bit alto de la longitud inc ecx
1000B810 3BCF cmp ecx,edi
1000B812 72 F1 jb short BasicCtr.1000B805
1000B814 8B5D C4 mov ebx,dword ptr ss:[ebp- 3C] La variable local [ebp-3C] almacena el puntero a la longitud del segmento de datos
1000B817 57 push edi EDI es la longitud del bit de bandera
1000B818 56 push esi ESI es el puntero para descifrar el puntero a los datos posteriores, como AST. g. AST
1000B819 8D4D E8 lea ecx,dword ptr ss:[ebp-18] La variable local [ebp-18] es un puntero de datos después de la conversión de tipo forzada, como AST
1000B81C E8 5B430000 llame a
1000B821 8365 FC 00 y dword ptr ss: [ebp-4],0 variable local [ebp-4] cleared
1000B825 6A FC push -4
1000B827 58 pop eax EAX=-4= FFFFFFFC
1000B828 8BF3 mov esi, ebx ebx guarda el puntero que apunta a la longitud de la parte de datos de los datos segmento
1000B82A 2BC7 sub eax,edi EAX=EAX-EDI=FFFFFFFC-3=FFFFFFF9
1000B82C 8B1E mov ebx,dword ptr ds: [esi] ebx ahora es la longitud de la parte de datos en el segmento de datos
1000B82E 0145 08 add dword ptr ss:[ebp+8],eax primera vez,[EBP+8]=33.
Después de la ejecución = 2C, equivalente a 33H-7H = 2CH
1000B831 83C6 04 agregue esi,4 ESI ahora apunta a la parte de datos del segmento de datos
1000B834 395D 08 cmp dword ptr ss:[ebp +8] ,ebx [ebp+8]=2C, ebx=4
1000B837 0F82 6A010000 jb BasicCtr.1000B9A7
1000B83D 807D E4 07 cmp byte ptr ss:[ebp-1C ],7 La variable local [ebp-1C] guarda el tipo de este segmento, 4 o 7
1000B841 74 06 je short BasicCtr.1000B849
1000B843 807D E4 06 cmp byte ptr ss :[ebp- 1C],6 Si el tipo no es 6, ejecute 1000B862
1000B847 75 19 jnz short BasicCtr.1000B862
1000B849 8AC3 mov al,bl Si el tipo de El segmento de datos es 7, ejecute esta declaración. BL contiene la longitud del segmento de datos
1000B84B 33FF xor edi,edi
1000B84D 32C7 xor al,bh al= (el bit bajo de la longitud xor el bit alto de la longitud )
1000B84F 85DB test ebx,ebx
1000B851 76 0F jbe short BasicCtr.1000B862 Si la longitud es 0, no hay contraseña
1000B853 8A0C37 mov cl ,byte ptr ds:[edi+esi ]
1000B856 32C8 xor cl,al
1000B858 F6D1 not cl DL=NOT ([datos] xor [alto de la longitud del indicador del segmento de datos xor longitud mínima 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 72 F1 jb short BasicCtr.1000B853 Bucle hasta que se demodulen todos los datos
1000B862 53 Empuje la longitud de la cadena de datos ebx.
1000B863 56 push esi Datos sin procesar para convertir
1000B864 8D4D EC lea ecx,dword ptr ss:[ebp-14] Variable local[ebp-14] Guardar conversión de tipo CString forzada El puntero de datos después de, por ejemplo, DB2E0600
1000B867 E8 10430000 llama a CString::CString> 1000B86C 8A45 E4 mov al,byte ptr ss:[ebp-1C] La variable local [ebp-1C] guarda el tipo de este segmento, 4 o 7 1000B86F 295D 08 sub dword ptr ss: [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
1000B874 33FF xor edi,edi
1000B876 84C0 test al,al prueba si el tipo de este segmento de datos es 0
1000B878 C645 FC 01 mov byte ptr ss:[ebp-4], 1 variable booleana local[ebp-4], 1 variable booleana local[ebp-4], 1 1 variable booleana local[ ebp-4]=1
1000B87C 0F86 A3010000 jbe BasicCtr.1000BA25 Si el tipo de datos de este segmento es 0, ejecute 1000BA25 y salga
1000B882 3C 07 cmp al,7 p>
1000B884 0F86 B6000000 jbe BasicCtr.1000B940 Si es menor o igual a 7, salte a 1000B940 para su ejecución. Esto es correcto para EWH
1000B88A 3C 08 cmp al,8
1000B88C 0F84 74010000 je BasicCtr.1000BA06 Si el tipo de datos es 8, salga directamente.
1000B892 3C 09 cmp al,9
1000B894 74 5D je short BasicCtr.1000B8F3
1000B896 3C 0A cmp al,0A
1000B898 0F85 87010000 jnz BasicCtr.1000BA25
1000B89E 8B4D D8 mov ecx,dword ptr ss:[ebp-28] El código para ejecutar este programa cuando el tipo de datos es A
1000B8A1 8D45 D4 lea eax,dword ptr ss:[ebp-2C]
1000B8A4 50 push eax
1000B8A5 E8 47FEFFFF llamada BasicCtr.1000
1000B8AA 8B45 D4 mov eax , dword ptr ss:[ebp-2C]
1000B8AD FF75 EC push dword ptr ss:[ebp-14]
1000B8B0 8B08 mov ecx,dword ptr ds:[
1000B8B2 53 push ebx
1000B8B3 50 push eax
1000B8B4 FF91 BC000000 llamada dword ptr ds:[ecx+BC]
1000B8BA 8BD8 mov ebx , eax
1000B8BC 85DB prueba ebx,ebx
1000B8BE 0F85 12010000 jnz BasicCtr.1000B9D6
1000B8C4 8B45 D4 mov eax,dword ptr ss:[ebp-2C ]
1000B8C7 6A 04 push 4
1000B8C9 8945 DC mov dword ptr ss:[ebp -24],eax
1000B8CC 8D45 DC lea eax,dword ptr ss :[
1000B8CF 50 push eax
1000B8D0 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
1000B8D3 E8 A4420000 llamada
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 llamada
1000B8E5 C645 FC 01 mov byte ptr ss:[ebp- 4 ],1
1000B8E9 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
1000B8EC E8 AB400000 call
1000B8F1 EB 50 jmp corto BasicCtr.1000B943
1000B8F3 8B4D D8 mov ecx,dword ptr ss:[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 call BasicCtr.1000D14D
1000B8FF 8B45 D0 mov eax,dword ptr ss:[ ebp-30]
1000B902 FF75 EC push dword ptr ss:[ebp-14]
1000B905 8B08 mov ecx,dword ptr ds:[
1000B907 53 push ebx p>
p>
1000B908 50 push eax
1000B909 FF51 78 llamada dword ptr ds:[ecx+78]
1000B90C 8BD8 mov ebx,eax
1000B90E 85DB prueba ebx,ebx
1000B910 0F85 D4000000 jnz BasicCtr.1000B9EA
1000B916 8B45 D0 mov eax,dword ptr ss:[ebp-30]
1000B919 6A 04 push 4
1000B91B 8945 DC mov dword ptr ss:[ebp-24],eax
1000B91E 8D45 DC lea eax,dword ptr ss:[ p>
1000B921 50 push eax
1000B922 8D4D BC lea ecx, dword ptr ss:[ebp-44]
1000B925 E8 52420000 llamada CString::CString> 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 llamada 1000B937 C645 FC 01 mov byte ptr ss:[ebp-4],1 1000B93B 8D4D BC lea ecx,dword ptr ss:[ebp-44] 1000B93E EB AC jmp short BasicCtr.1000 1000B932 E8 71400000 llamada 1000B940 6A 01 push 1 Cuando el tipo de segmento de datos es <=7, ejecutar directamente desde aquí 1000B942 5F pop edi 1000B943 8B5D D8 mov ebx,dword ptr ss:[ebp-28] Variable local[ebp-28] Guardar estructura de bandera global 1000B946 8D45 EC lea eax,dword ptr ss:[ebp-14] Variable local[ebp-14 ] Guarde el puntero de datos después de la conversión de tipo forzada, como DB2E0600 1000B946 8D45 EC lea eax,dword ptr ss:[ebp-14] Variable local [ebp-14] Guarde el puntero de datos después de la conversión de tipo forzada , Por ejemplo, DB2E0600 Por ejemplo, DB2E0600 1000B949 50 push eax EAX guarda el puntero de datos después de la conversión de tipo forzada. EAX guarda el puntero de datos después de la conversión de tipo forzada 1000B94A 8D45 E8 lea eax,dword ptr ss:[ebp-18] La variable local [ebp-18] guarda el puntero de datos después de la conversión de tipo forzada, por ejemplo, AST 1000B94D FF75 E4 push dword ptr ss:[ebp-1C] El primer byte de la variable local [ebp-1C] contiene el tipo de segmento, 4 o 7 1000B950 8BCB mov ecx,ebx 1000B952 50 push eax 1000B953 E8 B4FCFFFF llamada BasicCtr.1000B60C llamada 1000B60C(CString,Flag,CString) 1000B958 85FF prueba edi ,edi 1000B95A 74 18 je short BasicCtr.1000B974 1000B95C 8B45 E0 mov eax,dword ptr ss:[ebp-20] variable local[ebp-28] por primera vez 0, es un contador 1000B95F 8B4B 64 mov ecx,dword ptr ds:[ebx+64] En la estructura de la bandera, hay una dirección global 1000B962 8B55 F0 mov edx, dword ptr ss:[ebp-10] La variable local [ebp-10] guarda los datos copiados, es decir: [edi]. e., sin procesar. Por ejemplo, 040300BDAF...... 1000B965 C1E0 02 shl eax,2 EAX=EAX*2 1000B968 891401 mov dword ptr ds:[ecx+eax],edx voluntad Los datos sin procesar sin procesar se colocan en la memoria señalada por el puntero en la estructura global 1000B96B 8B4B 78 mov ecx,dword ptr ds: [ebx+78] existe en la estructura de banderas y es la dirección global 1000B96E 8B55 CC mov edx,dword ptr ss: [ebp-34] La variable local [ebp-34] guarda la longitud total del segmento de datos 1000B971 891401 mov dword ptr ds :[ ecx+eax],edx Coloca la longitud de los datos en la memoria indicada por el puntero en la estructura global 1000B974 8065 FC 00 y byte ptr ss: [ebp-4],0 Variable booleana local [ ebp- 4]=0 1000B978 8D4D EC lea ecx,dword ptr ss:[ebp-14] 1000B97B E8 1C400000 Llamada CString::~CString> Borre la parte del indicador de CString en el segmento de datos, como AST 1000B98C FF45 E0 inc dword ptr ss.[Variable local [ebp-28] Contador más uno 1000B98F 8B45 E0 mov eax,dword ptr ss:[ebp-20] 1000B992 3B45 B8 cmp eax,dword ptr ss:[ebp-48] Variable local [ebp-48] Guarda el número de segmentos de datos 1000B995 0F8C DFFDFFFF jl BasicCtr.1000B77A Demodulación en bucle de cada segmento de datos 1000B99B 8B45 08 mov eax,dword ptr ss:[ebp+8] La longitud del final datos restantes 1000B99E F7D8 neg eax 1000B9A0 1BC0 sbb eax,eax 1000B9A2 83E0 04 y eax,4 1000B9A5 EB 1E jmp short BasicCtr .1000B9C5 1000B9A7 837D F0 00 cmp dword ptr ss:[ebp-10],0 1000B9AB 74 09 je short BasicCtr.1000B9B6 1000B9AD FF75 F0 push dword ptr ss:[ebp-10] 1000B9B0 E8 FF3F0000 call 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 1000B9CB 64: 890D 000000 mov dword ptr fs:[0],ecx 1000B9D2 C9 salir 1000B9D3 C2 0400 retn 4 1000B9D6 837D F0 00 cmp dword ptr ss:[ebp-10],0 1000B9DA 74 09 je short BasicCtr.1000B9E5 1000B9DC FF75 F0 push dword ptr ss:[ebp-10] 1000B9DF E8 D03F0000 call 1000B9E4 59 pop ecx 1000B9E5 8B45 D4 mov eax ,dword ptr ss:[ebp-2C] 1000B9E8 EB 12 jmp short BasicCtr.1000B9FC 1000B9EA 837D F0 00 cmp dword ptr ss:[ebp-10], 0 p> 1000B9EE 74 09 y corto BasicCtr.1000B9F9 100 0B9F0 FF75 F0 push dword ptr ss:[ebp-10] 1000B9F3 E8 BC3F0000 llamada 1000B9F8 59 pop ecx 1000B9F9 8B45 D0 mov eax,dword ptr ss:[ebp-30] 1000B9FC 8B08 mov ecx,dword ptr ds:[ 1000B9FE 50 push eax 1000B9FF FF51 08 llamar dword ptr ds:[ecx+8] 1000BA02 8BF3 mov esi,ebx 1000BA04 EB 03 jmp short BasicCtr.1000BA09 1000BA06 6A 04 push 4 1000BA08 5E pop esi 1000BA09 8065 FC 00 y byte ptr ss:[ebp-4],0