Este manual es solo con fines educativos y de investigación en seguridad informática. El cracking de software sin autorización es ilegal en la mayoría de jurisdicciones. Úsalo solo en software propio o con permiso explícito del propietario.
El ensamblador (ASM) es fundamental para el cracking ya que permite:
Arquitectura | Uso en Cracking | Herramientas |
---|---|---|
x86 (32-bit) | Software Windows antiguo | OllyDbg, IDA Pro |
x86-64 (64-bit) | Software moderno | x64dbg, WinDbg |
ARM | Móviles, embedded | GDB, Radare2 |
EAX ; Acumulador (valor de retorno)
EBX ; Base (datos)
ECX ; Contador (bucles)
EDX ; Datos (operaciones I/O)
ESI ; Índice fuente (operaciones con cadenas)
EDI ; Índice destino (operaciones con cadenas)
ESP ; Stack pointer
EBP ; Base pointer (marco de stack)
EIP ; Instruction pointer (¡CRÍTICO para cracking!)
mov eax, ebx ; ebx -> eax
cmp eax, 1234 ; Compara eax con 1234 (afecta flags)
jz loc_401000 ; Salta si Zero Flag=1 (resultado fue cero)
jnz loc_401000 ; Salta si Zero Flag=0
call sub_401050 ; Llama a función (push EIP + jump)
retn ; Retorna de función (pop EIP)
push eax ; Guarda eax en el stack
pop ebx ; Recupera valor del stack a ebx
nop ; No operation (útil para parches)
cdecl (C): Parámetros en stack (derecha a izquierda), caller limpia stack
stdcall (WinAPI): Parámetros en stack, callee limpia stack
fastcall: Primeros parámetros en ECX, EDX, resto en stack
; Buscar referencias a strings clave:
; "Invalid license", "Registration", "Wrong serial", etc.
; En OllyDbg: Ctrl+B -> buscar string
; Ejemplo típico de comparación de serial:
mov eax, [ebp+serial_user]
mov ecx, [ebp+serial_correcto]
call strcmp
test eax, eax
jz serial_correcto
; Técnicas comunes:
; - Step into (F7 en OllyDbg): Ejecuta instrucción entrando en calls
; - Step over (F8): Ejecuta instrucción saltando calls
; - Run trace (Ctrl+F11): Registra toda la ejecución
; - Conditional logging: Registra valores específicos
; Parche común para saltar verificación:
jz loc_fail ; Original: Salta si serial incorrecto
jmp loc_success ; Modificado: Siempre salta a éxito
; O reemplazar con NOPs:
nop
nop
; Ejemplo de bypass para verificación de keyfile:
call ds:CreateFileA ; Intenta abrir keyfile
cmp eax, -1 ; ¿Falló?
jnz short loc_keyfile_ok
; Parchear para simular keyfile existente:
mov eax, 1 ; Siempre devuelve handle válido
jmp loc_keyfile_ok
; Bypass para tiempo de prueba:
call ds:GetTickCount ; Obtiene tiempo desde inicio
sub eax, startTime
cmp eax, trialPeriod
jl short loc_trial_ok
; Parchear para siempre considerar tiempo válido:
jmp loc_trial_ok
Técnicas comunes usadas por software para detectar debuggers:
; Bypass para IsDebuggerPresent:
call ds:IsDebuggerPresent
test eax, eax
jz short loc_no_debugger
; Parchear para siempre retornar 0:
xor eax, eax
retn
; Ejemplo de algoritmo de serial típico:
mov eax, [nombre_usuario]
xor eax, 12345678h
add eax, 87654321h
ror eax, 4
not eax
mov [serial_correcto], eax
; Keygen en C equivalente:
unsigned int generate_serial(const char* username) {
unsigned int hash = 0;
for(int i = 0; username[i]; i++) {
hash = (hash << 3) + username[i];
}
hash ^= 0x12345678;
hash += 0x87654321;
hash = (hash >> 4) | (hash << (32-4));
return ~hash;
}
; Ejemplo de parche común (cambiar jz por jmp):
; Original: 74 0A (jz +10)
; Modificado: EB 0A (jmp +10)
; Herramientas para parchear:
; - OllyDbg: Ctrl+E para editar
; - x64dbg: Parchear directamente
; - HxD: Editor hexadecimal
; Manipulación de Import Address Table para redirigir funciones:
; 1. Localizar IAT (Import Address Table)
; 2. Encontrar entrada de la función a hookear (ej. MessageBoxA)
; 3. Cambiar dirección por nuestra función
; Ejemplo de hook para MessageBoxA:
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
// Cambiar mensaje de error
if(strstr(lpText, "Invalid")) {
return MessageBoxA(hWnd, "Valid License!", lpCaption, uType);
}
return MessageBoxA(hWnd, lpText, lpCaption, uType);
}
Técnica para inyectar código nuevo en espacios vacíos del ejecutable:
; Ejemplo de code cave que salta a nuestra función:
pushad ; Guarda registros
call my_new_function ; Llama a nuestro código
popad ; Restaura registros
jmp original_function ; Vuelve al flujo original
Herramienta | Propósito | Alternativas |
---|---|---|
OllyDbg/x64dbg | Debugging | WinDbg, IDA Debugger |
IDA Pro | Análisis estático | Ghidra, Binary Ninja |
PEiD/Exeinfo PE | Detectar compiladores/packers | Detect It Easy |
LordPE/PE-bear | Editor PE | CFF Explorer |
HxD/010 Editor | Editor hexadecimal | WinHex |
Process Hacker | Manipulación de procesos | Process Explorer |
; Método OEP (Original Entry Point) común:
1. Buscar punto de entrada empaquetado
2. Poner breakpoint en acceso a memoria de código
3. Seguir ejecución hasta salto a OEP
4. Volcar proceso desempacado
; Herramientas específicas:
- UPX: upx -d archivo.exe
- OllyDbg: plugins como OllyDump
Técnicas usadas por packers avanzados:
; Estrategias para packers avanzados:
- Análisis estático del stub de unpacking
- Memory dumping en momento preciso
- Reconstrucción manual de IAT
- Uso de emuladores como QEMU
El cracking de software protegido sin autorización es ilegal bajo:
Usa estas técnicas solo para:
; Comportamiento observado:
- Pide nombre de usuario y serial
- Muestra "Correct!" o "Wrong serial"
; Strings encontradas:
- "Enter your name:"
- "Enter serial:"
- "Correct!"
- "Wrong serial"
; Desensamblado clave:
mov eax, [nombre] ; Carga primer carácter
imul eax, 41C64E6Dh ; Multiplica por constante
add eax, 3039h ; Suma constante
mov [serial_valido], eax ; Guarda como serial válido
; Comparación:
mov eax, [serial_usuario]
cmp eax, [serial_valido]
jz correcto
#include <stdio.h>
int main() {
char name[32];
printf("Enter name: ");
scanf("%31s", name);
unsigned int serial = name[0];
serial *= 0x41C64E6D;
serial += 0x3039;
printf("Valid serial: %u\n", serial);
return 0;
}
; Cambiar:
74 0A ; jz +10 (Wrong serial)
; Por:
90 90 ; nop nop (siempre continúa)
; O cambiar por:
EB 0A ; jmp +10 (siempre salta a Correct!)