En el siguiente ejemplo luego de crear una aplicación .NET
con el sgte code:
Código
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Management; namespace Crack_Me { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.ToUpper() == "KODELIVE") MessageBox.Show("Clave Correcta", "Clave Correcta", MessageBoxButtons.OK, MessageBoxIcon.Information); else MessageBox.Show("Clave Incorrecta", "Vuelva a Intentarlo", MessageBoxButtons.OK, MessageBoxIcon.Stop); } private void button2_Click(object sender, EventArgs e) { using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Processor")) { using (ManagementObjectCollection manColl = searcher.Get()) { string sProcesador = ""; foreach (ManagementObject obj in manColl) { sProcesador = (string)obj["ProcessorID"]; } if (textBox2.Text.Trim() == psMD5(sProcesador.Trim() + "xComplicar")) { f2.ShowDialog(); } else MessageBox.Show("Clave Incorrecta", "Vuelva a Intentarlo", MessageBoxButtons.OK, MessageBoxIcon.Stop); } } } private string psMD5(string sProc) { System.Security.Cryptography.MD5CryptoServiceProvider cryMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] bProc = System.Text.Encoding.ASCII.GetBytes(sProc); bProc = cryMD5.ComputeHash(bProc); string sMD5 = ""; for (int i = 0; i < bProc.Length; i++) sMD5 += bProc[i].ToString("x4").ToLower(); return sMD5; } private void Form1_Load(object sender, EventArgs e) { this.Icon = Properties.Resources.rIcono; } } }
La cual en el button1 compara una cadena con el contenido del textbox1 para indicar si la clave es correcta o no.
En el button2 obtenemos el ID del procesador y ciframos utilizando MD5CryptoServiceProvider, luego comparamos el contenido del textbox2 con el resultado del cifrado si son iguales abrirá el form2 caso contrario mostrará un mensaje de error.
Ahora necesitamos las siguientes herramientas:
ilasm.exe
http://msdn.microsoft.com/en-us/library/496e4ekx%28VS.80%29.aspx
ildasm.exe
http://msdn.microsoft.com/es-es/library/f7dy01k1%28VS.80%29.aspx
para facilitarnos las cosas creamos un par de archivos .bat (las rutas están de acuerdo a win XP probar modificaciones en Win7 o similar) con el siguiente contenido:
Desensamblador.bat
Código
@echo off cd "%PROGRAMFILES%\Microsoft Visual Studio 8\SDK\v2.0\Bin\" ildasm.exe /source "%HOMEPATH%\Escritorio\Crack Me.exe" /output:"%HOMEPATH%\Escritorio\prueba\Crack Me.il" ildasm.exe /source "%HOMEPATH%\Escritorio\Crack Me.exe"
Utilizando ildasm.exe desensamblamos el Crack Me.exe (ubicado en el escritorio) direccionado a una carpeta en el escritorio con el nombre "prueba", luego abrimos el Crack Me.exe con ildasm.exe para ver su estructura.
Haciendo doble click sobre el button1_Click podemos ver las cadenas que indican cuando tiene la clave correcta y cuando no la tiene.
Antes de ellas podemos ver la comparación que realiza para indicar si es la clave correcta, tb podemos ver la cadena que compara en este caso "KODELIVE".
Entramos en la carpeta prueba y abrimos con el block de notas "Crack Me.il" (nombre que pusimos en el Desensamblador.bat como archivo de salida) para facilitar las cosas copiamos la cadena "KODELIVE" o "Clave Correcta" o "bool [mscorlib]System.String::op_Equality(string" para utilizarla en el buscador del notepad (Ctrl + B) y modificamos las líneas que queramos.
En la línea:
Código
IL_0010: ldstr "KODELIVE"
la cambiamos por:
Código
IL_0010: ldstr "CRACKEADO"
así el nuevo password que compara será "CRACKEADO", ya no será "KODELIVE".
Si queremos que acepte cualquier password, en la línea:
Código
IL_0015: call bool [mscorlib]System.String::op_Equality(string,
cambiamos a:
Código
IL_0015: call bool [mscorlib]System.String::op_Inequality(string,
así cualquier contenido que tenga o no tenga el textbox1 nos dará siempre "Clave Correcta" excepto si es la clave que anteriormente era correcta ("KODELIVE" o "CRACKEADO") es decir en lugar de comparar si son iguales compara si son diferentes.
Ahora necesitamos guardar los cambios hechos en "Crack Me.il" en un nuevo ejecutable, para ello usamos:
Ensamblador.bat
Código
@echo off cd %windir%\Microsoft.NET\Framework\v2.0.50727\ ilasm.exe /exe "%HOMEPATH%\Escritorio\prueba\Crack Me.il"
Ahora obtenemos un nuevo ejecutable con las modificaciones hechas que se guarda en la carpeta prueba con el nombre Crack Me.exe.
Ahora veamos la segunda parte (button2), la cual compara el ID del procesador cifrado con MD5 con el contenido del textbox2, borramos el contenido de la carpeta prueba (en el escritorio) y repetimos los pasos con el Desensamblador.bat, en este caso hacemos doble click en button2.
Localizamos la comparación en el ildasm.exe
Y luego la buscamos en "Crack Me.il", cambiamos la linea:
Código
IL_007d: call bool [mscorlib]System.String::op_Equality(string,
por:
Código
IL_007d: call bool [mscorlib]System.String::op_Inequality(string,
y el resultado es el mismo que en el button1, volvemos a ensamblarlo con Ensamblador.bat y obtenemos el nuevo ejecutable modificado (en la carpeta prueba).
Ahora ambos botones funcionan con o sin password que no sea el original.
Si necesitamos saber cómo se genera el password o la clave basta con ver las líneas antes del mensaje de "Clave incorrecta" y podemos realizar un pequeño keygen para la aplicación "victima".
Ahora supongamos que el primer formulario solo es de validación para luego entrar al 2do, podemos hacer que entre directamente al 2do formulario saltándonos el primero definitivamente, del sgte modo:
Volvemos a utilizar Desensamblador.bat y localizamos:
es aquí donde se define que formulario carga al inicio (Program.cs) localizamos esta línea:
Código
IL_000b: newobj instance void Crack_Me.Form1::.ctor()
y luego la buscamos en "Crack Me.il" para reemplazarla con:
Código
IL_000b: newobj instance void Crack_Me.Form2::.ctor()
Utilizamos nuevamente Ensamblador.bat y el resultado obvio es que carga directamente el formulario2 (Form2) y ya no carga el form1 para la validación del password.
Los nombres de Form1, Form2 obviamente cambian según la aplicación que abramos, tan solo es buscar la organización, nombres y métodos que utiliza.
El cambiar algunos de los recursos que utiliza puede hacerse modificando el *.res de la aplicación.
Asi nos evitamos estar buscando cracks o adquiriendo aplicaciones como Dis# que viendo cómo funciona supongo que debe basarse en estas 2 herramientas.
Obtenemos un mayor aprendizaje de la plataforma .NET y mejoras en cuanto al nivel de protección.
Quería mostrar esto puesto que lo utilicé para obtener el algoritmo de validación para facturas de cierto país, aunque el mismo utilizaba Salamander .NET obfuscator no fue difícil obtener dicho algoritmo y ...
Bueno, lo que muestro es la parte sencilla, la parte interesante es automatizar todo este trabajo para modificar triales y demás basados en .NET en cuestión de segundos (eso porque ya tengo comprador para dicha aplicación), pero comparto el inicio del proyecto por si alguien quiere realizarlo por su cuenta.
Adjunto el proyecto y los archivos de ejemplo (descomprimir en el escritorio para un funcionamiento directo).
Descarga:
http://www.4shared.com/file/dHWAGETI/CrackNET.html