Comenzamos
por escribir nuestro generador de parches en C puro, C para
consola, ya que despues es muy sencillo programar un front
end para el entorno grafico que genere la linea de comandos
para que funcione.
El programa empezaria mas o menos asi......
/*-----------------Corta por aqui----------------------------*/
//Archivo: WkTCracKGeneratoR
// Esta linea incluye las funciones necesarias para el
acceso a archivos.
#include <stdio.h> //para acceso a archivos..
// Ahora definimos la funcion que mostrara el baner,
algo sencillo pero que aclare que programa
//se esta ejecutando. Simplemente mediante varios printf
sacamos un texto en consola.
void Banner ()
{
printf ("*----------------------------------------------------*\n");
printf ("*-- WkTCracKGeneratoR
By Mr. Jade[WkT!] --*\n");
printf ("*--
kickme.to/wkt
--*\n");
printf ("*----------------------------------------------------*\n");
printf ("*----------------------------------------------------*\n");
printf ("*--------
WkT! : Kickme.to/wkt
--------*\n\n");
}
//Este snippet nos devolvera el tamaño de un archivo.
long fsize(FILE *fp)
{
long pos, size;
pos = ftell(fp);
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, pos, SEEK_SET);
return size;
}
// Definimos la funcion main como una funcion que
devolvera un valor entero, asi despues un //frontend sabra
si el comando se ha ejecutado con exito o cual ha sido el
error.
int main (int argc, char * argv[])
{
//Definicion de las variables que manejara el programa.
char ErrorAbrir[] = "\nError al abrir %s\n\n";//Cadena
a mostrar en caso de error
FILE *ArchivoCrackeado; //Puntero al archivo
crackeado
FILE *ArchivoOriginal;
//Puntero al archivo original
FILE *ArchivoGenerado; //Puntero al Archivo
crack.c
char Caracter;
//Guardara el valor del caracter leido.
long Maximo;
long Contador=0;
//encargado de apuntar al desplazamiento.
//Mostramos el baner
Banner ();
// Es hora de parsear la linea de comandos en busca de
los parametros necesarios para la //ejecucion.
// En caso de que no se introduzcan los 4 parametros,
sale mostrando la sintaxis correcta y //muestra un ejemplo.
if (argc < 4)
{
fprintf (stderr, "USO: WkTCracKGeneratoR
ArchivoCrackeado ArchivoOriginal Programa Cracker\n");
fprintf (stderr, "Ejemplo: WkTCracKGeneratoR
mxaudio mxaudio.bak Xaudio1.5 Mr.Jade\n\n");
return (1);
}
// Si todos los parametros son introducidos ahora
comprobaremos si estos son validos.
// Empezamos por comprobar los nombres de archivo.
Si los archivos no se pueden abrir, muestra
//una cadena avisando del error.
//En primer lugar el archivo ya crackeado
if ((ArchivoCrackeado = fopen (argv[1], "r")) ==
NULL)
{
fprintf (stderr, ErrorAbrir, argv[1]);
return (10);
}
//Despues el archivo original.
if ((ArchivoOriginal = fopen (argv[2], "r")) == NULL)
{
fprintf (stderr, ErrorAbrir, argv[1]);
return (11);
}
//y despues el crack.c
if ((ArchivoGenerado = fopen ("./crack.c", "w"))
== NULL)
{
fprintf (stderr, ErrorAbrir, argv[1]);
return (12);
}
// Si todo ha ido como es debido se abran abierto todos
los archivos. Si no es asi, se saldra con un //mensaje de
error y la funcion main devolvera un numero relaccionado
con dicho error. Tomare //como 0 una salida correcta, 1
una salida sin realizar acciones debido a la falta de parametros,
10, //11, 12, respectivamente si sucede un error en a la
hora de abrir los archivos Programa //Crackeado, Programa
Original, y crack.c .
//
// Ahora toca empezar a escribir sobre el archivo fuente
crack.c la parte que es fija al comienzo, //que son los
includes, la definicion del main, etc.. pero con una salvedad,
en el banner se deben //incluir el nombre del cracker y
el nombre y version del programa que son introducidos en
la linea //de comandos. Pondre en negrita la parte que quedara
escrita en negrita para no confundir... ya //que parar incluir
caracteres como las " o la / es necesario incluir
el caracter / antes, que si no se //nos lia el compilador
y no llena la pantalla de warnings.. Esto lo entendereis
si leeis el capitulo //relacionado con el print en algun
libro o tutorial de C. La funcion fprintf es como el printf
pero la //salida la hace al archivo indicado en el handle
ArchivoGenerado, en este caso es crack.c .
fprintf(ArchivoGenerado, "#include <stdio.h>
//para acceso a archivos..\n");
fprintf(ArchivoGenerado, "void\n");
fprintf(ArchivoGenerado, "Banner ()\n");
fprintf(ArchivoGenerado, "{\n");
fprintf(ArchivoGenerado, " printf (\"*---------------------------------------*\\n\");\n");
// Fijaos bien en la ultima linea, en donde
se repite dos veces el caracter / .uno esta en //negrita
y //otro no, ya que uno esta puesto para que el fprintf
no lo tome como un caracter de //control, si no //que debe
coger el siguiente caracter y escribirlo en el archivo.
// Ahora incluimos en el banner los parametros craker
y programa version en estas lineas....
fprintf(ArchivoGenerado, " printf (\"*--\\n\");\n");
fprintf(ArchivoGenerado, " printf (\"*--
Crack para %s\\n\");\n", argv[3]);
fprintf(ArchivoGenerado, " printf (\"*--
Cracker %s\\n\");\n",
argv[4]);
fprintf(ArchivoGenerado, " printf (\"*--\\n\");\n");
// El %s va a ser sustituido por las cadenas corrrepondientes....
//Seguimos ahora con mas parte fija en todos los archivos
crack.c
fprintf(ArchivoGenerado, " printf
(\"*--------------------------------------*\\n\");\n");
fprintf(ArchivoGenerado, " printf (\"*-WkTCracKGeneratoR
By Mr. Jade[WkT!]\\n\");\n");
fprintf (ArchivoGenerado," printf (\"*--
kickme.to/wkt \\n\");\n");
fprintf (ArchivoGenerado," printf (\"*--------------------------------------*\\n\\n\");\n");
fprintf(ArchivoGenerado, "}\n");
fprintf(ArchivoGenerado, "\n");
fprintf(ArchivoGenerado, "int\n");
fprintf(ArchivoGenerado, "main (int argc, char
* argv[])\n");
fprintf(ArchivoGenerado, "{\n");
fprintf(ArchivoGenerado, "\n");
// Sustituye la cadena del path al archivo.
fprintf(ArchivoGenerado, " char *path_archivo
= \"%s\";\n", argv[1]);
fprintf(ArchivoGenerado, " FILE *Archivo;\n");
fprintf(ArchivoGenerado, "\n");
fprintf(ArchivoGenerado, " Banner ();\n");
fprintf(ArchivoGenerado, "\n");
fprintf(ArchivoGenerado, " if ((Archivo = fopen
(path_archivo, \"r+b\")) != NULL)\n");
fprintf(ArchivoGenerado, " {\n");
fprintf(ArchivoGenerado, "\n");
// Ahora estamos dentro del bucle que se encarga de modificar
el ejecutable en el codigo fuente //del crack, esto es,
dentro de la condicion IF si el archivo se ha abierto correctamente.
Mediante //un bucle vamos a recorrer los dos archivos ejecutables
comparandolos byte a byte. En caso de //que no coincidan
, escribiremos un par de lineas en el crack.c que se encargaran
de modificar //dicho byte cuando el crack sea ejecutado.
Maximo = fsize(ArchivoOriginal);
Contador = 0;
while (Contador < Maximo)
{
Caracter=fgetc (ArchivoCrackeado);
if (Caracter==fgetc(ArchivoOriginal))
{
fprintf(ArchivoGenerado,
"fseek (Archivo, %i, 0);", Contador);
fprintf(ArchivoGenerado,
"fputc(%i, Archivo);\n", Caracter);
}
Contador++;
}
//Saltamos hasta el final del fichero. Esto evite que el
archivo quede truncado al cerrarlo en modo //escritura.
fprintf(ArchivoGenerado, " fseek (Archivo, 0, SEEK_END);\n");
// Cerramos el archivo ejecutable y avisamos....
fprintf(ArchivoGenerado, " fclose(Archivo);\n");
fprintf(ArchivoGenerado, " printf (\"El
archivo %s ha sido crackeado con exito.\\n\\n\");\n",argv[1]);
//Una vez realizadas las modificaciones, salimos del IF
y pasamos a la siguiente parte.
fprintf(ArchivoGenerado, " }\n");
fprintf(ArchivoGenerado, " else\n");
fprintf(ArchivoGenerado, " {\n");
fprintf(ArchivoGenerado, " printf
(\"Error: No se encuentra el archivo, o no se puede
abrir.\\n\\n\");\n");
//Aqui es donde se añadiria codigo en caso de que
nos interese realizar alguna accion mas si el //archivo
no puede abrirse.
fprintf(ArchivoGenerado, " }\n");
fprintf(ArchivoGenerado, "\n");
fprintf(ArchivoGenerado, "}\n");
fprintf(ArchivoGenerado, "\n");
//Cierra los archivos abiertos
fclose(ArchivoCrackeado);
fclose(ArchivoOriginal);
fclose(ArchivoGenerado);
// Saliendo......
return(0);
}
/*------------------- Corta por aqui ------------------*/
Bien, el pograma esta escrito, ya solo falta el Makefile,
pero esta vez vamos a dar soporte al Makefile para que compile
tambien los cracks generados.
/*------------ Corta por aqui y guarda como: Makefile--------*/
CC = gcc
all: WkTCracKGeneratoR
crack: crack.c
$(CC) `gtk-config --cflags` crack.c -o crack `gtk-config
--libs`
WkTCracKGeneratoR: WkTCracKGeneratoR.c
$(CC) `gtk-config --cflags` WkTCracKGeneratoR.c -o
WkTCracKGeneratoR `gtk-config --libs`
clean:
rm -f *.o WkTCracKGeneratoR crack
/*---------------- Corta por akin--------------------*/
Ahora, para borrar anteriores compilaciones, y recompilar
de nuevo:
make clean
Para compilar WkTCracKGeneratoR :
make
Para compilar el crack generado:
make crack
Vamos ahora a crear nuestro primer crack
con esta tool, para eso recurrimos de nuevo al xaudio recien
crackeado. Cada uno tendra que modificar las lineas
de path segun tenga instalado. Este fue mi linea de comando:
./WkTCracKGenerator /usr/local/bin/mxaudio /tmp/mxaudio.bak
Xaudio1.0.5 Mr.Jade
Y este fue el resultado:
*/----------------- Archivo crack.c ---------------*/
#include <stdio.h> //para acceso a archivos..
void
Banner ()
{
printf("*--------------------------------------*\n");
printf ("*--\n");
printf ("*-- Crack para Xaudio1.0.5\n");
printf ("*-- Cracker
Mr.Jade\n");
printf ("*--\n");
printf ("*-------------------------------------*\n");
printf ("*- WkTCracKGeneratoR By
Mr. Jade[WkT!]\n");
printf ("*--
kickme.to/wktk\n");
printf ("*-------------------------------------*\n\n");
}
int
main (int argc, char * argv[])
{
char *path_archivo = "/usr/bin/local/mxaudio";
FILE *Archivo;
Banner ();
if ((Archivo = fopen (path_archivo, "r+b")) != NULL)
{
fseek (Archivo, 43804, 0);
fputc(-21, Archivo);
fseek (Archivo, 43805, 0);
fputc(16, Archivo);
fseek (Archivo, 1137626, 0);
fputc(77, Archivo);
fseek (Archivo, 1137627, 0);
fputc(114, Archivo);
fseek (Archivo, 1137628, 0);
fputc(46, Archivo);
fseek (Archivo, 1137629, 0);
fputc(74, Archivo);
fseek (Archivo, 1137630, 0);
fputc(97, Archivo);
fseek (Archivo, 1137631, 0);
fputc(100, Archivo);
fseek (Archivo, 1137632, 0);
fputc(101, Archivo);
fseek (Archivo, 1137633, 0);
fputc(45, Archivo);
fseek (Archivo, 1137634, 0);
fputc(87, Archivo);
fseek (Archivo, 1137635, 0);
fputc(107, Archivo);
fseek (Archivo, 1137636, 0);
fputc(84, Archivo);
fseek (Archivo, 1137637, 0);
fputc(33, Archivo);
fseek (Archivo, 1137639, 0);
fputc(32, Archivo);
fseek (Archivo, 1137640, 0);
fputc(67, Archivo);
fseek (Archivo, 1137641, 0);
fputc(114, Archivo);
fseek (Archivo, 1137642, 0);
fputc(97, Archivo);
fseek (Archivo, 1137643, 0);
fputc(99, Archivo);
fseek (Archivo, 1137644, 0);
fputc(107, Archivo);
fseek (Archivo, 1137645, 0);
fputc(101, Archivo);
fseek (Archivo, 1137646, 0);
fputc(100, Archivo);
fseek (Archivo, 1137647, 0);
fputc(32, Archivo);
fseek (Archivo, 1137648, 0);
fputc(98, Archivo);
fseek (Archivo, 1137649, 0);
fputc(121, Archivo);
fseek (Archivo, 0, SEEK_END);
fclose(Archivo);
printf ("El archivo %s ha sido crackeado con exito.\n\n",
path_archivo);
}
else
{
printf ("Error: No se encuentra el archivo,
o no se puede
abrir.\n\n");
}
}
*---------------- Corta por aki--------------*/
Ahora compilamos con make crack, ejecutamos y listo.
Para despedirme quiero decir que esto solo es un
ejemplo, y que cualquiera con un poco de cerebro podria
mejorarla y mucho. En tus manos esta, nosotros bastante
hemos hemos escribiendo esto y publicando las fuentes.
Con este tutorial no he querido potenciar el trafico de
cracks en la comunidad linux, ni facilitar el trabajo a
los que estan empezando con el crackeo en linux. Todo lo
contrario. Solo sigo con la labor de aumentar el numero
de herramientas para la gente que utiliza este SO, y que
esto os sirva para poner en movimiento esas 4 neuronas y
os entre el gusanillo de la creacion. No espereis a que
os den todo hecho, si algo no lo encontrais, animaos y hacedlo
vosotros mismos.
AH! y recordad que si quereis usar un programa,
debeis pagar la correspondiente licencia, no seais malos.....
. (Por eso abandone windows y me pase a linux, entre otras
cosas....)
|