ESTUDIO COLECTIVO DE DESPROTECCIONES
Última Actualizacion: 25/10/2001

Programa XAudio  Linux / GTK 
Descripción Algo simple y bastante antiguo. Habiendo reproductores gpl.......
Tipo Reproductor de archivos mp*
Tipo de Tutorial [X]Original, []Adaptación, []Aplicación, []Traducción
Url http://www.xaudio.com 
Protección Serial
Dificultad 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista 
Herramientas Dasm, less y  biew, o cualquier cosa que encuentres, compiles y funcione.
Objetivo Eliminar nagscreen y modificar el about para simular la licencia.
Cracker Mr Jade  [WkT!]
Grupo Whiskey Kon Tekila
Fecha 22 de Diciembre de 2000 


INTRODUCCION
Saluos ... Tema nuevo, vida nueva. A los que useis linux no os digo nada, porque ya sabeis de que hablo, pero a los pobres infelices que resisten ante los pantallazos de su querido güindous, no sabreis lo que es controlar algo hasta que no toqueis linux. Por eso como introducción esta vez, y que sirva de precedente, solo dire.... a la mierda los sistemas operativos que fallan. No le veo sentido a seguir utilizando algo que no da mas que problemas teniendo al lado algo que me aporta soluciones. Inconveniente, que hay que currar mas, hay que leer mas, etc.. . y a veces no siempre lo consigues... . Bueno, eso tambien pasa en windoze, y nadie se queja. 

    Bien, centrandonos ya en el tema, yo uso una redhat, por lo que quizas algun path cambie en vuestra distri de linux. A estas alturas eso no sera problema no?. Las herramientas que vamos a usar para crackear el programa son estas: 

  •  dasm : LINUX DISASSEMBLER 2.0799.  script de shell hecho por SiuL+Hacky en 1999
  •  biew o cualquier otro editor que no añada caracteres de texto a archivos binarios (el VI lo hace)


    Una vez crackeado el programa pasaremos a programar el crack. Las herramientas que utilizaremos entonces se explicaran mas adelante. 
 

    NOTA:  la version del programa que se va a crackear corresponde a la comprimida con targa y  zip.   Su   nombre completo es  xaudio-1.0.5.x86-unknown-linux-glibc.tar.gz, para evitar problemas con versiones en formato RPM o paquetes de cualquier otra distribucion. 
 

 

BIEN, ANALIZANDO LAS HERRAMIENTAS: LINUX DISASSMBLER 2.0799
Este es el script en perl que utilizaremos para generar el codigo asm. La verdad es que hasta ahora no he podido agenciar otras 
herramientas, pero os aseguro que con esto se puede hacer, como vereis. 
 

/*------------------------No incluyas esta linea-----------------------*/ 
 

#!/usr/bin/perl 
;############      Modifica esta linea hacia el path de perl        ############ 
push(@INC,"/usr/lib/perl5"); 
require("flush.pl"); 

;################################################################## 
;######## LINUX DISASSEMBLER 2.0799 
;######## (C) SiuL+Hacky Jul 1999 
;######## 
;######## Revision por Mr. Jade. 
;######## 
;######## Uso: dasm Archivo_exe Archivo_asm 
;################################################################## 
 

$f_input=$ARGV[0]; 
$f_output=$ARGV[1]; 
&printflush(STDOUT, "\nCreando archivo desensamblado ..."); 
$return=system("objdump -d -T -x --prefix-addresses ".$f_input.">".$f_output."2"); 
if ($return!=0){ 
  print "\nERROR AL ABRIR OBJDUMP $return"; 
  print "\nUso: dasm Archivo_exe Archivo_asm"; 
  print "\nAsegurate de que objdump esta en el path o tiene los permisos adecuados.\n"; exit(1); 
 } 

open(INPUT, "<".$f_output."2"); 

&printflush(STDOUT, "\nLeyendo cadenas ..."); 
$_=<INPUT>; 
while (!/.rodata/){ 
  $_=<INPUT>; 

($rubbish, $rest)=split(/.rodata/,$_,2); 
($rubbish, $rest)=split(/0/,$rest,2); 
@numbers=split(/  /,$rest,5); 
$size=hex($numbers[0]); 
$starting_address=hex($numbers[1]); 
$end_address=$starting_address+$size; 
$offset=hex($numbers[3]); 
open(CODIGO, "<".$f_input); 
seek(CODIGO,$offset,0); 
read(CODIGO,$cadena,$size); 
close(CODIGO); 
 

SEARCH: while (<INPUT>){ 
  last SEARCH if (/SYMBOL TABLE/); 

if (/SYMBOL TABLE/){ 
  &printflush(STDOUT, "\nProcesando tabla de simbolos ..."); 
  $_=<INPUT>; 
  while (!/^\n/){ 
   @st_element=split(/ /, $_); 
   $_=$st_element[$#st_element]; 
   chop; 
   $symbol_table{$st_element[0]}=$_; 
   $_=<INPUT>; 
  } 

else { 
  seek(INPUT,0,0); 

while (!/\.text/){ 
  $_=<INPUT>; 

&printflush(STDOUT,  "\nProcesando saltos y llamadas ..."); 

while (<INPUT>){ 
  $_=~ s/0x//g; 
  $_=~ s/<.*?>//g; 
  $_=~s/  / /g; 
  if (/j/){ 
    ($direccion,$inst,$destino)=split(/ /,$_,3); 
    $destino=~s/ //g; 
    chomp($destino); 
    $salto{$destino}.=($direccion." \; "); 
  } 
  elsif (/call/){ 
    ($direccion,$inst,$destino)=split(/ /,$_,3); 
    $destino=~s/ //g; 
    chomp($destino); 
    $call{$destino}.=($direccion." \; "); 
  } 

seek(INPUT,0,0); 
&printflush(STDOUT, "\nGuardando referencias ...\n"); 
open(OUTPUT, ">".$f_output) || die print "\nError al abrir archivo\n"; 
print OUTPUT "FILE REFERENCED\n\n"; 

while (!/Disassembly of section .text:/){ 
 $_=<INPUT>; 
 print OUTPUT; 

$char="."; 
$counter=0; 
while(<INPUT>){ 
 $counter++; 
 if ( ($counter % 400)==0){ 
   printflush(STDOUT,$char); 
   if ( ($counter % 4000)==0){ 
     printflush(STDOUT,"\r"); 
     if ($char eq "."){ $char=" ";} 
     else { $char=".";} 
   } 
 } 
 $copia=$_; 
 $_=~s/0x//g; 
 $_=~s/<.*?>//ge; 
 $_=~s/  / /g; 
 ($direccion, $inst, $destino)=split(/ /,$_,3); 
 if ( defined( $symbol_table{$direccion} )){ 
   print OUTPUT "\n"; 
   print OUTPUT "---- Funcion : ".$symbol_table{$direccion}." ----\n"; 
 } 
 if (/call/){ 
   $destino=~s/ //g; 
   chomp($destino); 
   if ( defined( $symbol_table{$destino} )){ 
     print OUTPUT "\n"; 
     print OUTPUT "Referencia a funcion : ".$symbol_table{$destino}."\n\n"; 
   } 
 } 
 if ( defined( $salto{$direccion} )){ 
   print OUTPUT "\n"; 
   print OUTPUT "Referenciado en salto desde ".$salto{$direccion}."\n\n"; 
 } 
 if ( defined( $call{$direccion} )){ 
   print OUTPUT "\n"; 
   print OUTPUT "Referenciado en llamada desde ".$call{$direccion}."\n\n"; 
 } 
 if (/\$/){ 
        ($instruccion, $operand)=split(/\$/,$_,2); 
        if (!/push/){ 
          ($operand, $rest)=split(/\,/,$operand,2); 
        } 
        chomp($operand); 
        $offset=hex($operand); 
        if ( ($offset <= $end_address) && ($offset >= $starting_address ) 
        ){ 
          $auxiliar=substr($cadena, $offset-$starting_address); 
          $length=index($auxiliar, pack("x") ); 
          $auxiliar=substr($auxiliar, 0, $length); 
          $auxiliar=~s/\n//g; 
          print OUTPUT "\n"; 
          print OUTPUT "Posible referencia a cadena:"; 
          print OUTPUT "\n\"$auxiliar\"\n\n" 
        } 
  } 
 print OUTPUT $copia; 

close(INPUT); 
close(OUTPUT); 
print "\n"; 
system("rm ".$f_output."2"); 

/*---------------------                  Esta tampoco             ---------------------*/ 
 
 

    Para instalar el desensamblador en vuestro linux, los pasos son faciles, se corta y pega en un archivo de nombre dasm al que luego seteamos los atributos como solo ejecutable por usuario (o cada uno lo que quiera.. yo en concreto y por temas de seguridad recomendaria que solo el root lo pueda ejecutar..mas que nada por el tamaño de los archivos que genera) o como querais, y ejecutar. (si quereis instalarlo solo hay que copiarlo al directorio /usr/local/bin, o /bin . 

    Bueno, como podreis ver el uso es muy sencillo: 

    dasm mxaudio mxaudio.asm 

    y ya habremos obtenido nuestro desensamblado del ejecutable. Primer ostion, 13mb de archivo asm... uff.. que miedo. 
 

  • BIEW
        Como decia antes, no importa joe o cualquier otro editor rapido. Tampoco importa que sea un editor para las X, ya que el programa que vamos a crackear es para entorno grafico, la unica condicion a tener en cuenta es que algunos editores (como el vi) añaden caracteres o se vuelven locos con los archivos binarios. Otro buen ejemplo es biew, similar al hview al que todos estamos acostrumbrados a ver en windous. Biew ofrece la posibilidad de ver el desensamblado, lo cual es una ventaja. 

 

TOMA DE CONTACTO CON EL PROGRAMA
        Bien, ejecutamos el programa, aparece la nag, pulsamos sobre el boton de introducir licencia, y pulsamos ctrl+d, ponemos un bpx GetDlgItemTextA.......... mm no no, esta ya no es la formula. Existe mucha diferencia entre el funcionamiento del api de windows y el del linux, asi como tb es grande la diferencia entre el codigo ASM. Pero eso lo veremos mas adelante, segun entremos en materia. Ahora vamos a ejecutar el programa y a ver que es lo que hemos instalao en el pc.... 

    Cierto, aparece la nag diciendo que para que usar un prg GPL o freeware pudiendo pagar por usar este, asi que este tipo de nags si que sobran. Pulsamos para ver que tipo de datos tenemos que introducir.. mm un numero de serie.. nada, olvidao. Elegimos la opcion de probar el programa, y comprobamos como todas las funciones estan habilitadas. Solo que en el About aparece un UNREGISTERED en mayusculas que pega un cantazo ..... 

   Muy bien, visto el percal, ya que todas las funciones estan habilitadas una buena solucion es quitar esa nag y solucionar el tema del about. Hecho esto, crackeao el prg... 

 

AL ATAKERL
        Supongo que no ha habido ningun tipo de problemas a la hora de desensamblar el codigo. Si todo ha ido bien, tendremos un archivo ASM de poco mas de 13 mb, que tendremos que estudiar.. pero por si acaso vamos a ir adelantando. Veamos, el titulo de la ventana de la nag... un "Xaudio Shareware". Abrimos el archivo ASM y buscamos .... mm bueno, antes de buscar veamos que es exactamente lo que tenemos en ese archivo. 
        Para editar semejante muerto de archivo, usaremos less, que permite una rapida edicion y un sistema de busqueda de cadenas mucho mas que valido para lo que vamos  a hacer. En la shell ponemos : less mxaudio.asm   o nombre del archivo asm... 

         El archivo es tipo ELF, i386. Esto mas o menos traducio al lenguaje de los que estan acostubrados a un win, el tipo EXE (PE, NE, etc..) y el tipo de micro segun las instrucciones que vaya a ejecutar el programa. 

        Vemos tb una  cabecera donde estan definidas las secciones del ejecutable junto a sus atributos, ademas de la cabecera de secciones dinamicas.. etc.. todo esto es demasiado como para explicar en este tutorial, asi que me limitare a observar las cosas que creo que pueden interesarnos nada mas (excepto a ctors y dtors, esas "secciones" contienen el codigo que se ejecuta antes de y justo despues de la ejecucion del propio prg.. algun dia seran nuestra primera opcion..). Si avanzamos en el archivo, mas adelante vemos el desensamblado por secciones.. pero como no vamos a analizar la ejecucion, pasamos directamente a la accion buscando el titulo de esa ventana NAG que queremos eliminar. Para eso el comando en "less" que nos permite realizar una busqueda es la barra  / . Ponemos "/Xaudio Share"  (al loro con las mayusculas, case sensitive) en LESS y esperamos un pokitin (13mb) . Esto es lo que aparece tras la busqueda. 
 

......... 
Posible referencia a cadena:"Xaudio Shareware"  <---- Nuestra cadenita

0x0806aa94 push   $0x817d417 

Referencia a funcion : XtVaCreatePopupShell         <-- Esta funcion es la que prepara la creacion de la ventana. 

0x0806aa99 call   0x0804ebe4 
0x0806aa9e add    $0x20,%esp 
0x0806aaa1 mov    %eax,%esi 
........... 

        A ver, esto os recuerda al W32dasm? jeje, mas o menos el formato es el mismo, lo que lo hace facil de leer. Bueno, ahi esta nuestra cadena y la llamada a la funcion que  prepara la ventana. Ahora es cuestion de ir hacia atras hasta anular la llamada a dicha funcion. Facil no?.. pues agarraos... 

       Justo encima de este codigo vemos a traves de que saltos hemos ido llegando hasta aqui. 

...... 
Referenciado en salto desde 0806aa7c ;

0x0806aa8d push   %ebx 
0x0806aa8e mov    0x81a551c,%eax 
0x0806aa93 push   %eax 

Posible referencia a cadena:"Xaudio Shareware" 
........ 

Volvemos hasta la direccion 0806aa7c y un poco mas arriba vemos que hemos llegado hasta aqui debido a este otro salto: 
.... 
Referenciado en salto desde  0806aa6d

0x0806aa7a test   %ebx,%ebx 
0x0806aa7c je     0x0806aa8d
........ 

Pues nada, vamos a la 0806aa6d..... 
....... 
Referenciado en llamada desde 08052b26

0x0806aa54 push   %ebp 
0x0806aa55 mov    %esp,%ebp 
0x0806aa57 push   %edi 
0x0806aa58 push   %esi 
0x0806aa59 push   %ebx 
0x0806aa5a push   $0x0 
0x0806aa5c push   $0x1 
0x0806aa5e push   $0x81b7a9c 
0x0806aa63 push   $0x0 
0x0806aa65 push   $0x81b7840 
0x0806aa6a mov    0x8(%ebp),%ebx 
0x0806aa6d jmp    0x0806aa7a
........ 

       Por fin! dejan de ser saltos y tenemos una llamada desde 08052b6. Ahora que ya hemos llegado a la llamada de la funcion veamos es codigo y en que condiciones realiza la llamada. 
.......... 
Referencia a funcion : XtRealizeWidget 

0x08052b09 call   0x0804fbd4 
0x08052b0e mov    0x81cba3c,%eax 
0x08052b13 push   %eax 
0x08052b14 call   0x08064f34 
0x08052b19 add    $0xc,%esp 
0x08052b1c test   %eax,%eax 
0x08052b1e jne    0x08052b2e      <----- No, no,  no caeremos en la tentacion del  je  por  jne.. no... 
0x08052b20 mov    0x81cb8a8,%eax 
0x08052b25 push   %eax 
0x08052b26 call   0x0806aa54   <-------  Desde aqui llama a la creacion de la nag
0x08052b2b add    $0x4,%esp 

Referenciado en salto desde 08052b1e ;  <--- aqui saltamos si la comparacion de 08052b1c nos lo permite. 

0x08052b2e push   $0x0 
0x08052b30 mov    0x81cba74,%eax 
0x08052b35 push   %eax 

Referencia a funcion : XSync 
........... 

        Ahora nos paramos y analizamos un poco este trozo de codigo. En 08052b26 tenemos la llamada a la funcion que muestra la NAG, y dos instrucciones mas arriba un salto condicional.  Bueno, puede que tengamos suerte o puede que no. No se puede uno saltar una condicion asi porque si. A veces la prueba-error  no sirve mas que para perder el tiempo, y con un poco suerte datos, tal vez algun que otro archivo si el programa por casualidad detecta que estamos saltadonos pasos importantes.  Para eso lo que vamos a hacer ahora es analizar que sucede cuando se pulsa sobre el boton "Try It" para observar como sale el prg de la llamada a esa funcion. Para esto, es necesario un poco de teoria sobre GTK. Bien, las ventanas en GTK se construyen a base de añadir controles, y conectarlos a funciones. Así, pues, la mayoria de los elementos (widgets) que constituyen  los controles en GTk son posibles contenedores de otros objetos. Por ejemplo, a una ventana le podemos añadir una imagen, ya que la ventana es uno de los controles contenedores. Pero con esto ya hemos completado toda posibilidad de añadir widgets a dicha ventana. Para eso, en llugar de añadir la imagen a la ventana añadimos  un control que acepte varios controles incluidos, como es el caso de VBOX o HBOX. Estos controles son contenedores que ordenan los objetos contenidos de forma vertical y horizontal respectivamente, y asi podremos añadir mas de un control a la ventana (perdonad la chapa.).  Por otro lado, para que uno de estos widgets reaccione ante la pulsacion del raton sobre el, es necesario conectarle una funcion. Estas funciones se denominan CallBacks. Vamos a ver como se construye dicho boton "Try It". Ponemos "/Try It" para buscar ese texto en el archivo asm y el editor se detiene en este punto: 

............. 
0x0806ab6c mov    0x81a9d84,%eax 
0x0806ab71 push   %eax 

Posible referencia a cadena:"Try It"

0x0806ab72 push   $0x817d434                                       <----- direccion de la cadena con el texto del boton 

Referencia a funcion : XtVaCreateManagedWidget  <--- Crea el control 

0x0806ab77 call   0x0804fdd4 
0x0806ab7c add    $0x50,%esp 
0x0806ab7f push   %esi 
0x0806ab80 push   $0x806ac06          <----   direccion de la funcion a conectar al boton.(CallBack) 
0x0806ab85 push   $0x81b732b 
0x0806ab8a push   %eax 

Referencia a funcion : XtAddCallback    <------------- Aqui es donde se asigna la funcion al boton. 

0x0806ab8b call   0x0804f0f4 
................ 

Lo que realmente nos interesa es el codigo que esta detras de ese CallBack, por lo que vemos lo que hay en la direccion  806ac06

............. 
0x0806ac06 push   %ebp 
0x0806ac07 mov    %esp,%ebp 
0x0806ac09 mov    0xc(%ebp),%eax 
0x0806ac0c push   %eax 

Referencia a funcion : XtDestroyWidget   <---- Aqui lo que se hace es destruir el widget window, la ventana nag. 

0x0806ac0d call   0x0804f694 
0x0806ac12 mov    %ebp,%esp 
0x0806ac14 pop    %ebp 
0x0806ac15 ret                                                  <----Vuelta pa'tras 
.............. 

 El boton "Try It" lo unico que hace es detruir la ventana NAG. Como podemos ver podemos cargarnos el call a la nag ya que tanto si la condicion hace que se muestre la ventana, como si no, la ejecucion del programa continua por el mismo camino, llegando a la instruccion 08052b2e. Bueno, pues podemos modificar esa instruccion , o buscar cualquier otra manera de evitar esa NAG. para mi la solucion mas elegante es ya que no se va a tener en cuenta la comparacion, para que hacerla? asi que en lugar de modificar el salto, añadiremos un salto en donde esta la instruccion    test %eax, %eax  . Solo queda esperar que el programa no realice ningun tipo de checksum para comprobar modificaciones, y en teoria todo debe funcionar. 
 
 

UNA VEZ ABIERTA LA PUERTA
          Ahora, como modificamos el archivo ejecutable? donde esta en el archivo esa direccion virtual  8052b1c? 
Volvemos a estudiar de nuevo el archivo ELF?. Toda la informacion sobre los archivos ELF es de dominio publico. Asi que si piensas meterte en esto, ya puedes ir buscadola, o esperar que la vaya explicando poquito a poquito. No pondre la direccion de donde bajar esa informacion porque yo no soy google ni altavista, todo esta ahi, solo hay que saber buscar. 
        Existe una manera mas sencilla aun que todo eso, que consiste en buscar la cadena de caracteres dentro del archivo , y luego modificarla, pero esto presenta el inconveniente de que no todos los caracteres son ascii, por lo que deberas saber los codigos de los caracteres para introducirlos como cadena de busqueda si es que el programa que utilizas para editar te los acepta (que esa es otra, que estamos editando binarios....). 
    Aun existe una mejor solucion, que es usar un editor de ficheros binarios como BIEW, que calcula el solito los offset virtuales y te olvidas de tener que andar con la calcu. 

    Ea, pues, abrimos el mxaudio con el biew, y buscamos esa direccion de memoria. ¿Como se hace?, ......¿como se pone un condon? eso  lo habeis leido en un tutorial?, pues hala, a leeros la ayuda del biew, o a inventarosla. 
 

0x08052b14 call   0x08064f34 
0x08052b19 add    $0xc,%esp 
0x08052b1c test   %eax,%eax  <-- Sustituimos esta instruccion por   jmps  0x08052b2e 
0x08052b1e jne    0x08052b2e 
0x08052b20 mov    0x81cb8a8,%eax 
0x08052b25 push   %eax 

Los cambios realizados son : 

0x08052b1c    85 C0  test   %eax,%eax     ----    por   ----    0x08052b1c  EB 10 jmps  0x08052b2e 

Para los que  no esten acostumbrados al codigo ASM de linux, JMPS es un salto  incondicional en un rango de 255 bytes alrededor de la direccion actual. 

    Salimos del editor mientras terminamos de comernos la uñas esperando que funcione, ejecutamos el maldito programa... y sorpresa, todo a funcionado. Normal, podemos pensar.... estamos en linux... hehe . 

Y EL UNREGISTERED
                Bueno,  es lo unico que nos queda pendiente. Editamos el archivo con BIEW de nuevo, y buscamos la cadena UNREG (no os tendre que recordar que es un archivo binario no?). Esto es lo que aparece: 

    UNREGISTERED REGISTERED TO: 

    El caracter que separa ambas cadenas es un 0, como en windows, caracter NULL que determina el final de la cadena.Asi que disponemos de dos huecos pelin justos para modificar este Texto. Si queremos cambiar longitudes de cadenas, sera necesario actualizar las referencias en el resto del ejecutable, por eso vamos a modificar esas cadenas sustituyendolas por otras que sean de meno o igual longitud: En mi caso... 

    Mr.Jade-WkT!    en donde se encuentra la cadena     UNREGISTERED
    Cracked by:           en donde se encuentra la cadena     REGISTERED TO:

                   Con esto queda terminado la parte que corresponde al crackeo del programa. Ahora al ejecutarlo no aparece la nag, y en el about aparece nuestro nombre. Prueba superada. Ahora solo nos queda hacer el crack. Para eso, apuntamos los desplazamientos del archivo en los que hemos escrito ambas cadenas, y en donde hemos modificado el salto en cuestion. 

 

NO, SI AL FINAL APRENDEREMOS A PROGRAMAR
         Por lo menos, es uno de los objetivos! ;).    Vamos a hacer el crack. Para esto lo importante es tener en cuenta compatibilidades a la hora de distribuirlo, ya que cada uno se monta su linux a su medida, no todos tenemos las mismas librerias. Como solucion he optao por ponerme al nivel de xaudio, y pensar.. si xaudio necesita GTK para ejecutarse, necesita soporte GTK funcionando, asi que el crack puede in  GTK.  Pero luego he pensao.. les tengo que explicar a estos como se hace el crack entero en GTK y me muero.. asi que nada, a C, y en shell. 

                Antes de empezar a tocar nada, lo importante es tener en cuenta los cambios que se van a realizar al programa. Para eso, antes de modificar el ejecutable mxaudio, habremos hecho una copia de segurirad. Por si acaso no hemos apuntado los desplazamientos y los valores que hemos modificado, simpre podremos utilizar cmp  ("man comp" para mas ayuda) para generar un archivo de texto con las diferencias entre ambos archivos. En la shell escribimos lo siguiente: 

$ comp  -l mxaudio mxaudio.bak > cambios.log 

                En cambios.log tenemos una lista con los bytes diferentes en cada uno de los archivos, asi como los offsets dentro del archivo. Ojo con esto porque determinados caracteres no los va a comprender, y va a dar resultados erroneos, pero nos servira para obtener los offsets dentro del archivo, y los bytes ascii que hayamos modificado. El siguiente paso es hacer un pequeño programa en C que sea capaz de modificar el fichero original parcheandolo con los nuevos valores.  Despues ya colocaremos ventanas si creemos necesaria la parafernalia. 

        Tendremos que tener en cuenta una sola cosa mas a la hora de situarnos en el archivo en los desplazamientos. Debemos situarnos un byte antes de lo que nos devuelve cmp para realizar bien las modificaciones. 

/*----------------------- CORTA POR AKI---------------------------*/ 
// Nombre de Archivo: mxaudiocrack.c 
 

#include <stdio.h>  //para acceso a archivos.. 

void 
Banner () 

  printf("\n\n"); 
  printf ("*------------------------------------------------------*\n"); 
  printf ("*--   Crack para Xaudio 1.0.5    By Mr. Jade[WkT!]   --*\n"); 
  printf ("*--       www.xaudio.com           kickme.to/wkt     --*\n"); 
  printf ("*------------------------------------------------------*\n"); 
  printf ("*--   Uso:  Copia este archivo en el directorio      --*\n"); 
  printf ("*--         donde se encuentra el ejecutable mxaudio --*\n"); 
  printf ("*--         y ejecutalo.                             --*\n"); 
  printf ("*------------------------------------------------------*\n"); 
  printf ("*---------         WkT! : Kickme.to/wkt       ---------*\n\n"); 

int 
main (int argc, char * argv[]) 

  char *path_archivo = "./mxaudio"; 
  FILE *Archivo; 

  Banner (); 

  if ((Archivo = fopen (path_archivo, "r+b")) != NULL) 
  { 

    fseek (Archivo, 43804, 0); //offset de la intruccion TEST %EAX, %EAX 
    fputc(235,Archivo); // la nueva instruccion byte a byte: EB 10 
    fputc (16, Archivo); 

    fseek (Archivo, 1137626, 0); //offset de la cadena UNREGISTERED 
    fprintf (Archivo, "%s", "Mr.Jade WkT!"); 

    fseek (Archivo, 1137639, 0); //offset de la cadena REGISTERED TO: 
    fprintf (Archivo, "%s", "Cracked by: "); 

    fseek (Archivo, 0, SEEK_END);   //Final del archivo. 
     fclose (Archivo); 
    printf ("Xaudio 1.0.5 Crackeado!\n\n"); 
  } 
  else 
  { 
    printf ("Error: No se encuentra el archivo, o no se puede abrir.\n\n"); 
  } 

// Ya esta, eso es todo, que esperabas? 
/*----------------------- CORTA POR AKI---------------------------*/ 

Corta y copia esto en un archivo con el nombre mxaudiocrack.c. 

/*----------------------- CORTA POR AKI---------------------------*/ 

CC = gcc 

all:  mxaudiocrack 

 mxaudiocrack: mxaudiocrack.c 
     $(CC)  mxaudiocrack.c -o mxaudiocrack  

clean: 
     rm -f *.o mxaudiocrack 

/*----------------------- CORTA POR AKI---------------------------*/ 

Y este otro archivo se debe llamar Makefile (controla que la M esta en mayusculas) una vez ambos archivos estan creados, pon make clean, para borrar posibles compilaciones anteriores y basurillas, y despues make, para crear el mxaudio ejecutable que deberas copiar al directorio donde esta instalado el Xaudio. Una vez copiado y en ese directorio con poner ./mxaudiocrack listo, nag eliminada y about modificado. 

 

DESPEDIDA Y CIERRE
        Y para terminar el tutorial, como no me apetece enrollarme mas, os meto otro script de shell que me han pasao,  que permite sacar las referencias a cadenas  del archivo asm generado por el LINUX DISSASEMBLER. 
 

;----------------------- corta por aqui ------------------------------------ 

#!/usr/bin/perl 
;######################################################################### 
;##           Extractor de SR's para archivos desensamblados por        ## 
;##               LINUX DISASSEMBLER 2.0799 de SiuL+Hacky               ## 
;##                      -=[Kódigo de ^pRoViDoR]=-                      ## 
;##   -=[ PLUG-agrupación de usuarios y desarrolladores de software     ## 
;##                         libre de  Palencia]=-                       ## 
;######################################################################### 

$arg=@ARGV; 
$file_input=$ARGV[0]; 
$file_output=$ARGV[1]; 
$conta=0; 
$string='=>'; 
$string2='Referencia a cadena'; 
if($arg==0){ 
 print "Uso de stractor v1.00==> perl stractor.pl archivoleer archivosalida\n"; 

open (FHANDLE, $ARGV[0]); 
open(OUTPUT, ">>".$ARGV[1]); 
while(<>){ 

 if (/Posible/){ 
         $mas=<>; 
  print OUTPUT $string2."\n"."Cadena Nº"." ".$conta." ".$mas."\n"; 
  $conta= $conta +1; 
  $inutil=<>; 
  $offplus=<>; 
  @offset= split(/\s/,$offplus); 
         print OUTPUT  "En la dirección => ".$offset[0]."\n"; 

                      }Xx 
           } 

;----------------------- corta por aqui ------------------------------------ 

 

[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers. 
Si necesitas contactar con nosotros, leeestoantes e infórmate de cómo puedes ayudarnos