Mi pregunta es bastante simple: usted es un archivo ejecutable que muestra "Acceso otorgado" o "Acceso denegado" y las personas malvadas intentan comprender su algoritmo o parchear sus entrañas para hacer que diga "Acceso otorgado" todo el tiempo.Binarios autovalidantes?
Después de esta introducción, es posible que se pregunte qué estoy haciendo. ¿Va a descifrar Diablo3 una vez que salga? Puedo pacificar tus preocupaciones, no soy una de esas galletas. Mi objetivo es crackmes.
Puede encontrar Crackmes en, por ejemplo, www.crackmes.de. Un Crackme es un pequeño ejecutable que (la mayoría de las veces) contiene un pequeño algoritmo para verificar una serie y muestra "Acceso otorgado" o "Acceso denegado" según el número de serie. El objetivo es hacer que este resultado ejecutable sea "Acceso otorgado" todo el tiempo. Los métodos que puede usar pueden estar restringidos por el autor (sin parches, sin desmontar) o involucrar todo lo que pueda hacer con un editor binario, objdump y hexadecimal. Cracking crackmes es una parte de la diversión, sin embargo, como programador, me pregunto cómo se pueden crear crackmes que son difíciles.
Básicamente, creo que el crackme consta de dos partes principales: una cierta verificación en serie y el código que lo rodea.
Es muy posible hacer la verificación en serie difícil de rastrear simplemente usando el ensamblaje, por ejemplo, tengo la idea de tomar la serie como entrada para un microprocesador simulado que debe terminar en cierto estado para obtener el serial aceptado. Por otro lado, uno puede crecer barato y aprender más sobre las formas criptográficas fuertes para asegurar esta parte. Por lo tanto, hacer esto lo suficientemente difícil como para hacer que el atacante intente parchear el ejecutable no debe ser el t difícil.
Sin embargo, la parte más difícil es asegurar el binario. Supongamos una verificación en serie perfectamente segura que no se puede revertir de alguna manera (por supuesto que sé que se puede revertir, en la duda, se arrancan partes del binario que intentas crackear y se lanzan seriales al azar hasta que acepte). ¿Cómo podemos evitar que un atacante anule saltos en el binario para que nuestro binario acepte algo?
He estado buscando en este tema un poco, pero la mayoría de los resultados en seguridad binaria, binarios de autoverificación y cosas así terminan en artículos que intentan prevenir ataques en un sistema operativo utilizando binarios comprometidos. al firmar ciertos binarios y validar esas firmas con el kernel.
Mis pensamientos actualmente consisten en:
- comprobar localizaciones explícitas en el binario para ser saltos.
- suma de comprobación de partes del código binario y compare las sumas de control calculadas en tiempo de ejecución con esas.
- tienen comprobaciones de tiempo de ejecución positivas y negativas para sus funciones en el código. Con efectos secundarios en la verificación serial. :)
¿Puedes pensar en más formas de molestar a un posible atacante por más tiempo? (por supuesto, no puede mantenerlo alejado para siempre, cuando se rompan todos los controles, a menos que logre romper un generador de suma de control al poder insertar la suma de verificación correcta para un programa en el programa mismo, jeje)
Sí, para software comercial, estoy totalmente de acuerdo. La inclusión de capas y capas de autovalidación simplemente hará que las cosas sean demasiado complicadas, imposibles de mantener y simplemente molestas. Pero esto no es para software comercial, es un juego, y el objetivo es gastar mucho esfuerzo de un lado. – Tetha