Karpoff Spanish Tutor

Cracking desde cero para súper newbies 2


 

 

 INTRODUCCION

Saludos a todos los newbies seguidores del cracking desde cero para súper newbies !!!! (aunque pienso que ya debería quitarle el súper porque deben tener algo en la cabeza jeje !!!). En este tutorial no explicaré ningún crack, explicaré cosas que un cracker tiene que conocer lo mejor posible. Estas cosas son el registro y assembler básico y algo sobre el código ASCII. Si no entienden algo no sigan leyendo este tutorial hasta sacarse la duda de encima, y para ello, contáctenme a dek_oin@hotmail.com. Siempre respondo a todos los mails menos a los pedidos de cracks (para eso hay un montón de páginas web y además los crackers no enseñamos a la gente a ser unos llorones dependientes que solo saben mendigar!!!).

 

 AL ATAKE

Índice de los temas que trataremos:

 

1) De lo macro a lo micro

2) Registros

3) Ensamblador

4) El código ASCII

5) El registro de windows

6) Despedida y agradecimientos

 

 

1) De lo macro a lo micro

 

Bueno, bueno, comencemos. Cuando prendemos la computadora Windows (o Unix o Linux) se inicia. Pero, ¿qué son Windows Unix o Linux?. Son sistemas operativos. Un sistema operativo es la base por la cual se domina el inicio de las rutinas para procesar datos en el disco duro. Esto quiere decir que el sistema operativo permite "dominar" el procesamiento de datos en el disco duro (sin que se procesen datos nada funcionaría). Los sistemas operativos son grandes programas. Generalmente se programan el lenguajes de programación 100% orientados a objetos como C++. Dentro de poco Microsoft sacará al mercado una nueva versión del lenguaje Visual Basic que se llamará Visual Basic 7(ahora está hasta la 6) o Visual Basic 2000 que será un lenguaje 100% orientado a objetos y que no le tendrá nada que envidiar a C++ y otros lenguajes de programación. Pienso que posiblemente los sistemas operativos se puedan hacer en este nuevo lenguaje. Dentro del sistema operativo están los programas que hacen que tu PC sirva para algo. Los que crearon los primeros programas vieron que ocupaban demasiado espacio, y ocupar demasiado espacio significa perder más dinero, y por eso se crearon las dll. Dll significa Dynamic Link Library que por si no sabes inglés te digo que significa librerías dinámica de enlaces. Yo definiría cada dll como un libro. Un libro de donde se sacan funciones para ayudar a los programas para que estos no ocupen tanto espacio. Imagínate tener que crear un código para que lea cada función que el programa necesita para ejecutarse. Ocupa mucho menos espacio, es más funcional y más fácil crear las librerías de acceso dinámico. Son como bibliotecas "comunes" entre los programas ya que hay miles de programas que las utilizan (digo comunes ya que muchos programas utilizan por ejemplo la user32.dll) para ahorrar espacio y por varias razones más. Las dlls más comunes son:

c:\windows\system\toolhelp.dll
c:\windows\system\shell.dll
c:\windows\system\commdlg.dll
c:\windows\system\olesvr.dll
c:\windows\system\olecli.dll
c:\windows\system\mmsystem.dll

c:\windows\system\kernel32.dll<-------Estas especialmente
c:\windows\system\user32.dll <---------Estas especialmente

c:\windows\system\gdi32.dll
c:\windows\system\comdlg32.dll
c:\windows\system\shell32.dll
c:\windows\system\advapi32.dll
c:\windows\system\shell232.dll
c:\windows\system\comctl32.dll
c:\windows\system\crtdll.dll
c:\windows\system\version.dll
c:\windows\system\netlib32.dll
c:\windows\system\msshrui.dll
c:\windows\system\msnet32.dll
c:\windows\system\mspwl32.dll
c:\windows\system\mpr.dll

Dentro de las dlls están las funciones API. Cuando nos aparece un cuadro de diálogo como este:

se debe a la API messageboxa de la user32.dll. Esta es la librería más común en el cracking. Si quieres ver todas las API que hay dentro de user32.dll abre el W32Dasm abre la user32.dll (c:\windows\system\user32.dll), haz clic en el botón de exported functions y verás las APIs que contiene la user32.dll. No hay que saberse de memoria todas las APIs ya que son más de 2000 pero sí hay que conocer la mayor cantidad posible. Como siempre, cuanto más conozcan, mejor.

Bueno creo que me fui un poco del tema aunque tienen que saber lo que mencioné anteriormente. Estábamos en que dentro del sistema operativo están los programas. Los programas no son más que instrucciones (haz esto, haz lo otro) y cada instrucción no es más que un conjunto de bits. Pero, ¿donde se guardan los bits para que el programa funcione?. Los bits del programa se localizan en los ficheros. Hay algunos programas que no guardan todas sus instrucciones en único fichero, si no en varios, un ejemplo de esto son las dll (que ya los deben tener podridos !!!). Uno de los ficheros más comunes son los ficheros ini.

2) Registros

 

Para que la computadora pueda procesar información es necesario que existan celdas especiales llamadas registros. Los registros son conjuntos de 8 o 16 flip-flops. Un flip-flop es un dispositivo capaz de almacenar dos niveles de voltaje, uno bajo y uno alto. No entraré en detalle e iré a lo más importante. El nivel bajo de energía se interpreta por el procesador  como apagado o 0, y el nivel alto como prendido o 1. A estos dos estados se les conoce como bits, que son la unidad más pequeña de información en una computadora. 

A un grupo de 16 bits se le conoce como palabra, una palabra puede ser dividida en grupos de 8 bits llamados bytes, y a los grupos de 4 bits se les llama nibbles.

Los registros de datos principales son AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS y ES (estos son los que recuerdo ahora, no sé si me falta alguno). Si trabajamos en 32 bits o sea Windows 95 se les agrega una E delante por lo que quedarían EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, ECS, EDS, SS y EES.  Los registros se subdividen así:

EAX= 32 bits

AX= 16 bits

AH= 8 bits           AL= 8 bits

EAX es como el "padre" de 32 bits. AX es de 16 bits y a su vez se divide en AH y AL. AH significa Hight byte y AL significa Low byte. Esto quiere decir que por ejemplo si AX es 9851, entonces AH sería 98 y AL sería 51. O sea que se podría decir que AX= AH+AL.

¿Fácil no?(por ahora...)

Utilización de AX, BX, CX, y DX:

Esto es importante cuando se trabaja en el Soft Ice para encontrar números de serie válidos más fácilmente. Cada uno de estos registros tiene funciones especiales que es interesante conocer. Por ejemplo el registro AX es el llamado acumulador, hace que muchas operaciones tengan una forma más corta, ya que lo especifican implícitamente. Es decir, que hay operaciones que actúan sobre el registro AX en particular. BX se suele utilizar en muchas instrucciones como registro base, sobre todo en transferencias de datos entre memoria y procesador. CX es el registro contador, muchas instrucciones lo utilizan para hacer incrementos o decrementos automáticos, para realizar bucles, etc. DX es el registro de datos, se suele utilizar para operaciones de 32 bits, para almacenar los 16 bits (o palabra) más significativos.

Utilización de SI, DI, BP y SP

Se utilizan para acceder a memoria cuando se establece el modo de direccionamiento mediante indexación o con punteros. SI y DI indican el ¡índice fuente y destino respectivamente. BP y SP indican el puntero base y el puntero de la pila respectivamente. Más adelante hablaremos de la pila.

Estos 4 registros son de 16 bits, y no pueden ser utilizados como registros dobles de 8 bits, o sea, SI no se divide en SH ni en SL.

No me voy a seguir metiendo más en el tema porque los otros registros ya no son tan comunes. RECUERDEN QUE TODO REGISTRO DE 16 BITS SE LE AGREGA UNA E CUANDO ESTÁ EN 32 BITS Y QUE HAY ALGUNOS REGISTROS DE 16 BITS QUE NO SE DIVIDEN EN REGISTROS DE 8 BITS (AH, AH,) COMO POR EJEMPLO SI, DI, BP Y SP. Creo que los estoy confundiendo más. Por esta razón no entraré en el tema de los flags. El manual de ASM por Aesoft te puede ayudar de manera exhaustiva en estos y muchísimos más temas, si no lo tienes, mándame un mail a dek_oin@hotmail.com que te lo envío. 

3) Ensamblador

 

Bueno, comencemos con nuestro querido assembler. Assembler es un lenguaje de programación de bajo nivel. Esto quiere decir que a diferencia de C++ o de Visual Basic, cuanto más programemos o más programa creemos, menos control tendremos sobre este. El ensamblador es uno de los lenguajes de programación que está más cercanos al lenguaje humano. ¿No entiendo, explícame porqué?, pues porque casi todas sus instrucciones son derivadas del inglés como je= jump if equal o cmp=compare y hay varias más. Esto lo convierte en uno de los lenguajes más fáciles de aprender. Cuanto más sepan de assembler, más rápido y mejor crackearás. Veremos el significado de las instrucciones que he considerado más "apropiadas" para un newbie que sólo ha leído un tutorial y que ahora se encuentra leyendo uno.

La pila

La pila es una característica interna del 8086. Es una estructura de datos situada en la RAM. Proporciona a los programas un lugar donde almacenar datos de forma segura, pudiendo compartirlos con otros procedimientos o programas de forma cómoda y práctica.

La función más importante de la pila es la de mantener las direcciones de retorno en las llamadas a procedimientos e interrupciones, as¡ como guardar los par metros pasados a estos procedimientos. La pila también se utiliza para almacenamiento temporal de datos dentro de un programa, y para muchas cosas más que se aprenden con la práctica.

La pila tiene su nombre por analogía con los montones de platos apilados (pilas de platos). Cuando un dato nuevo es introducido en la pila, se dice que es apilado (push) debido a que se sitúa por encima de los demás, es decir se sitúa en la CIMA de la pila.

Una pila opera en el orden último en entrar, primero en salir, es como la "regla básica" de la pila.

Las instrucciones para manejar la pila son:

PUSH---------> Guarda un dato en la pila. Decrementando SP en 2 unidades, para que    apunte al nuevo elemento a introducir. Ejemplo: PUSH AX--> Apila el contenido de AX en la cima de la pila.

POP----------> Obtiene un dato de la pila. Incrementando SP en 2 unidades, para que apunte al nuevo elemento a introducir. Ejemplo: POP AX --> Desapila el    contenido de la cima de la pila en el registro AX. Es decir, AX contenía  el valor que había en la cima de la pila, y el puntero de pila se actualiza incrementándolo en 2.

PUSHF--------->Guarda el contenido del registro de estado (FLAGS) en la pila. Decrementando SP en 2 unidades, para que apunte al nuevo elemento a introducir. No es necesario indicar sobre qué actúa esta instrucción, lo lleva implícito en su nombre PUSHF (PUSH FLAGS).

POPF----------> Introduce en el registro FLAGS el contenido de la cima de la pila.    Incrementando SP en 2 unidades, para que apunte al nuevo elemento a introducir. Al igual que con la instrucción anterior, no es necesario indicar sobre qué actúa esta instrucción POPF (POP FLAGS).

Trata de aprender todo esto pero si no tienes buena memoria piensa que la pila es un lugar en la RAM (supongo que ya sabes todo eso) donde se guardan los datos temporalmente.

Algunas instrucciones del Assembler:

ADD
ADD significa sumar. Suma el contenido del operando fuente al operando de destino( y almacena el resultado en este).


AND
Significa "y". Esta instrucción realiza un Y lógico de los operándos y almacena el resultado en el operando de destino. Cada bit del byte o palabra(¿recuerdas lo que eran?) resultante se activa en 1 solo si el bit correspondiente de cada operando también se activa en 1. Las banderas de acarreo y de sobre flujo se limpian mediante esta operación. O sea que:

Primer término Segundo término Resultado
0 0 0
0 1 0
1 0 0
1 1 1

CALL
CALL hace esto: 1) mete la dirección de desplazamiento de la siguiente instrucción en la pila; 2) si el procedimiento llamado se declara domo far (lejano), mete la dirección de segmento de la siguiente instrucción en la pila; 3) carga IP (puntero a instrucción) con la dirección de desplazamiento del procedimiento llamado; y 4) si el procedimiento llamado se declara como far, carga CS (segmento de código) con la dirección de segmento del procedimiento llamado.
La ejecución continua entonces en la recién cargada dirección CS:IP hasta que se encuentre RET. Sé que al principio cuesta un poco, pero por ahora lo único que tienen que saber sobre esta importantísima función en el mundo del cracking es que es como una llamada. Llama a otras líneas de código (las instrucciones del programa) para que sean ejecutadas hasta llegar a una instrucción  ret que significa "retorno".

CMP
Proviene de compare que significa comparar. CMP se considera una instrucción aritmética debido a que el operando fuente se sustrae del operando destino. Sin embargo, el resultado se emplea para activar las banderas; no se almacena en ningún lugar. Se puede hacer una prueba posterior de las banderas para el control del programa. Por ahora solo tienen que saber que compara.

INC
Incrementar: INC cambia, mediante incrementos de 1, el contenido del operando.

JA
Saltar si es arriba o mayor: JA ocasiona que la ejecución de un programa se ramifique hacia la dirección del operando si la bandera de acarreo esta limpia. Esta instrucción es funcionalmente igual que JNB o JNC.

JB
Saltar si es abajo o menor: Lo mismo que arriba pero si la bandera de acarreo eta activada.

JBE
Saltar si es abajo o igual: Lo mismo que arriba pero si esta activada la bandera de acarreo o la de cero.

JCXZ
Saltar si CX=0: Lo mismo que los anteriores pero si el valor de CX=0.

JE
Saltar si es igual: Salta si la bandera de cero esta activada. Es equivalente a JZ.

JG
Saltar si es mayor.

JGE
Saltar si es mayor o igual.

JL
Saltar si es menor.

JLE
Saltar si es menor o igual.

JMP
Saltar: Salta directamente a la dirección del operando.

JNA
Saltar si no es arriba: Salta si esta activada la bandera de acarreo o de cero. Es funcionalmente igual que JBE.

JNAE
Saltar si no es arriba o igual.

JNB
Saltar si no es abajo

JNBE
Saltar si no es abajo o igual: Salta si tanto la bandera de acarreo como la de cero están limpias.

JNE
Saltar si no es igual.

JNZ
Saltar en no cero: Salta si la bandera de cero esta limpia. Es lo mismo que JNE.

JZ
Saltar en cero: Salta si la bandera de cero esta activada. Es funcionalmente igual que JE.

LEA
Cargar la dirección efectiva. LEA transfiere la dirección de desplazamiento del operando fuente al operando de destino. El operando de destino debe ser un registro general de palabras.

LEAVE
Salida de procedimiento de alto nivel: Deshace los cambios realizados por la instrucción ENTER. Esta instrucción se usa para salir de subrutinas de lenguajes de alto nivel.

MOV
Transferir: MOV copia el contenido del operando fuente en el operando de destino. Ambos operándos deben tener la misma longitud. Por ejemplo mov AX, 117h (la h significa que está en hexadecimal) ahora el registro AX vale 117h

MOVSB
Transferir una cadena, byte por byte. Los valores de SI y DI cambian en incrementos o decrementos de 1, dependiendo de la activación de la bandera de dirección. Normalmente, esta instrucción se usa con la instrucción REP a fin de repetir la transferencia para un máximo de bytes de CX.

NEG
Negar: NEG calcula el complemento a dos del operando de destino y almacena el resultado en ese operando. Este calculo es efectivamente igual que restar el operando de destino de 0.

NOP
Ninguna operación: NOP simplemente toma espacio y tiempo y ocasiona que la UCP no haga nada en hexadecimal son los famosos 90. Es importantísima!!!.

NOT
NO lógico en bits: Invierte los bits en el operando destino (0 se convierte en 1 y viceversa) y almacena los bits invertidos en el operando de destino. Gráficamente (aunque pienso que ya lo deben haber entendido):

 

Término Lo invierte
0 1
1 0

OR
Or lógico en bits: Esta instrucción realiza un O lógico de los operándos y almacena el resultado en el operando de destino. Cada bit del byte o palabra resultante se pone en 1 si uno o ambos bits correspondientes a cada operando se ponen en 1. Gráficamente:

 

Primer término Segundo término Resultado
0 0 0
0 1 1
1 0 1
1 1 1

POP
Sacar datos de la pila: POP traslada una palabra o una palabra doble (dependiendo del tamaño del operando) de la pila y la coloca en el operando de destino deseado.

PUSH
Coloca datos en la pila: Coloca una copia del valor del operando en la pila.

RET
Volver de la subrutina: Al sacar a IP de la pila, RET transfiere el control del programa de vuelta al punto en que se emitió un CALL. Si CALL fuera una llamada a un procedimiento far, tanto CS como IP serian sacados de la pila. Si RET tiene un valor de retorno especificado, la pila se ajusta según ese numero de bytes.

SUB
Restar: Resta el contenido del operando fuente del operando de destino y almacena el resultado en este.

TEST
Probar bits: Realiza un Y lógico(¿recuerdas la operación AND?, bueno, significaba Y) de los operándos, pero el resultado no se almacena. Solo las banderas se afectan. Cada bit del byte o palabra resultante se activa en 1 solo si el bit correspondiente de cada operando es 1.

XOR
O exclusivo lógico sobre bits: Esta instrucción realiza un XOR lógico de los operándos y almacena el resultado en el operando de destino. Cada bit del byte o palabra resultante se pone en 1 solo si el bit correspondiente de cada operando contiene valores opuestos. Por ahora solo tienes que saber que torna los registros en cero.

Por supuesto hay cosas que no se las tienen que aprender ahora, pero las escribo para el que tenga buena memoria y quiera aprenderse todo lo que he escrito para ganar un poco de tiempo. Aquí abajo les pongo una tabla con los saltos que consideré que por ahora tienen que saber, te recomiendo que la imprimas para hacer uso de ella cuando estés crackeando:

Hexadecimal: ASM: Significa:
75 o 0F85 jne salta si no es igual
74 o 0F84 je salta si es igual
EB jmp salta directamente a.....
90 nop ningún funcionamiento (No OPeration)
77 o 0F87 ja salta si es superior
0F86 jna salta si no superior
0F83 jae salta si es superior o igual
0F82 jnae salta si no está sobre o igual
0F82 jb salta si está debajo
0F83 jnb salta si no está debajo
0F86 jbe salta si está debajo o igual
0F87 jnbe salta si no está debajo o igual
0F8F jg salta si es mayor
0F8E jng salta si no es mayor
0F8D jge salta si es mayor o igual
0F8C jnge salta si no es mayor o igual
0F8C jl salta si es menor
0F8D jnl salta si no es menor
0F8E jle saltan si es menor o igual
0F8F jnle saltan si no es menor o igual

Si ya tienen esta tabla de mi anterior tutorial, bien. Algo que creo que no expliqué en mi tutorial anterior y que quisiera explicar ahora para sacar posibles dudas es que cuando lean un tutorial sobre cracking y los números como los offsets y algunos más no son los mismos que muestra el tutorial del cracker, no se preocupen. Solo son las variaciones de memoria en los ordenadores. También puede llegar a ser un cambio de versión del producto, es decir, que el cracker haya escrito un tutorial sobre la versión 2.1 y ustedes están con la versión 2.3, es que cambian tan poco las protecciones últimamente !!! (o simplemente no cambian). En fin, peor para los programadores.

4) El código ASCII

Ya sabemos (supongo) pasar de hexadecimal a binario, hexadecimal a decimal, binario a decimal y etc. Ahora empezaremos con el código ASCII. ASCII es la abreviatura de American Standard Code for Information Interchange. En este código se le asigna un valor hexadecimal a cada carácter. Los valores son diferentes para las mayúsculas y minúsculas. Por ejemplo la @ se hace con Alt+64 y yo siempre la hago de esa manera porque me resulta más fácil y rápido.  El código ASCII también se puede utilizar para cosas muy tontas como esta:

Si ven bien, verán que puedo cambiar el texto de la nag desde el Hex Workshop, originalmente decía HEXpert for Windows 9x,  he visto tutoriales sobre esto, pero no le encuentro ninguna utilidad. Para lo que también sirve es para eliminar por ejemplo un texto que nos dice que tenemos que registrarnos o cosas molestas.

Aquí pongo los símbolos más usuales en el código ASCII:

Letras Minúsculas   Letras Mayúsculas  

Símbolos

 

 Números

 
Letra Cód. ASCII Letra Cód. ASCII Símbolo Cód. ASCII Número Cód. ASCII
a 61 A 41 ¿ A8 0 30
b 62 B 42 ? 3F 1 31
c 63 C 43 ¡ AD 2 32
d 64 D 44 ! 21 3 33
e 65 E 45 " 22 4 34
f 66 F 46 @ 40 5 35
g 67 G 47 # 23 6 36
h 68 H 48 $ 24 7 37
i 69 I 49 % 25 8 38
j 6A J 4A & 26 9 39
k 6B K 4B / 2F    
l 6C L 4C \ 5C    
m 6D M 4D ( 28    
n 6E N 4E ) 29    
ñ A4 Ñ A5 = 30    
o 6F O 4F * 2A    
p 80 P 50 + 2B    
q 71 Q 51 - 2D    
r 72 R 52 < 3C    
s 73 S 53 > 3E    
t 74 T 54 [ 5B    
u 75 U 55 ] 5D    
v 76 V 56 , 2C    
w 77 W 57 . 2E    
x 78 X 58 ; 3B    
y 79 Y 59 : 3A    
z 7A Z 5A _ 5F    

 

5) El REGISTRO de Windows

 

Trozo del proyecto Nakarko'99 por karlitoxZ

¿Qué es el registro de Windows?. El registro es una base de datos definida por el sistema que tanto Windows como las aplicaciones que sobre él funcionan, utilizan para guardar y obtener información sobre determinadas configuraciones. En él podemos encontrar desde las extensiones asociadas a cada programa, el lugar donde están determinadas dlls, el contenido de menús desplegables, los drivers necesarios para nuestro HD y hasta las últimas páginas web que hemos visitado. Casi un 100% de lo que en nuestro PC ocurre está grabado en el registro, poco escapa de sus garras. La información que se guarda en nuestro registro es información en binario, esta información varia dependiendo de la versión de windown en uso y del hard/software que tengamos instalado.

El registro está dentro de dos archivos, system.dat y user.dat que suelen ser de tamaño aberrante (más de 2 megas).

El registro es accesible y modificable gracias al REGEDIT.EXE uno de los muchos programas "escondidos" en el directorio Windows (se ubica en c:\windows\regedit.exe)

Estructura del registro. 

El registro almacena datos en forma de árbol jerarquizado, cada rama del árbol es llamada "Key" , cada "Key" puede contener "SubKeys" y entradas de datos llamadas "Values" . Para haceros una idea de cómo es esto imaginaros "Key" como un directorio donde hay subdirectorios "Subkey" y ficheros con datos "Values". 

Muchas veces la presencia de una "Key" es lo único que necesita un programa para funcionar, otras veces nos encontramos con uno o varios "Subkeys" y/o "Values" dentro de una "Key", una "Key " puede tener tantos "S" y "V" como necesite y los "Values" pueden estar en cualquier formato. 

Cada "Key" tiene un nombre que consiste en 1 o más caracteres imprimibles en formato ANSI, esto es, caracteres con valores de rango 32-127, estos nombres no pueden empezar por "\" (backslash o antibarra) ni por " * ó ¿". Las "Key" que comienzan por un punto ( . ) están reservadas. 

Cada "Subkey" sólo está definida en la "Key" inmediatamente superior al nivel donde la "Subkey" se aloja, de esto sacamos dos cosas, dentro de diferentes "Key" podemos tener "Subkeys" de nombre idéntico y además estas "Subkeys" no tienen por qué tener nada que ver, cada rama del registro es independiente de las demás a no ser que dentro de la rama se explique la relación existente entre las dos.

--------------------Termina el trozo del proyecto Nakarko--------------------------

Adelante, explora como funciona el registro. Fundamentalmente usaremos la rama HKEY_CURRENT_USER\software\ para crackear. Si hay un programa que no puedes crackear y expira, lo que puedes hacer es ir a la rama HKEY_CURRENT_USER\software\ encontrar el programa o en algunos casos, la marca del programa que queremos crackear, y borramos toda la información que encontremos. Luego inicia el programa y si es que la información no quedó guardada en otro lugar más que en el registro (el día de la instalación pudo haber quedado guardado en algún fichero, etc.) verás que "engañaste" al programa y ahora piensa que la instalación se finalizó cuando tu ejecutaste el programa. Es decir, como antes tu habías borrado la información del registro, el programa necesita chequear en algún lado esa información para saber la fecha de instalación o los días que le quedan a la versión de evaluación, el programa no puede ejecutarse sin esa información entonces la tiene que introducir de nuevo, pero no la guarda con el día original de la instalación porque esa fecha fue borrada por ti, el programa "cree" que terminó la instalación cuando lo ejecutaste por primera vez luego de borrar la fecha de instalación y demás del registro. Creo que los confundí, hasta yo estoy confundido.

Bueno, esto fue todo. Este es un largo texto así que debe estar lleno de errores, si los notan, por favor avísenme. Cualquier cosa que se les ocurra menos pedidos de cracks, consúltenme a mi mail dek_oin@hotmail.com. Siempre contesto a todos los mails. Hablando de mails, gracias a todos por los  que he recibido con elogios y demás. Eso me hace ver que mis tutoriales sirven para algo y que no estoy perdiendo el tiempo al escribirlos por lo que dentro de lo posible seguiré escribiendo más !!!. Si quieres profundizar en assembler lee el manual de ASM por Aesoft. Si no lo tienes, lo puedes conseguir en la selección manuales de la página de karpoff o en la página de Txeli.

Despedida y agradecimientos

Se termina todo, pero no puedo marcharme sin darle las gracias a mi nuevo grupo, K-FoR, por invitarme a ser miembro y por su apoyo. Gracias a Pr@fesor X por su fabulosa compilación y por el trabajo que está realizando en benficio nuestro grupo. Gracias también a Karpoff, por su *gran* ayuda y sus consejos, y a Txeli, por su apoyo moral y por pasarme algunos programas interesantes. Y finalmente gracias a ustedes por leer mi manual.

Gracias a todos y,

A S T A L A V I S T A


Página oficial del grupo K-FoR: http://pagina.de/kfor
Mi dirección de E-Mail: dek_Oin@hotmail.com

 

 

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com