Diez consejos para enseñarte a descifrar software (recomendado por Kanxue Forum)
Diez consejos para enseñarte a descifrar software
A continuación se habla de algunos De los pasos en el proceso de aprender a descifrar, hablaré brevemente sobre los problemas que encuentro a menudo según mi propia experiencia. Estos problemas suelen ser muy difíciles de entender para los principiantes. Según mi propia experiencia de aprendizaje, si sigues directamente muchos tutoriales para aprender, probablemente te confundirás porque hay muchos. O no tengo muy claro el concepto o no. No sé qué es en absoluto, así que espero que la siguiente discusión pueda ayudarlo:
1. Punto de interrupción
El llamado punto de interrupción El punto es dónde está el programa. interrumpido, un término que es muy familiar para los descifradores. Entonces ¿qué es una interrupción? Una interrupción es cuando ocurre un evento especial (evento de interrupción) La computadora suspende la tarea actual (es decir, el programa), cambia para realizar otra tarea (rutina de servicio de interrupción) y luego regresa a la tarea original para continuar con la ejecución. Por ejemplo: estás en el trabajo, y de repente te llama un compañero para decirte que viene en tren desde fuera de la ciudad y quiere que lo recojas en la estación de tren. Luego le pides una licencia temporal a tu jefe, corres a la estación de tren a recoger a tu compañero, lo tranquilizas y luego regresas a la empresa para seguir trabajando. Este es un proceso de interrupción. Nuestro proceso de descifrado consiste en esperar hasta que el programa obtenga el código de registro que ingresamos y lo interrumpa cuando esté listo para compararlo con el código de registro correcto. Luego analizamos el programa para encontrar el código de registro correcto. Por lo tanto, debemos establecer puntos de interrupción para el programa descifrado, cortarlo en el momento apropiado y rastrear el código de registro del programa para lograr el propósito de descifrarlo.
2. Espacio aéreo
Este es un concepto muy importante, pero también es algo que los principiantes a menudo no entienden. Podemos ver la palabra espacio aéreo en varios artículos sobre craqueo. Si no sabe dónde está el espacio aéreo del programa, no podrá entrar por la puerta de craqueo. Tal vez hayas descifrado algún software, pero fue solo un gato ciego que se encontró con un ratón muerto (yo solía ser así ^_^, ¡y me da vergüenza decirlo ahora!). El llamado espacio aéreo de un programa, para decirlo sin rodeos, es el lugar donde está el programa en sí, es decir, donde se encuentra el código del programa que queremos descifrar. Tal vez se pregunte de inmediato: configuro el punto de interrupción cuando el programa se está ejecutando, ¿por qué no está en el espacio del programa después de la interrupción? Debido a que no existe un patrón fijo para escribir cada programa, si queremos interrumpir el programa cuando queremos ingresar al programa, debemos establecer puntos de interrupción sin depender del programa específico. Es decir, los puntos de interrupción que configuramos deben ser utilizados por cada programa. . a algo. En la era de DOS, básicamente todos los programas trabajaban en programas de interrupción, es decir, casi todos los programas de DOS llamaban a varias interrupciones para completar tareas.
Pero en la era WINDOWS, los programas no tienen el poder de llamar directamente a las interrupciones. El sistema WINDOWS proporciona una plataforma de llamada de funciones del sistema (API). Al igual que los programas DOS se basan en programas de interrupción, los programas WINDOWS sí. basado en API Para lograr diversas funciones al interactuar con el sistema, la configuración del punto de interrupción para el descifrado de software en WINDWOS se basa en funciones API, es decir, cuando el programa llama a una función API, interrumpe su funcionamiento normal y luego la descifra. Por ejemplo, establezca el siguiente punto de interrupción en SOFTICE: bpx GetDlgItemText (obtiene el texto del cuadro de diálogo). Cuando el programa que queremos descifrar llama a GetDlgItemText para leer los datos de entrada, SOFTICE lo intercepta inmediatamente, de modo que el programa descifrado permanece en GetDlgItemText. . Área del programa, y GetDlgItemText está en el área del sistema administrado por el propio WINDWOS. Si cambiamos esta parte del código del programa sin autorización, ¡el desastre será inminente ^_^! Por lo tanto, tenemos que regresar del área del sistema a la ubicación del programa descifrado (es decir, el espacio aéreo del programa) antes de que podamos descifrar el programa. En cuanto a cómo ver el espacio aéreo del programa, consulte el diagrama SOFTICE anterior.
Piénselo: para el segmento de programa al que llama cada programa, ¿es posible que podamos encontrar algo útil allí? (¡Cómo cifrar lo decide el programa en sí, no llamando a las funciones del sistema!)
3. API
Es la abreviatura de Interfaz de programación de aplicaciones, que se denomina interfaz de programación de aplicaciones. en chino, es una gran colección de funciones definidas por el sistema que proporcionan métodos para acceder a las funciones del sistema operativo. La API contiene cientos de funciones llamadas por programas de aplicación. Estas funciones realizan todas las operaciones necesarias relacionadas con el sistema operativo, como la asignación de memoria, la salida a la pantalla y la creación de ventanas. El programa del usuario interactúa con WINDOWS llamando a la interfaz API. qué La capa inferior de dicha aplicación finalmente implementa varias funciones llamando a varias funciones API. Normalmente existen dos formas básicas de API: Win16 y Win32. Win16 es la versión original de 16 bits de la API para Windows 3.1; Win32 es la versión actual de 32 bits de la API para Windows 95/98/NT/ME/2000. Win32 incluye Win16 y es un superconjunto de Win16. Los nombres y el uso de la mayoría de las funciones son los mismos.
La diferencia entre las funciones API de 16 bits y las funciones API de 32 bits radica en la última letra. Por ejemplo, configuramos puntos de interrupción como este: bpx GetDlgItemText, bpx GetDlgItemTextA y bpx GetDlgItemTextW, donde GetDlgItemText es un 16. Función API de bits, GetDlgItemTextA y GetDlgItemTextW son funciones API de 32 bits, mientras que GetDlgItemTextA indica que la función usa bytes únicos y GetDlgItemTextW indica que la función usa bytes dobles. Lo que usamos comúnmente en el craqueo ahora es la función API de un solo byte de Win32, que es una función similar a GetDlgItemTextA. Las otras dos (funciones API de Win16 y API de doble byte de Win32) son relativamente raras. Las funciones de la API de Win32 están incluidas en las bibliotecas de vínculos dinámicos (DLL para abreviar), es decir, incluidas en kernel32.dll, user32.dll, gdi32.dll y comctl32.dll. Es por eso que usamos exp=C en softice: \windows\. system\kernel32.dll y otras líneas de comando importan estas bibliotecas de vínculos dinámicos al software. Porque si no hacemos esto, no podremos interceptar las llamadas a funciones de la API Win32 del sistema.
4. Acerca de la forma en que existe el código de registro en el programa
Durante el proceso de descifrado, buscaremos el lugar en el programa donde se compara el código de registro ingresado con el correcto. código de registro y luego pase Seguimiento y análisis del programa para encontrar el código de registro correcto. Pero el código de registro correcto generalmente existe en el programa en dos formas: explícito e implícito. Para el código de registro que existe explícitamente, podemos verlo directamente en la memoria donde se encuentra el programa. Por ejemplo, podemos verlo directamente en la ventana de datos. de SOFTICE, puede ver un código de registro similar a "297500523" (escrito aleatoriamente aquí. Es más fácil descifrar software con un código de registro explícito; sin embargo, algunos programas de software no nos ingresan directamente el código de registro). código de registro Por ejemplo, es posible convertir el código de registro en un número entero, o dividir el código de registro y luego separar cada código de registro en diferentes lugares para compararlo uno por uno, o ingresar el código de registro debe transformarse en. de alguna manera, y luego verificado usando un programa especial, etc.
En resumen, las aplicaciones utilizarán varios métodos de cálculo complejos para evitar la comparación directa del código de registro. Para dichos programas, generalmente tenemos que trabajar duro para rastrear y analizar cuidadosamente cada función del programa para encontrar el algoritmo de cifrado. y luego puedes descifrarlo. Por supuesto, esto requiere una cierta cantidad de habilidades de programación en ensamblador 8086 y mucha paciencia y energía.
5. Con respecto a los métodos de craqueo de software
Divido los métodos de craqueo en dos categorías, a saber, craqueo completo y craqueo por fuerza bruta. El llamado crack completo es principalmente para aquellos software que necesitan ingresar un código de registro o contraseña. Si podemos encontrar el código de registro correcto rastreando el programa y registrar el software normalmente a través de la función de registro del propio software, este tipo de crack. se llama Completamente crackeado, pero si algún software en sí no proporciona la función de registro, solo proporciona una prueba (DEMO), o el registro no se puede realizar a través del software en sí (por ejemplo, necesita obtener otro programa de registro dedicado, registro a través de INTERNET, etc.), o el software La tecnología de cifrado en sí es relativamente compleja y los crackers de software tienen capacidades, energía y tiempo limitados y no pueden obtener directamente el código de registro correcto. En este momento, debemos modificar el código del programa del software. en sí
6. Acerca de los tutoriales de craqueo Problema de dirección del código del programa
Una parte del código del programa se incluirá en el tutorial de craqueo para ayudar a explicar el método de análisis del programa, como el siguiente. código de programa:
......
0167: 00408033 PUSH 00
0167: 00408035 PUSH EBX
0167: 00408036 LLAME a [USER32!EndDialog]
0167: 0040803C JMP 0040812C
......
La dirección del código en el programa aquí es como 0167: 00408033, y el valor de su segmento de código (es decir, 0167) puede variar según las diferentes computadoras. La diferencia no es necesariamente exactamente la misma, pero el valor de compensación debe ser fijo (es decir, 00408033 permanece sin cambios), así que si ve eso. el valor de la dirección del código del programa en el artículo descifrado es diferente al de su computadora, no crea que ha cometido un error, siempre y cuando el código de su programa sea correcto, no habrá ningún problema.
7. Acerca de cómo establecer puntos de interrupción
Establecer puntos de interrupción correcta y apropiadamente es muy importante para un descifrado rápido y efectivo. Una buena configuración de puntos de interrupción puede permitirnos encontrar rápidamente los segmentos clave del programa que no son apropiados. Los puntos de interrupción provocarán un consumo innecesario de energía durante el descifrado y es posible que ni siquiera puedan interceptar la ejecución del programa.
Pero es difícil decir cuándo usar qué punto de interrupción es más apropiado. Esto requiere que se acumule su propia experiencia. En términos generales, el punto de interrupción universal de bpx hmemcpy es útil para la mayoría del software de código de registro. Para probar este punto de interrupción con más frecuencia (normalmente uso esta configuración de punto de interrupción, es demasiado vago ^_^, jaja...).
Para aquellos software sin código de registro que requieren descifrado por fuerza bruta, normalmente debemos interceptar cuadros de diálogo (como bpx DialogBox) y cuadros de mensajes (como bpx MessageBox(A)). Independientemente del tipo de software, cuando los puntos de interrupción que configuramos no tienen ningún efecto, pruebe bpx lockmytask. La función de este punto de interrupción es interceptar la acción de cualquier tecla. Para configuraciones de puntos de interrupción específicas, consulte "Descifrar puntos de interrupción comunes". Artículo "Configuración".
Además, al descifrar el código de registro, normalmente es necesario ingresar el nombre de usuario y el código de registro. En términos generales, el nombre de usuario y la contraseña se pueden ingresar a voluntad, pero según mi propia experiencia, muchos. El software cambiará el código de registro dígito por dígito para el procesamiento, si ingresa la cadena de números "78787878", al rastrear el programa, no sabremos cuál es el "78" que vimos en ese momento, por lo que. Prefiero usar el método de ingreso del código de registro "12345678", para que pueda saber en qué dígito del código de registro está funcionando el programa. De manera similar, para el software que necesita ingresar un número de serie más largo, ingrese un número de serie como "12345-. 67890-ABCDEF" mejor.
Sin embargo, hay una cosa a la que debe prestar especial atención: el método de entrada del código de registro "12345678" mencionado anteriormente es para interceptar las funciones de la API WIN32. Si a veces es difícil encontrar un punto de avance en el. programa interceptando directamente las funciones API de WIN32. Cuando use el comando "S" para encontrar el nombre de usuario o el código de registro que ingresamos en la memoria, es mejor no usar "12345678" como código de registro, porque es probable que haya muchos cadenas "12345678" en la memoria, por lo que no hay forma de saber qué "12345678" utiliza el programa que queremos descifrar, por lo que debemos elegir un código de registro que no sea fácilmente igual a los datos de la memoria, como : 74747474 (me gusta usarlo, que significa: vete al infierno... Jajaja^_^), el comando de búsqueda correspondiente es: S 30: 0 L FFFFFFFF 74747474. Por supuesto, lo anterior son solo mis hábitos personales. El formulario de entrada específico se puede determinar de acuerdo con mis pasatiempos y hábitos, y no es necesario ceñirme a un modo fijo.
8. Acerca de cómo rastrear el programa
Los principiantes a menudo no saben cómo rastrear el programa cuando comienzan a aprender a descifrarlo, cómo encontrar el lugar de comparación del código de registro y cara a cara Sentirse abrumado por una larga pila de código de programa. Por lo general, se utiliza una subrutina (es decir, CALL ********) dentro del programa de software para verificar si el código de registro que ingresamos es correcto. Para los programas donde el código de registro existe explícitamente, el código de registro ingresado generalmente será y. Introduzca el código de registro correcto en el registro y luego llame a la subrutina de verificación para emitir un juicio y devolver el resultado. El programa de aplicación determina si el registro fue exitoso en función del resultado devuelto por la subrutina.
* ***:******** MOV EAX, [********] (o PUSH EAX, etc.)
** **:****** ** MOV EDX, [********] (o PUSH EDX, etc.)
****: ****** ** LLAMADA ******* *
****:******** PRUEBA EAX, EAX (o PRUEBA AL, AL, o sin esta oración, etc.)
****: ******** JNZ ******** (o JZ ******** y otras formas)
El área de memoria señalada por EAX y EDX es nuestra Ingrese el código de registro y el código de registro correcto. Los registros EAX y EDX aquí se escriben aleatoriamente, o pueden ser ECX, EBX, EDI, ESI, etc. Para programas con un código de registro implícito, aunque el código de registro correcto no se puede ver directamente, la dirección del código de registro ingresado generalmente se ingresa primero en un registro y luego se llama a una subrutina para verificarla. Al descifrarlo, debe ingresar la subrutina. Vaya a analizar el algoritmo de registro.
En resumen, debemos estar alerta cuando veamos una subrutina (call ********) seguida de una instrucción de salto (JNZ ******** o JZ ********), utilice D EAX (o EBX, ECX, EDX, EDI, ESI...etc.) para ver qué está oculto en el área de memoria señalada por el registro.
Una cosa que todos deberían recordarle: cuando vea que se utiliza la siguiente función en un programa, debe prestar atención, es decir, GetDlgItenInt. La función de esta función API es convertir el texto de entrada en un número entero. por lo que no se utilizará en este tipo de programa. El código de registro existente se muestra porque el código de registro se convierte en un número entero. El programa generalmente usa instrucciones CMP ECX y EDX para verificar la exactitud del código de registro. ECX y EDX aquí son el código de registro ingresado y la forma entera del código de registro correcto. En este momento, puede usar ? edx y ? ecx para ver su forma decimal.
9. Respecto al problema de desinstalar software
A menudo nos encontramos con un problema al utilizar cierto software, es decir, después de que el software compartido caduca, incluso si el programa original se elimina y se reinstala. , el programa aún no se puede usar y aún le recuerda que el período de prueba ha expirado, regístrese o ha descifrado un determinado software, pero aún desea continuar estudiándolo, pero debido a que el software se ha registrado, allí; No hay opción de registro en este momento, incluso si Después de eliminar completamente el programa y reinstalar el software, el programa aún estaba registrado después de ejecutarse.
Cuando nos encontramos con una situación así, la razón es realmente muy simple, porque el programa almacena la información de registro o vencimiento en el registro del sistema, por lo que simplemente reinstalar el software no ayudará. La solución es eliminar usted mismo la información relevante del registro. Sin embargo, debido a que el registro es la base para el funcionamiento del sistema WINDOWS, si no tiene cuidado, puede dañarlo y provocar anomalías en el sistema. muy familiarizado con el registro. Debe hacer una copia de seguridad del registro antes de modificarlo.
Ya sea que esté modificando o haciendo una copia de seguridad del registro, puede usar la herramienta de administración de registro "REGEDIT" en WINDOWS. Una forma es ingresar "regedit" en "Start-gt;Run" para iniciarlo. También puede hacer clic directamente en "C:\WINDOWS\regedit.exe" para ejecutarlo. La mayoría del software de aplicación almacenará su propia información en las siguientes rutas: HKEY_LOCAL_MACHINE\Software, HKEY_LOCAL_MACHINE\Software\Microsoft, HKEY_CURRENT_USER\Software, HKEY_CURRENT_USER\Software\Microsoft o HKEY_USERS\.DEFAULT\Software. La ubicación específica depende de la ubicación. Dependiendo del programa, siempre que siga la secuencia anterior, definitivamente podrá encontrar las claves relacionadas con la aplicación y luego eliminar los valores clave relacionados con el nombre de usuario y el código de registro.
10. Preguntas sobre la práctica de craqueo
Aprender a craquear requiere mucha práctica. En cuanto a la elección de los objetivos de craqueo, los principiantes no deben apuntar a software grande y famoso porque este software generalmente está cifrado. más complejo y difícil de descifrar. Debe elegir algún software relativamente desconocido, pequeño y compartido anteriormente para practicar, porque el software con cifrado relativamente simple ayuda a los principiantes a dominar rápidamente las ideas y habilidades de descifrado. En cuanto a los ejercicios, provienen de una amplia gama de fuentes. Puedes descargarlos de Internet o comprar algunos CD de software gratuitos en el mercado.