¿Para que sirve?
-Si tenemos un programa trial podremos lanzar el script, luego caducarlo (cambiar la fecha) e ejecutar el script nuevamente, luego de eso comparamos y obtendremos el salto que nos bloquea el acceso al programa.
-Si dumpeamos un programa y tiene detección CRC podemos realizar los pasos comentados anteriormente y obtendremos el salto CRC.
-Si tenemos un serial verdadero podemos obtener el salto que nos considera el serial como válido.
Mejoras:
-Reparado error con 2 opciones activadas al mismo tiempo (filtro bucle con detenerse en address específico, generaban un error que ya está solucionado)
-Log tipo de salto(idea de tinkipinki)
-Anterior versión solo logeaba saltos SHORT, ahora logea JMP NEAR
-Optimizado el código: V1.0=367 lineas V1.2=309 lineas (incluyendo las opciones adicionales)
-Filtrar los saltos SHORT
EDIT:tenía un pequeño error el código cuando lo subí, ahora está editado y funciona correctamente.
Imágenes:
Código de la versión 1.2:
Código
/* -=================================================================- Script realizado por :UND3R Script para : Logear saltos condicionales Configuracion: Saltar todas las excepciones y no tener ningún BP Fecha : 12/10/2011 -=[ Comentario del Script ]=- Ideal para logear todo tipo de saltos condicionales para posteriormente compararlo con otro log con el fin de localizar saltos mágicos -=================================================================- */ VAR AUX_EXIT VAR T_F_N_LOG VAR CONT_LOG_N VAR FILTRO VAR VEIP VAR RESP VAR N_LOGTXT VAR LOG_SALTO VAR VMEMORY VAR VMEMORY2 VAR VMEMORY3 VAR AUX_TS VAR TIPO_SALTO VAR AUX_TS2 VAR LOG_BUCLE1 VAR LOG_BUCLE2 VAR COMP VAR VEIP2 VAR MAX VAR MIN VAR CONT_LOG_N2 VAR CANTI_LOG_SAVE VAR COMPROBAR_SALTO VAR SI_NO VAR VAR_EIP VAR CONT_JUMP VAR LOG_TIPO_SALTO VAR ANTIBUCLE2 VAR ANTIBUCLE1 VAR N_BUCLE1 VAR CONT VAR INF_BUCLE2 VAR INF_BUCLE1 VAR INF_BUCLE VAR VEIP_2 VAR FILTRAR_JMP_SHORT ASK "Introduzca el nombre del archivo a crear EJ: LOG1.TXT" MOV N_LOGTXT,$RESULT EVAL "{N_LOGTXT}" WRT $RESULT, "|N: |ADDRESS:|EIP: |SALTA: |BUCLE: |TIPO SALTO:|" WRTA $RESULT, "|---------------------------------------------------|" PREG_FILTRO: MSGYN "¿Opciones avanzadas?" CMP 1,$RESULT JE AVANZADO TRACE: TICND "byte [EIP] > 6F && byte [EIP] < 80 || byte [EIP+1] > 7F && byte [EIP+1] < 90 && byte [EIP]==0F" CMP RESP,eip JE EXIT1 OPCODE eip MOV LOG_SALTO,$RESULT_1 ALLOC 50 MOV VMEMORY,$RESULT MOV [VMEMORY],LOG_SALTO MOV VMEMORY2,VMEMORY ADD VMEMORY2,2 BUCLE_TS: CMP [VMEMORY2],20,1 JNE INC_VMEMORY2 MOV VMEMORY3,VMEMORY2 COMP_SHORT: INC VMEMORY3 MOV AUX_TS,[VMEMORY3],5 CMP AUX_TS,"SHORT" JE SALTO_TIPO1 SALTO_TIPO2: SUB VMEMORY2,VMEMORY MOV TIPO_SALTO,[VMEMORY],VMEMORY2 STR TIPO_SALTO FREE VMEMORY JMP TRACE0 SALTO_TIPO1: ADD VMEMORY3,5 MOV AUX_TS2,[VMEMORY3],1 CMP AUX_TS2,2E JE SALTO_TIPO2 SUB VMEMORY3,VMEMORY MOV TIPO_SALTO,[VMEMORY],VMEMORY3 LOG TIPO_SALTO FREE VMEMORY CMP FILTRAR_JMP_SHORT,1 JE TRACE JMP TRACE0 INC_VMEMORY2: INC VMEMORY2 JMP BUCLE_TS TRACE0: CMP eip,VEIP JE CONT_BUCLE MOV LOG_BUCLE1,0 MOV LOG_BUCLE2,0 TRACE1: OPCODE eip MOV VEIP,eip MOV VEIP2,VEIP ADD VEIP2,$RESULT_2 STI CMP FILTRO,1 JNZ TRACE2 CMP eip,MAX JA TRACE2 CMP eip,MIN JAE TRACE TRACE2: CMP LOG_BUCLE1,1 JNE TRACE3 MOV LOG_BUCLE2,"!" TRACE3: INC CONT_LOG_N ITOA CONT_LOG_N, 10. MOV CONT_LOG_N2,$RESULT CMP T_F_N_LOG,1 JNE TRACE4 CMP CONT_LOG_N2,CANTI_LOG_SAVE JE EXIT2 TRACE4: CMP VEIP2,eip JE NO SI: MOV COMPROBAR_SALTO,1 MOV SI_NO,"SI" JMP LOG_COMPR_TXT NO: MOV COMPROBAR_SALTO,0 MOV SI_NO,"NO" LOG_COMPR_TXT: EVAL "|{CONT_LOG_N2}" MOV CONT_LOG_N2,$RESULT LOG_COMPR_TXT_: LEN CONT_LOG_N2 CMP $RESULT,6 JNE INC_LOG_COMPR_TXT ADD CONT_LOG_N2,"|" EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_LOG_N2 LOG_CMPR_TXT2: EVAL "{VEIP}" MOV VEIP_2,$RESULT LOG_CMPR_TXT2_: LEN VEIP_2 CMP $RESULT,8 JNE INC_LOG_CMPR_TXT2 ADD VEIP_2,"|" EVAL "{N_LOGTXT}" WRTA $RESULT,VEIP_2,"" LOG_CMPR_TXT3: EVAL "{eip}" MOV VAR_EIP,$RESULT LOG_CMPR_TXT3_: LEN VAR_EIP CMP $RESULT,8 JNE INC_LOG_CMPR_TXT3 ADD VAR_EIP,"|" EVAL "{N_LOGTXT}" WRTA $RESULT,VAR_EIP,"" LOG_CMPR_TXT4: EVAL "{SI_NO} |{LOG_BUCLE2} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" CMPR_LEN_TS: LEN TIPO_SALTO CMP $RESULT,B JNE INC_LEN_TS EVAL "{TIPO_SALTO}|" MOV LOG_TIPO_SALTO,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,LOG_TIPO_SALTO,"" CMP AUX_EXIT,1 JE LOG_COMPR_TXT2 JMP TRACE LOG_COMPR_TXT2: JMP EXIT STOP: BPHWS RESP, "x" JMP FILTRO EXIT1: BPHWC RESP EXIT: EVAL "{N_LOGTXT}" WRTA $RESULT,"`---------------------------------------------------´" ret EXIT2: MOV AUX_EXIT,1 JMP TRACE4 AVANZADO: MSGYN "¿Detener en Nº cantidad de datos logeados?" CMP 0,$RESULT JE AVANZADO2 N_LOG_SAVE: ASK "Introduzca número de datos a logear:" MOV CANTI_LOG_SAVE,$RESULT ITOA CANTI_LOG_SAVE MOV CANTI_LOG_SAVE,$RESULT MOV T_F_N_LOG,1 JMP FILTRO AVANZADO2: MSGYN "¿Detener log en address determinado?" CMP 0,$RESULT JE FILTRO BP_ADDRESS: ASK "Introduzca la dirección en donde desea detener el log" MOV RESP,$RESULT CMP RESP,0 JNE STOP FILTRO: MSGYN "¿Excluir en el log rango de address?" CMP 0,$RESULT JE FILTRO_JMP FILTRO2: MOV FILTRO,1 ASK "Introduzca el rango a excluir,desde:" MOV MIN,$RESULT ASK "hasta:" MOV MAX,$RESULT FILTRO_JMP: MSGYN "¿Excluir saltos SHORT?" CMP 0,$RESULT JE ANTIBUCLE MOV FILTRAR_JMP_SHORT,1 ANTIBUCLE: MSGYN "¿Log inteligente (evita bucle's)?" CMP 0,$RESULT JE OLLYH ANTIBUCLE2: MOV ANTIBUCLE1,1 ASK "Nº de veces que debe repetirse un salto para ser considerado bucle" MOV N_BUCLE1,$RESULT OLLYH: MSGYN "¿Ocultar OllyDBG mientras se ejecuta el script?" CMP $RESULT,0 JE GOTRACE DBH GOTRACE: JMP TRACE CONT_BUCLE: INC CONT MOV LOG_BUCLE1,1 CMP CONT,N_BUCLE1 JE SALTAR_BUCLE JMP TRACE1 SALTAR_BUCLE: CMP COMPROBAR_SALTO,0 JE NO_SALTA_BUCLE SI_SALTA_BUCLE: MOV INF_BUCLE2,VEIP2 JMP BUCLE2 NO_SALTA_BUCLE: MOV INF_BUCLE,VEIP ADD INF_BUCLE,1 MOV INF_BUCLE,[INF_BUCLE],1 MOV INF_BUCLE2,eip ADD INF_BUCLE2,INF_BUCLE ADD INF_BUCLE2,2 CMP INF_BUCLE,7F JBE BUCLE2 SUB INF_BUCLE2,100 BUCLE2: EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!------------------" MOV CONT_JUMP,$RESULT BUCLE2_: LEN CONT_JUMP CMP $RESULT,34 JNE INC_BUCLE2 ADD CONT_JUMP,"|" EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP BUCLE_CONT_: BP INF_BUCLE2 RUN CMP INF_BUCLE2,eip JNE ERROR1 BC INF_BUCLE2 MOV CONT,0 MOV LOG_BUCLE1,0 MOV LOG_BUCLE2,0 JMP TRACE INC_LEN_TS: ADD TIPO_SALTO," " JMP CMPR_LEN_TS INC_BUCLE2: ADD CONT_JUMP,"-" JMP BUCLE2_ INC_LOG_CMPR_TXT3: ADD VAR_EIP," " JMP LOG_CMPR_TXT3_ INC_LOG_CMPR_TXT2: ADD VEIP_2," " JMP LOG_CMPR_TXT2_ INC_LOG_COMPR_TXT: ADD CONT_LOG_N2," " JMP LOG_COMPR_TXT_ ERROR1: MSG "Error inesperado #1" RET
Versión V1.0
Este script como el título lo dice se encarga de logear todos los diferentes tipos de saltos condicionales hasta un cierto punto especificado por el usuario y los guarda en un documento de texto (archivo log) indicando el address en donde estaba el salto,si se realizó el salto o no y si se realizó indica hacia donde salto, esto puede ser útil para encontrar comprobaciones CRC, antidump de tamaño o detección de si el programa está siendo ejecutado bajo una máquina virtual, la idea es generar dos log
EJ: archivo desempaqueta=Log1 archivo empaquetado=Log2, ambos detenidos en el OEP, de esta forma con algún comparador de textos podremos ver que salto tienen de diferencia siendo este el posible causante de las detecciones mencionadas anteriormente.
Imágen de logs:
Nº=el número de log, este es el que se debe especificar dentro de las opciones si se quiere detener en N cantidad de log especificado.
ADDRESS=Indica en donde está el salto encontrado
EIP=Indica la ubicación luego de que se ejecutó el salto
BUCLE=!: indica que se está repitiendo un salto
0:Indica que NO se está repitiendo el salto
SALTA: SI/NO este es la acción más importante del script
*En esta imagen muestra la detección de un bucle, para evitar que se repita en el log, con la opción de log inteligente en vez de ver los address repetidos, veremos una alerta
-Nombre del .txt:
El script en primera instancia nos preguntará con que nombre queremos guardar el log
-Opciones avanzadas:
Si no optamos por esta opción el script comenzará a logear todos
-Detener en Nº cantidad de datos logeados:
Esta opción nos da la posibilidad de que el script se detenga en una cierta cantidad de números de registro.
-Detener en un determinado address:
Si queremos detener el script en un cierto address
-Excluir en el log rango de address:
Nos da la posibilidad de poder excluir un rango de address, estas no serán mostradas en el log, ideal para excluir los saltos de las API'S si elegimos esta opción nos preguntara desde donde queremos que excluya y hasta que address
-Log inteligente:
esta opción evita bucles ideal para evitar tener repetidos datos en el log que pueden estorbar la comparación, si elegimos esta opción nos preguntará cuantas veces debe pasar el programa por un mismo salto para que sea considerado bucle
*Recomendación:4
*Actualmente no considera como bucle en donde un salto salta a otro salto
-Ocultar OllyDBG mientras se ejecuta el script:
esta opción habilita el comando DBGH
SCRIPT:
Código
/* -=================================================================- Script realizado por :UND3R Script para : Logear saltos condicionales Configuracion: Saltar todas las excepciones y no tener ningún BP Fecha : 12/10/2011 -=[ Comentario del Script ]=- Ideal para logear todo tipo de saltos condicionales para posteriormente compararlo con otro log con el fin de localizar saltos mágicos -=================================================================- */ VAR INFO_N4 VAR STR_4 VAR STR_2 VAR STR_1 VAR INFO_N3 VAR INFO_N2 VAR INFO_N VAR CONT_LOG_N2 VAR AUX_EXIT VAR T_F_N_LOG VAR CANTI_LOG_SAVE VAR CONT_LOG_N VAR SI_NO VAR CONT_JUMP VAR N_LOGTXT VAR LOG_BUCLE2 VAR LOG_BUCLE1 VAR COMPROBAR_SALTO VAR INF_BUCLE2 VAR INF_BUCLE VAR N_BUCLE1 VAR CONT VAR ANTIBUCLE1 VAR FILTRO VAR MIN VAR MAX VAR COMP VAR RESP VAR VEIP2 VAR VEIP ASK "Introduzca el nombre del archivo a crear EJ: LOG1.TXT" MOV N_LOGTXT,$RESULT EVAL "{N_LOGTXT}" WRT $RESULT, "|N: |ADDRESS:|EIP: |BUCLE: |SALTA: |" WRTA $RESULT, "|---------------------------------------|" PREG_FILTRO: MSGYN "¿Opciones avanzadas?" CMP 1,$RESULT JE AVANZADO TRACE: TICND "byte [EIP] > 6F && byte [EIP] < 80" CMP RESP,eip JE EXIT1 CMP eip,VEIP JE CONT_BUCLE MOV LOG_BUCLE1,0 MOV LOG_BUCLE2,0 TRACE1: MOV COMP,[eip],1 CMP COMP,70 JB TRACE CMP COMP,7F JA TRACE OPCODE eip MOV VEIP,eip MOV VEIP2,VEIP ADD VEIP2,$RESULT_2 STI CMP FILTRO,1 JNZ TRACE2 CMP eip,MAX JA TRACE2 CMP eip,MIN JAE TRACE TRACE2: CMP LOG_BUCLE1,1 JNE TRACE3 MOV LOG_BUCLE2,"!" TRACE3: INC CONT_LOG_N ITOA CONT_LOG_N, 10. MOV CONT_LOG_N2,$RESULT CMP T_F_N_LOG,1 JNE TRACE4 CMP CONT_LOG_N2,CANTI_LOG_SAVE JE EXIT2 TRACE4: CMP VEIP2,eip JE NO SI: MOV COMPROBAR_SALTO,1 MOV SI_NO,"SI" JMP LOG_COMPR_TXT NO: MOV COMPROBAR_SALTO,0 MOV SI_NO,"NO" LOG_COMPR_TXT: LEN CONT_LOG_N2 MOV INFO_N,$RESULT CMP INFO_N,1 JE LOG_CMPR_TXT_1 CMP INFO_N,2 JE LOG_CMPR_TXT_2 CMP INFO_N,3 JE LOG_CMPR_TXT_3 CMP INFO_N,4 JE LOG_CMPR_TXT_4 CMP INFO_N,5 JE LOG_CMPR_TXT__5 JMP ERROR2 LOG_CMPR_TXT_1: EVAL "|{CONT_LOG_N2} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP JMP LOG_CMPR_TXT2 LOG_CMPR_TXT_2: EVAL "|{CONT_LOG_N2} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP JMP LOG_CMPR_TXT2 LOG_CMPR_TXT_3: EVAL "|{CONT_LOG_N2} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP JMP LOG_CMPR_TXT2 LOG_CMPR_TXT_4: EVAL "|{CONT_LOG_N2} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP JMP LOG_CMPR_TXT2 LOG_CMPR_TXT__5: EVAL "|{CONT_LOG_N2}|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP LOG_CMPR_TXT2: ITOA VEIP MOV STR_1,$RESULT LEN STR_1 MOV INFO_N2,$RESULT CMP INFO_N2,5 JE LOG_CMPR_TXT_5 CMP INFO_N2,6 JE LOG_CMPR_TXT_6 CMP INFO_N2,7 JE LOG_CMPR_TXT_7 CMP INFO_N2,8 JE LOG_CMPR_TXT_8 JMP ERROR3 LOG_CMPR_TXT_5: EVAL "{VEIP} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" JMP LOG_CMPR_TXT3 LOG_CMPR_TXT_6: EVAL "{VEIP} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" JMP LOG_CMPR_TXT3 LOG_CMPR_TXT_7: EVAL "{VEIP} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" JMP LOG_CMPR_TXT3 LOG_CMPR_TXT_8: EVAL "{VEIP}|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" LOG_CMPR_TXT3: ITOA eip MOV STR_2,$RESULT LEN STR_2 MOV INFO_N3,$RESULT CMP INFO_N3,5 JE LOG_CMPR_TXT2_5 CMP INFO_N3,6 JE LOG_CMPR_TXT2_6 CMP INFO_N3,7 JE LOG_CMPR_TXT2_7 CMP INFO_N3,8 JE LOG_CMPR_TXT2_8 JMP ERROR4 LOG_CMPR_TXT2_5: EVAL "{eip} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" JMP LOG_CMPR_TXT4 LOG_CMPR_TXT2_6: EVAL "{eip} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" JMP LOG_CMPR_TXT4 LOG_CMPR_TXT2_7: EVAL "{eip} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" JMP LOG_CMPR_TXT4 LOG_CMPR_TXT2_8: EVAL "{eip}|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" LOG_CMPR_TXT4: EVAL "{LOG_BUCLE2} |{SI_NO} |" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP,"" CMP AUX_EXIT,1 JE LOG_COMPR_TXT2 JMP TRACE LOG_COMPR_TXT2: JMP EXIT STOP: BPHWS RESP, "x" JMP FILTRO EXIT1: BPHWC RESP EXIT: EVAL "{N_LOGTXT}" WRTA $RESULT,"`---------------------------------------´" ret EXIT2: MOV AUX_EXIT,1 JMP TRACE4 AVANZADO: MSGYN "¿Detener en Nº cantidad de datos logeados?" CMP 0,$RESULT JE AVANZADO2 N_LOG_SAVE: ASK "Introduzca número de datos a logear:" MOV CANTI_LOG_SAVE,$RESULT ITOA CANTI_LOG_SAVE MOV CANTI_LOG_SAVE,$RESULT MOV T_F_N_LOG,1 JMP FILTRO AVANZADO2: MSGYN "¿Detener log en address determinado?" CMP 0,$RESULT JE FILTRO BP_ADDRESS: ASK "Introduzca la dirección en donde desea detener el log" MOV RESP,$RESULT CMP RESP,0 JNE STOP FILTRO: MSGYN "¿Excluir en el log rango de address?" CMP 0,$RESULT JE ANTIBUCLE FILTRO2: MOV FILTRO,1 ASK "Introduzca el rango a excluir,desde:" MOV MIN,$RESULT ASK "hasta:" MOV MAX,$RESULT ANTIBUCLE: MSGYN "¿Log inteligente (evita bucle's)?" CMP 0,$RESULT JE OLLYH ANTIBUCLE2: MOV ANTIBUCLE1,1 ASK "Nº de veces que debe repetirse un salto para ser considerado bucle" MOV N_BUCLE1,$RESULT OLLYH: MSGYN "¿Ocultar OllyDBG mientras se ejecuta el script?" CMP $RESULT,0 JE GOTRACE DBH GOTRACE: JMP TRACE CONT_BUCLE: INC CONT MOV LOG_BUCLE1,1 CMP CONT,N_BUCLE1 JE SALTAR_BUCLE JMP TRACE1 SALTAR_BUCLE: CMP COMPROBAR_SALTO,0 JE NO_SALTA_BUCLE SI_SALTA_BUCLE: MOV INF_BUCLE2,VEIP2 JMP BUCLE2 NO_SALTA_BUCLE: MOV INF_BUCLE,VEIP ADD INF_BUCLE,1 MOV INF_BUCLE,[INF_BUCLE],1 MOV INF_BUCLE2,eip ADD INF_BUCLE2,INF_BUCLE ADD INF_BUCLE2,2 CMP INF_BUCLE,7F JBE BUCLE2 SUB INF_BUCLE2,100 BUCLE2: ITOA VEIP MOV STR_4,$RESULT LEN STR_4 MOV INFO_N4,$RESULT CMP INFO_N4,5 JE BUCLE_5 CMP INFO_N4,6 JE BUCLE_6 CMP INFO_N4,7 JE BUCLE_7 CMP INFO_N4,8 JE BUCLE_8 BUCLE_5: EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!---------|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP JMP BUCLE_CONT_ BUCLE_6: EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!--------|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP BP INF_BUCLE2 JMP BUCLE_CONT_ BUCLE_7: EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!-------|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP JMP BUCLE_CONT_ BUCLE_8: EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!------|" MOV CONT_JUMP,$RESULT EVAL "{N_LOGTXT}" WRTA $RESULT,CONT_JUMP BUCLE_CONT_: BP INF_BUCLE2 EOB COMPROBAR RUN COMPROBAR: CMP INF_BUCLE2,eip JNE ERROR1 BC INF_BUCLE2 MOV CONT,0 MOV LOG_BUCLE1,0 MOV LOG_BUCLE2,0 JMP TRACE ERROR1: MSG "Error inesperado #1" RET ERROR2: MSG "Los datos registrados exceden la cantidad máxima permitida" RET ERROR3: MSG "Error inesperado #2" RET ERROR4: MSG "Error inesperado #3" RET
Si no lo entendieron bien, les pido que lo utilicen y notarán que no es nada complicado de entender.
Saludos UND3R
PD: otra funcionalidad puede ser encontrar el salto decisivo de un programa teniendo un serial correcto.