Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La Biblia Del Hacker
La Biblia Del Hacker
%,%/,$
'(/
+$&.(5
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª,
,
distinto de los demás. El • Protecciones a nivel Código • Pokes en las variables del
sistema de protección que ha Máquina. sistema.
utilizado una casa, además de
• Protecciones a nivel • Anti-merge en los
proteger el programa, tiene
Hardware. programas.
que protegerse a sí mismo para
evitar que otra casa lo utilice. • Rutinas de carga distintas de • C.M. En la zona de edición.
Por otra parte, no existe un las normales.
• C.M. En la zona de
sistema de análisis que pueda variables.
Las protecciones a nivel
aplicarse a todos los
basic • Protección turbo.
programas como se se tratase
de la piedra filosofal. No El Basic es un lenguaje
Protecciones a nivel C.M.
existe lo que podríamos llamar bastante más sencillo que el
"los diez mandamientos del árido Assembler, sin embargo En lenguaje Assembler
Hacker", al contrario, en esta las protecciones a nivel Basic también se pueden hacer
metáfora existiría toda una pueden producir más dolores protecciones bastante potentes,
Biblia completa que podría de cabeza de lo que en un sin embargo, a idénticos
llenarse de información principio puede suponerse. conocimientos de ambos
referente al tema. De ahí el Para enfrentarse con este tipo lenguajes resulta más sencillo
nombre de la serie. de protecciones es necesario entrar al C.M.; piénsese que al
tener conocimientos de cómo ser un lenguaje más rígido se
Sólo la experiencia, un
funciona el SO (Sistema pueden realizar menos
profundo conocimiento del
Operativo) ante una situación trampas. Te puedes encontrar
lenguaje Assembler y, sobre
determinada. con:
todo, del sistema operativo del
Spectrum, pueden ser las El 99 por 100 de los • Corrompimiento de la pila.
cualidades del verdadero programas llevan protecciones
• "Popeo" de la dirección de
"Hacker". de este tipo; piénsese que es lo
retorno.
primero que se encuentra el
En esta serie utilizaremos en
Hacker al intentar entrasr en • Uso de nemónicos
todo momento términos y
un programa y es el primer inexistentes.
sistemas SENCILLOS, dentro
ladrillo que debemos apartar.
de lo que cabe. Si se tuviese • Enmascaramiento de código
El nivel de protección es, bajo
cualquier duda puede ser una con registro R.
cierto punto de vista , más alto
inestimable ayuda y
que lo que se puede encontrar • Checksum´s variados
complemento el curso de C.M.
en C.M. ya que aquí se pueden
Que está en las páginas • Enmascaramiento con
hacer más trampas en el ya
centrales de esta revista desde pantalla.
intrincado juego.
el número 42.
Dentro de las protecciones a • Longitud excesiva de bytes.
La estructura de los nivel Basic, podemos • Solapamiento del cargador.
sistemas de proteccion encontrar:
• Opacidad en la asignación
Vamos a empezar por una • Lineas 0 (cero). de los vectores de carga.
clasificación genérica de las
distintas protecciones con las • Controles de color. • Basura en listados.
que un usuario puede • Basura en los listados. • Saltos a 0 por error de carga.
encontrarse. En primer lugar
existen: • C.M. En lineas REM. • Deshabilitación del "Space"
• Protecciones a nivel Basic • Literales ASCII retocadas. • Proteccion turbo.
Rutinas de cargas • Tono guía de distinta que una tarjeta esté conectada
distintas. frecuencia. en el bus de expansión para
La mayoría de los programas funcionar. Ests no no darán
• Tono guía ultracorto. excesivos problemas ya que la
llevan ahora un sistema de
carga distinto al estándar de la • Programas sin cabecera. única finalidad de este
dispositivo es cerciorarse de
ROM. Esto se hizo en un • Tono guía en medio de los
que se posee el programa
principio para que los bytes.
original.
"copiones" no pudieran copiar
el programa en cuestión. Se • Bloques "pegados" En otras ocasiones , parte del
pueden encontrar rutinas de • Rutinas de carga "aleatoria" software se halla soportado
carga de todo tipo, algunas en vez de secuencial. por una memoria EPROM; en
tienen sólo el objeto de hacer este caso un nombre más
más vistosa la carga, pero Protecciones de acertado es el de FIRMWARE
complican las cosas a la hora Hardware por ser un software
de estudiarlas. Por último, nos podemos FIRMEMENTE unido a la
encontrar con distintas memoria. Este es de difícil
• Protección turbo.
modificación y se precisan ,
protecciones hardware.
• Distinta velocidad en Algunos programas necesitan además , conocimientos de
baudios. hardware. Pero todo se andará.
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª,,
,,
dos códigos dentro del listado color el listado saldrá visible. va a continuar el listado. En
m uno es el control La otra se verá más adelante. una linea del Basic se han de
propiamente dicho, y otro es el dejar tres espacios en blanco,
Un consejo: editar una linea de
valor al que cambia este. en el primero irá el control de
un programa puede llevar
Suponte que tienes un listado AT, y en los siguientes las
perfectamente a hacer que el
en la pantalla y que solo ves listado se corrompa en caso de coordenadas.
un 0 (cero): haz el POKE para que se haya utilizado la Pokeando en los dos espacios
cambiar el valor por 1 y edita protección de las literales disponibles para las
la linea. Ahora desplaza el ASCII retocadas. coordenadas se puede lograr
cursor hacia la derecha pero que al hacer LIST salga
con cuidado, parando en el Controles de cursor automáticamente el informe
momento en que este no se De la misma forma, también "entero fuera de rango", dando
vea. "Deletea" hasta que éste pueden ponerse controles de como coordenadas unas
sea perfectamente visible: cursor, haciendo que el listado imposibles, por ejemplo, AT
seguro que la linea también lo comience en la parte superior 40,0.
es en este momento. Si no lo de la pantalla y que al De igual manera, con los
fuera tendrías que volver a continuar lo haga otra vez controles cursor izquierdas, y
repetir la operación hasta sobre la primera linea. derecha, 8 y 9, se puede lograr
conseguirlo, pues puede haber También puede salir el enmascarar parte del listado,
más de uno. informe "entero fuera de sobreescribiendo encima del
Hay otras dos formas de poder rango". Vamos a ver esto más mismo.
contemplar un listado , aunque detenidamente:
Estos controles de cursor no se
posea controles de color, sin Entre los códigos ASCII el 22 pueden poner ni quitar en
necesidad de tener que editar es el control de AT; cuando el modo edición, por lo que hay
las lineas. SO se encuentra este control que hacerlo a base de POKES.
Una es haciendo un LLIST interpreta los dos siguientes
con una impresora; como esta como coordenadas del cursor,
no reconoce los controles de en baja resolución, donde se
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª,,,
,,,
.
Un caso típico es que cuando Teclea GOTO 1000 y prueba Por último, vamos a ver la
hacemos LIST, no sale nada, y algunos controles: Primero forma de sobreescribir en el
además se nos presenta el uno, por lo que responde a la listado; responde a la primera
cursor con una interrogación. primera pregunta con un 1, y a pregunta con 3 y alas tres
Esto es porque se ha utilizado la segunda con un 6. Si haces siguientes con 22,0 y 0.
un control AT con LIST verás que el texto de la Veremos como el número de
coordenadas falsas. Todo esto primera linea se ha desplazado la primera linea ha
es en realidad basura dentro a la columna central de TAB, desaparecido imprimiendose el
del listado para evitar que se tal y como si hubieramos texto de la primera linea REM
vea. Pero la mejor manera de utilizado PRINT con coma. en las coordenadas 0,0.
aprender todo esto es Este control es el 6.
Otra consecuencia de tener
practicando, por lo que vamos
Responde ahora a las primera basura en el listado es que si
a exponer unos ejemplos
pregunta con 1, y a la segunda conseguimos editar la linea, no
sencillos:
con 22; este es el control de la podemos modificar debido a
Primero teclea lo siguiente AT. Puesto que los dos que constantemente está
teniendo la memoria del siguientes valores son dos 32, sonando el zumbador de
ordenador limpia: que corresponden al espacio, alarma por el error que,
!" #$ '% & () * - + / ,0. cuando pulsemos "ENTER" intencionadamente,se ha
12 3 4 34 5 8 6<-7 9=: 4 3 ; para hacar un listado introducido en ella.
/><A? @ 8 B<C 0D/E automático no nos saldrá y
F G HI 'J 8 D KL DM Esto último también puede ser
OCN @ 8 B<K DM PM Q8@ - C =R D 0M /E tendremos el cursor junto con
debido a que en el listado
S=T T T U=V W `OX Y =Z - W 8 [<\ ]^ _ una interrogación. Sin
existe un CLEAR que situe el
ca- b d embargo, al dar la orden LIST RAMTOP excesivamente bajo
e=/ f =e f gOh i / j mkl 8 n o- o k=p q saldrá inmediatamente el error
r s tu uv wx yx z { para permitir la edición.
"entero fuera de rango".
wz y |t u uv w x yx ~ y} La basura de un listado se
{z Si tecleamos GOTO 1000 e
introduce con la finalidad de
=
introducimos el control de AT
0
/ 8 < c -= 8 con unos valores adecuados
corromper el programa si
0
/ 8 < c -= cambiaremos las coordenadas
tratamos de editar lineas o
= = `O = - ¢A < 8= ¡ del listado. Responde a la
modificarlo en alguna de sus
c £-¤ ¥ ¨ ¦®§ © ª« ¬ ¥ partes.
¯=° ± ° ²³ O´ µ ¶ primera pregunta con 3 y a las
·=¸ ¹ ¸ `ºO » ¼ ½ tres siguientes con 22, 10 y 10. Hay que buscar alguna forma
El listado aparecera dividido de poder ver un listado sin
en dos trozos.
tener que modificar ninguna cambiar el número para que longitud de lo normal. Lo
linea. sea legal. hemos visto en muy pocos
programas dado que también
En primer lugar, es Estos dos octetos se ponen al
confunde al SL , y una cosa
conveniente saber algunas revés de cómo sería de
que hay que tener muy clara,
cosas acerca de cómo se esperar. El primero es el más
todas las protecciones a nivel
organiza un programa Basic en significativo y el segundo el
Basic que podemos encontrar
la memoria. Las lineas de de menor peso, esto es así para
tienen la particularidad de que
programa se guardan en la que el interprete funcione más
confunden el listado, pero
memoria de la siguiente rápido.
nunca al SO.
forma: primero dos octetos Después de estos dos bytes
que indican el número de linea En el texto dela linea se
vienen otros dos que indican la
de que se trata. Si nosotros guardan todos los tokens y
longitud de la linea incluyendo
pokeamos en esa dirección con literales por sus respectivos
el código de "Enter" del final.
otro valor, cambiaremos el códigos ASCII, pero hay una
Seguro que ya se te está
número de linea. Podemos particularidad: los números.
ocurriendo que podemos
ponerlo a "0" (cero) o incluso Después del texto de la linea
variar tambien esta
a un número imposible, mayor viene un control de "Enter"
información para complicar
de 9999, dado que en dos (13), que marca la frontera
más las cosas. Ello es posibñe
octetos cabe cualquier número entre lineas.
haciendo que estos octetos
menor de 65535. Obviamente contengan unos datos falsos,
el efecto contrario también es marcando más o menos
posible, es decir, podemos
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª,
,99
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9
Vamos a tratar ahora de la igualmente que todo el resto tokens y literales incoherentes.
protección que raya la frontera del listado se haya protegido Cuando veas esto... NO LO
entre el Basic y el CM. Es el con controles de color. Si TOQUES!!!, es mejor
caso de los cargadores que quitamos éstos, el programa en inspeccionarlo tranquilamente
tengan CM en las lineas del CM se reubicará con lo que con un desensamblador.
Basic o en las variables del cuando el cargador lo llame el Modifica su dirección con el
mismo Basic. mismo no funcionará. De ahí Copyline y examina su
la necesidad de ver el listado contenido.
Anteriormente apuntabamos la
con el Copyline publicado en
conveniencia de inspeccionar
anteriores semanas. Ejemplo de uso de
el listado Basic del cargador Copyupi en la
ubicando el mismo en otra El CM en lineas REM se modificacion de una
dirección a fin de modificar en reconoce por la visión de ésta cabecera.
nada su contenido, esta y a continuación una serie de
necesidad es imperiosa en el
caso de que el programa Basic
tuviera CM enmascarado en el
mismo.
Supongamos que existe una
linea Basic en medio del
listado en el que , despues de
un REM, se halla un programa ¾À¿ÂÁÄÃ'ÅÇÆÉÈËÊÀÌÎÍÏÁÄÌ`Ð=ÑÒÁÇÓ ÔÕÓ Ö×ÃÙØÉÚÛÃÄÍÜÓ ÖÝÖÞÑÇÈÃÇßËÊàÑÒÌâáãÌËÖÜßÒÖäÓ åÇÈÌÛÈçæ Ó ÈÒÌËÃèÙé
en CM; supongamos êìëÜíÒîðïñêìòËóÜôÄõÒöËó ÷Òø`ù=úÄ÷Ùû üàû ýÞþÇÿ Àø
Òû ýÞþÄ÷ÄúOþ äþÇÿ ãû ÿì÷Äø þO÷Ùû ÿ øËý×ýÜû
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9,
,
Una de las formas más habituales de guardar una rutina de carga de Código
Máquina dentro de un programa BASIC es hacerlo dentro de la zona de
variables. De esta forma, si alguien accede al listado no podrá verlo y si
ejecuta comandos del tipo RUN o CLEAR, la rutina desaparace por arte de
magia.
hace es una llamada a una Por esta razón, lo que se hace • Modificar la cabecera por
rutina a partir de lo que es guardar en esta variable de bytes para poderlo ubicar en
contiene la variable del dos bytes la dirección del otra dirección.
sistema VARS. Cuando nos elemento de la pila donde se
• Examinar el listado con el
encontremos con ello habrá halla el retorno de error. Así,
Copyline detalladamente, un
que tener cuidado, si estamos cuando el error se produce, el
POKE que se pase por alto
viendo el programa sin el SO mira esta dirección y hace
puede ser luego un muro
Copyline, de no hcar ninguna el salto a la misma.
infranqueable.
operación que modifique las El programa que haga la
variables. protección puede aprovechar • Estudiar la carga de los
Otra manera de llamar a un esto para pokear en esta demás bloques del programa,
programa en CM desde el variable una dirección y luego es posible que creamos que
basic sin que esta llamada se producir cualquier error, o está superprotegido y luego
note es hacer un POKE en la bien por los métodos sea un juego de niños.
variable del sistema ERR SP o normales, BORDER 9 por • No dejarse engañar: muchas
puntero de la dirección debido ekemplo, o bien pokeando veces sentencias de un listado
a que tiene un nivel de tambien en la variable del Basic pueden estar "de
protección superior a las sistema ERR NR la cual se adorno" para confundir al
anteriores. Vamos a estudiarla encarga de contener el informe "Hacker". Tampoco se debe
detenidamente. de error que se ha producido. despreciar ninguna : un simple
Cuando se ha de presentar un Con esto se consigue que el BORDER 5 puede significar
informe de error, el SO mira la SO haga directamente un salto que luego se chequea la
variable ERR SP que indica la a una rutina CM que se variable del sistema BORDCR
direccion del elemento de la encuentre ubicada en la para ver si está el color
pila de máquina que contiene, dirección contenida, a su vez, previsto.
a su vez, la dirección donde se en los dos bytes hacia los que • En algunos listados las
hayan las rutinas de apunta la variable. literales ASCII retocadas
tratamiento de errores y acto En esto se basa la protección proliferan como setas,
seguido, transfiere el control turbo a nivel Basic, pero de mientras que en otros no se ha
del programa a esa dirección. esto ya hablaremos más usado esta protección.
El SO hace esto así por varias adelante. • Es muy interesante que
circunstancias, pero la más mientras se va viendo el
importante es que en el Resumen listado con el Copyline se
momento en que se produce el Por lo general la filosofía que vaya apuntando en un papel un
error normalmente la pila de hay que seguir a la hora de listado "limpio" para que
maquina está desequilibrada entrar en un programa Basic es después de quitar la "paja" se
por lo que un simple RET muy sencilla. pueda estudiar con más
produciría qie el error no se facilidad.
pudiera tratar o que se colgara
el ordenador.
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9,,
,,
/$%,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9,,,
,,,
Cuando analizamos por primera vez una rutina de carga en Código Máquina
es muy facil que se nos pasen algunas cosas por alto, como por ejemplo,
que la rutina cargadora esté en una dirección en donde se va a ubicar el
propio bloque de bytes, solapándose con la primera.
.
Si el programa que estamos Si su dirección de comienzo
viendo tiene esta característica Carga desde la rutina
LOAD de la ROM nos lo permite, se puede cargar
olvidaros de todo lo que veais en el sitio de trabajo normal,
después del CALL a la rutina Siempre que nos encontremos ejecutando previamente un
cargadora ya que después de una carga estándar de la ROM CLEAR direccion -1 y luego
concluir la carga es muy pero sin cabecera, hay que ubicar un desensamblador en
improbable que la rutina averiguar la longitud y algún sitio de la memoria libre
permanezca inalterada. Esta es dirección donde se ubican los para proceder a su
la protección de solapamiento bytes y hacer una cabecera a desensamblado. Para este
del cargador. Incluso es medida para poder cargar cometido es fundamental
posible que el programador desde Basic en otra dirección disponer de un
que protegió el programa haya más cómoda para su estudio. desensamblador perfectamente
puesto cosas perfectamente Esto se hace de la siguiente reubicable, como por ejemplo
coherentes después del CALL manera: el MONS.
a la rutina de carga, pero ello
Si vemos que al registro DE se En el caso arriba expuesto de
es únicamente para despistar.
le asigna el valor 30000, por que los bytes quese cargen se
Otra protección con la que nos ejemplo, es que la longitud del solapen con la rutina
podemos encontrar bastantes código es de 30000. Hay que cargadora no hemos podido
veces es que una vez sumada apuntarlo para que no se nos averiguar la direccion de
la longitud del bloque de olvide. comienzo del programa. Es
código con la dirección donde muy sencillo saberla: es la
Luego buscamos el comienzo
se ubica este de un número dirección de memoria que
en el registro IX; supongamos
mayor de 65535 por lo que la sigue el CALL al la rutina
que es el 25000.
carga, después de terminar con cargadora; por ejemplo:
la dirección más alta del En este ejemplo para crear una 25000 LD IX,24000
ordenador continua con la cabecera teclearíamos : SAVE LD DE,3000
ROM, y hasta es posible que "nombre" CODE 25000, LD A,255
secuencialmente llegue hasta 30000, pero grabaríamos sólo SCF
la pantalla. Ello no es más que el primer bloque (cabecera), CALL LOAD
una pérdida de tiempo y cortando la grabación justo en 25013 PATATIN
normalmente se utiliza para el espacio vacio entre ambos. PATATAN
que al ser tan enorme el A continuación, con el
bloque de bytes, no quepa en Copyupi, grabaríamos después La dirección de ejecución del
ningún copiador. el bloque sin cabecera para código estaría aquí en la
poder cargarlo más facilmente. 25013, así que a partir de ahí
es donde debemos sino para eludir el que pueda Este es un método sencillo,
desensamblar. verse COMO ha hecho ciertas pero es el más utilizado debido
rutinas y evitar que otras a que consume poca memoria.
Enmascaramientos y personas puedan copiarselas. Otra forma parecida de
Checksums realizar un checksum podría
Checksums ser que en vez de efecutar una
Vamos a introducirnos ahora
en el estudio de las distintas Checksum es una palabra operación XOR en la etiqueta
protecciones que se pueden inglesa que significa LOOP se efectuase en ADD,
imprimir en el código objeto literalmente suma de chequeo con resultados ligeramente
del programa principal (una y eso es lo que es, una suma distintos.
vez cargado) como puede ser de todos los bytes que Se podrían anidar varios
checksums, enmascaramiento componen el programa y una checksums seguidos con
con el registro "R" y otras comparación con una cifra. diversos sistemas, con un alto
operaciones por el estilo. Huelga decir que si no grado de inteligencia en las
coinciden el programa se operaciones realizadas, pero,
Partimos del caso de que ya
colgará o saltará a la direccion afortunadamente, en nuestros
tenemos el programa bien
0 (cero). modestos Spectrum no se
estudiado y sabemos dónde se
ubica y en qué dirección El checksum se hace pueden desperdiciar unos
arranca. principalmente para evitar el preciosos bytes en codificar
que podamos modificar con algo tan complejo (o sí...) por
Abordar ahora este asunto lo que será normalmetne un
algún POKE el programa en
puede parecer ilógico ya que simple checksum, eso sí,
cuestión, y hasta es posible
faltan por explicar las rutinas debidamente escondido, es
que el programa lo podamos
de carga distintas de la normal decir, que no estará en la linea
arrancar modificado sin que
y otras cosas interesantes, pero de desensamblado que
actúe. Pero es probabilísimo
no lo es tanto si se piensa que normalmente sigamos.
que se halle en el programa
este tema se engloba dentro de
que estemos mirando y que Una solución para evitar los
las protecciones en CM.
actúe en el momento en que efectos de un checksum puede
Una vez que empecemos a menos nos lo esparamos. Esta ser un simple POKE en una
desensamblar el código objeto protección se conoce como dirección de memoria qu eno
se puede pensar que todo lo BOMBA DE TIEMPO en la se use, pero que esté dentro de
que encontraremos a jerga informática. las posiciones que explora el
continuación está exento de checksum ,contrarestando los
Una forma genérica de
protecciones y que ya tenemos otros POKES que vayamos a
checksum sería la siguiente:
un campo liso, sin ninguna realizar. Esta última soluciçon
muralla que nos estorbe. Nada LD HL,25000
LD BC,40000 es arriesgada porque
más lejos de la realidad , ya desconcemos exactamente
que el código objeto del LD A,0
LOOP XOR (HL) cuál es el método utilizado
programa puede muy bien para realizar la comprobación.
INC HL
estar protegido de miradas
ajenas por las protecciones que DEC BC Todo esto si no hemos
LD A, B conseguido encontrar la rutina
a continuación se explican.
OR C que lo efectúa dado que
Esto ya no lo hace el
JR NZ, LOOP entonces sólo sería necesario
programador para evitar la
CP (HL) quitarla de en medio.
copia fraudulenta de su
JP NZ, 0
producto ya que se supone que
RET
si hemos llegado a este punto
también podríamos copiarlo,
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª,
,;;
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;
no hay ninguna instrucción de con otra (LD A,L) en caso del que no es INC HL, sino INC
manejo del registro "HI" que anterior ejemplo). IY.
tenga el mismo código que las Todo esto puede llevar Todo esto se puede averiguar
del manejo del registro "IX" ó
consigo que lo que nosotros de una forma senculla con el
"IY", nos daremos cuenta que estemos desensamblando sea MONS debido a que cuando
con esto formamos una mentira viendo en la pantalla se encuentra una instrucción
instrucción del Z-80
una serie de operaciones que de estas la pone de la siguiente
imposible. luego son otras. Vamos a ver forma:
Y realmente es imposible ya esto más profundamente con
Primero un NOF cuyo código
que juntamos los prefijos de algunos ejemplos ya que es un
de operación es el prefijo con
un tipo de instrucciones con tema complicado. un (*) delante, indicando con
otras distintas. Con esto
Ejemplos esto que ahí se halla algo que
logramos varias cosas: la
no está claro. Luego coloca la
primera es confundir a todos Supongamos que instrucción, pero operando con
los que no conozcan desensamblando un programa el registro "HL" tal y como si
precisamente este tipo de nos encontramos: no tuviera prefijo.
instrucciones. LD A,L
Si vemos esto, la forma de
La segunda, es muy Si vemos que los códigos de interpretarlo es muy sencilla.
importante para el esta instrucción son: FD 7D Si el prefijo es FD entonces es
programador ya que se podemos estar seguros de que que la operación se realiza
produce una instrucción que no es LD A,L sino LD A,Y sobre el registro "IY" y si es
hace una cosa, por ejemplo LD
Otro ejemplo: DD es con el registro "IX".
A,Y; y además tiene la
particularidad de que ningun Si vemos INC HL y los Con estos ejemplos creemos
desensamblador puede leerla códigos de operación son: DD, que será suficiente para su
bien o si puede, la confunde 23 podemos estar seguros de perfecta comprensión.
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;,
,
distintas, debido a que , por está bajo (0) y el A14 algo (1) contiene la primera dirección
arte y gracia del señor Sinclair, (página 1 si consideramos toda donde se van a cargar los bytes
ninguna rutina en CM se la memoria dividida en 4 cuando estos entren desde la
puede correr entre la dirección páginas. cinta.
16384 y 32767 de forma que
De todo esto se deduce, y para Todo lo que llevamos dicho de
ésta funcione a una velocidad
que veamos las cosas más protecciones usando la rutina
constante.
claras, que cualquier rutina de carga de la ROM, vale
La razón es que la ULA del cargadora distinta a la de la perfectamente para el caso que
Spectrum, que se encarga ROM ha de estar ubicada nos ocupa esta semana, sólo
entre otras cosas de generar la forzosamente en los 32K hay que tener en cuenta que en
señal de video del ordenador, superiores de la memoria vez de hacer el CALL a la
se halla conectada a la RAM porque si estuviera en dirección #0556 se hace a
memoria según el sistema los 16K inferiores, o sea, en la donde está ubicada la rutina de
DMA o lo que es lo mismo, página conflictiva, se vería carga.
acceso directo para poder leer interrumpida cada cierto El problema viene en aquellos
fácilmente la memoria de tiempo por la ULA, por lo que
programas en los que los bytes
pantalla. la carga daría error.
que se cargan de cinta, se
Como sólo existe un Bus de Lo primero que tenemos que solapan encima de la rutina
direcciones en el ordenador, hacer es distinguir cargadora o del programa que
cuando la ULA está perfectamente la parte que la maneja. Afortunadamente
accediendo al mismo no puede gobierna la rutina de carga en estos programas son los
hacerlo el microprocesador el CM del cargador de la menos, tal y como
por lo que éste se detiene rutina propiamente dicha: hay comentabamos hace algunas
momentaneamente. que tener en cuanta esto dónde semanas, y el método que se
Esta circunstancia sólo sucede se empieza a cargar la parte ha de seguir para poderlos
cuando el micro accede a las distinta del programa. Si analizar es cargarlos algunas
direcciones comprendidas comienza en la pantalla, direcciones antes para que no
entre la 16384 y la 32768, es tendríamos que buscar un LD se solapen.
decir, aquellas en las que el bit IX, #4000 debido a que, en
A15 del bus de direcciones lineas generales, este registro
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;,,
,,
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;,,,
,,,
Una forma de protección no muy usada, pero que podreis ver en algunos
programas, es que el Basic cargador es ridículo y a continuación vienen
unos bytes que se cargan y ejecutan sin que ninguna sentencia los active.
Veamos esto con más profundidad...
Esto, normalmente nos lo del Basic donde están las por una correspondiente a un
encontraremos sólo en variables del mismo y este programa Basic con el
programas cargadores, por lo dato, junto con su longitud, Copyupi, no olvidandonos de
que su longitud es corta y lo apuntarlos muy bien. cambiar la longitud del
podemos desplazar 10000 programa Basic sin variables
Es muy conveniente también
posiciones hacia arriba sin dentro del bloque, así como
enterarse de cual es la linea de
ningún problema, pero si ponerle una linea de AUTO-
AUTO-RUN en la
nuestro caso fuera otro, que RUN igual a 32768 para que
correspondiente variable. Una
todo el programa estuviera éste no se ejecute al cargarse,
vez hecho esto grabamos un
grabado con este sistema, y yá está.
bloque de bytes en una cinta
tendríamos que ser más
con la siguiente orden SAVE Un último caso, que puede
meticulosos.
"Nombre" CODE inicio darse en este tipo de
En este caso lo podríamos programa Basic, longitud del cargadores, es que el bloque
cargar 10000 bytes más arriba, mismo, teniendo en cuenta que de bytes empiece a cargarse en
pero ejecutando un CLEAR los datos están desplazados la pantalla y no termine hasta
direccion de carga -1 para 10000 posiciones hacia arriba. después de que ésta esté
evitar que la pila se nos completa o incluso continue
La forma de calcular la
corrompa. Si deseáramos tener así hasta el final del programa
longitud es: PRINT (PEEK
el basic limpio habríamos de estando este grabado en un
33641 + 256 * PEEK 33642)-
enterarnos de su longitud y solo bloque. Este supuesto lo
(PEEK 33635 + 256 * PEEK
comienzo mirándolo en las analizaremos la próxima
33636).
variables del sistema del semana.
bloque de bytes cargado. Cuando lo hayamos grabado
Mirar tambien la dirección procederemos a cambiar la
relativa con respecto al inicio cabecera del bloque de bytes
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
; ,9
qs
Art
.u uv w xMwVy z
{.
|} ~.
la pantalla se ensucia ya que es Este tipo de protección que
normal. hemos tenido oportunidad de
Procedemos a situar la cinta al estudiar esta semana sólo
Cuando haya terminado la
principio del bloque gordo de puede ser utilizada con
carga situar una cinta virgen y
datos, eludiendo la cabecera si pulsar el "Enter", se grabará cassette, si vuestra motivación
la tuviese, y teclarmos en al querer analizar el programa
un trozo de bytes que podréis
modo directo: RANDOMIZE es pasar el mismo a
cargar con LOAD "" CODE
FN A (flag). El ordenador se microdrive o disco habéis de
que no incluye la pantalla y
quedará esperando que grabar en el mismo sólo la
sobre el que se podrán aplicar
introduzcamos este bloque. No parte Basic, sin incluir las
las técnicas "hackerianas" que
os extrañéis si durante la carga variables.
arriba se han expuesto.
La proteccion turbo.
/$%
$%,,%/,$
$'
'(/©
/©++$&
$&..(5ª
ª
;9
;9
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;9
;9,
,
..
donde se halla el retorno por Ya sabemos cómo un listado utilice sistema parecido, pero
error. Si pokeamos con la Basic Turbo arranca la rutina distinto.
dirección de las variables desenmascaradora,
logramos que al presentarse un considerando además la Listados Basic Rutina
error no se salte a la ROM, particularidad de que todos los Turbo
como sería de esperar, sino a cargadores Basic en el sistema
la zona de variables del Basic. Turbo arrancan de la misma
manera. De esto se deduce que
De esta forma cuando todo el
no es necesario que
Basic se ha ejecutado y se ha
analicemos el Basic del
de imprimir en la pantalla el
cargador sino que ,
error "OK" para indicar que
directamente podemos ver
todo ha ido bien, se ejecuta un
donde se hallan las variables y
salto a las variables del Basic,
empezar desde ahí. De todas
sitio este donde se halla la
formas es interesante que
rutina desenmascaradora.
analicemos por lo menos el
Los últimos dos Pokes primero para que
también van de relleno , es comprendamos como
decir, no hacen nada funciona, por si en un futuro
especifico, lo único que logran sale alguna proteccion
es confundirnos. TURBO II, por ejemplo, que
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;9
;9,,
,,
hoja el valor de todos los Bueno, para el caso que nos más. Así entramos en este
registros e ir calculando "a ocupa ahora, este RET PO se bucle unas cuantas veces para
mano" todas las operaciones cumple varias veces al luego salir.
de cada un de ellos. Para esto principio, con lo que estamos Cuando salgamos de él, otra
es preciso tener grandes en una caótica situación. vez hemos perdido el rastro de
conocimientos de CM, tema
Al ejecutarse la instrucción los registros porque se han
éste que se escapa al cometido
RET volvemos al Basic y el ejecutado rutinas de la ROM.
de esta sera, pero que podréis
SO intenta nuevamente Se impone paciencia y volver
aprender en las páginas
presentar el informa de error a hacer la misma operación
centrales de la revista. OK. Para ello mira la variable anterior. Situar un Breakpoint
Otra posibilidad es correr el del sistema ERR-SP que en el punto después del RET y
programa paso a paso o por recordemos está modificada lanzar la ejecucuón del mismo
bloques con un monitor que apuntantdo a un sitio donde se con un GOTO 0 (cero).
tenga esta facilidad para ir halla la dirección de las Para que os vayais entrenando
viendo el valor que toman los varaibles. Con esto , también os ofrecemos en el
distintos registros. Esto último conseguiremos que el flujo del listado, el estado de los
es indudablemente más programa vuelva a la rutina registros desùés de este REP
cómodo, sin embargo, tiene el desenmascaradora, pero esta PO para este caso específico.
inconveniente de que cuando vez con los registros un poco Puede que no sirva para el que
nos encontremos con un LDIR cambiados, y otra vez RET deseais, pero os haceis una
habrá que tener mucho PO, aunque antes de llgar al idea.
cuidado con él. mismo se pasa por unas
órdenes que los modifican aún
El bucle del principio
Como podeis ver , en la
direccion 615F del Listado 1
existe un RET PO: esta
condición PO corresponde al
banderín de paridad, es decir,
si el número de bits elevados
del registro A es para,
entonces el RET PO no se
cumple, pero si es impar el
RET PO se cumple y sería un
RET PE el que no se
cumpliría. (PO = parity odd,
PE = parity equal.).
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;9
;9,,,
,,,
Como ya dijimos, al principio Hay generalmente una llamada El valor de los registros a la
se encuentra un bucle con un a una rutina de la ROM entrada del bucle es producto
RET PO que tiene como fin ubicada en la dirección donde de un montón de
despistarnos. arranca la rutina cargadora. desequilibradas operaciones
que se han realizado con los
En medio de la rutina hay una Hay generalmente una llamada
mismos a lo largo y ancho de
inicialización del registro R a una rutina de la ROM
toda la rutina
con un valor, el contenido en ubicada en la dirección 3008
desenmascaradora. Digamos
A, producto de una serie de que se cumple, contrariamente
que esto funciona así "por
operaciones más o menos a lo que podamos pensar. Esta
casualidad", aunque realmente
oscuras. Este registro, el R, rutina, la de la ROM, que se
demuestra la precisión relojera
luego se utilizará para el encarga de incrementar el
de esta rutina.
desenmascarado de la rutina valor de uno de los registros
cargadora. complementarios. Durante toda la rutina se hacen
un montón de operaciones con
Hay un LDIR de una buena Directamente desùés se entra
los registros normales y
parte de la memoria que tiene en el bucle desenmascarador.
alternativos, lo cual
como fin destrozar cualquier Este utiliza el valor que tenga
imposibilita totalmente
intento de situar el programa el registro R a su entrada para
cualquier intento de vuelta al
en la misma. Los valores que desenmascarar el código
Basic una vez arrancada. De
pueden tomar los registros objeto de la rutina cargadora.
igual manera se realizan
antes del mismo son variables Como arriba se inició su valor
algunas operaciones sin
y después de hacerlo toman con uno determinado, en este
sentido. Podemos decir, sin
otros que son necesarios, por punto de entrada R contendrá
intención de ofender a nadie,
lo que no es factible quitar un valor previsto para la
que la rutina
esata instrucción de en medio. protección. De igual manera el
desenmascaradora parece ser
contenido del registro HL a la
Se asignan dos valores en la producto de una mente
entrada de esta rutina marca el
pila, uno, el primero, totalmente desequilibrada.
comienzo del código a
corresponde a la dirección del
desenmascarar, el DE el De la primera parte de este
bucle desenmascarador y otro ,
destino y el BC el número de último punto se deduce la
situado después, que
bytes que se han de "pasar por imposibilidad de usar ningún
corresponde a la dirección
la piedra". monitor comercial para
donde arranca la rutina
inspeccionar el valor que
cargadora.
contengan los registros en
algún punto. Este es debido a registro R; éste se puede Si BC vale 0 (cero), cosa que
que todos utilizan rutinas de la considerar que devuelve un ocurrirá cuando el bucle haya
RIM para sus cálculos y valor "aleatorio pero terminado de desenmascarar
presentación en pantalla, y controlado". todo el código objeto, el RET
estas rutinas no funcionan PO que viene a continuación
Luego se XORea con este
muy coherentemente si están se cumplirá, pero este RET no
registro (el A) el contenido de
corrompidos los registros vuelve a Basic, sino que salta
la celdilla a la que apunta HL,
alternativos, por lo que se hace directamente a la rutina
que, recordemos, contiene la
necesario el buscar alguna cargadora en virtud del
dirección de origen del código
forma de arreglar esto. En el segundo valor que se haya
objeto enmascarado. Y
próximo número almacenado en la pila. Si no lo
después se guarda en esta
solucionaremos comprendeis repasar los
celdilla el valor XOReado, con
adecuadamente este "pequeño" capítulos anteriores de esta
esto ya hemos
problema. misma serie.
desenmascarado el primer byte
El corazón de la rutina por lo que ya sólo queda Caso de que BC no contenga
desenmascaradora transladarlo a su sitio real, en 0, se decrementa el valor de la
la parte superior de la pila en dos unidades, para que
Indudablemente, el sitio donde memoria, con las instrucción al ejecutarse el siguiente RET
se realiza el desenmascarado LDI. PE, si se cumple, se salte al
de la rutina cargadora y a la primer valor introducido en la
vez su ubicación en la zona de Esta instrucción coge el valor
pila (en este ejemplo éste es el
trabajo, es en el bucle de la dirección a la que apunta
61EE).
representado en el Listado DE, luego incremente HL y
adjunto (aunque no os lo DE y decrementa BC,
creáis es un bucle).
Y es un bucle en virtud de los
dos valores que en medio de la
rutina se han "pokeado" en la
pila. Examinemos esto con
calma:
Primero se carga en el registro
A el valor que contenga el
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
; ,;
contrario no tenéis
Esta corta rutina que os En la pantalla saldrán, por lo
ensamblador, utilizar el listado
ofrecemos tiene como tanto, 14 bloques gráficos que
hexadecimal número 2. Con el
finalidad la de poder averiguar corresponden de izquierda a
cargador universal,
el valor de los registros y el derecha, a los registros:
introducirlo y efectuar un
contenido de la pila en A,F,B,C,D,E,H,L,lx,X,Iy, e Y.
DUMP en la direccion 40000.
cualquier punto del programa. Los últimos dos bloques de la
Luego lo salváis con la orden
Presenta las siguietnes derecha son el valor superior
SAVE "break" CODE
cualidades y defectos: que contenga la pila en ese
40000,80. momento y nos será muy útil,
Es corta, apenas 80 octetos y
Para usarlo sólo tenemos que como después veremos.
totalmente reubicable, por lo
cargarlo en la posicion donde
que solo es necesario cargarla El Mini monitor, una vez
precisemos un "breakpoint", y
en el sitio donde deseemos ejecutado, detiene por
luego ejecutar el cargador
interrumpir el programa para completo al microprocesador
turbo con la orden GOTO 0
poderla usar. en virtud de un DI seguido de
(cero). En ese momento nos un HALT, lo cual nos facilita
Funciona aunque los registros saldrán los registros en la el poder "pillar" con
estén corrompidos o el basic pantalla de una forma un tanto tranquilidad el valor de todos
esté adulterado. Para ello no especial: los registros.
utiliza ninguna rutina de la
A cada registro se le asigna un
ROM Esta excesiva aridez para con
bloque gráfico con rayas el usuario es inevitable si se
El único inconveniente que verticales y debajo de cada desea ocupar la menor
tiene es la relativa complejidad bloque se halla una máscara cantidad posible de memoria,
, con la que hay que "adivinar" para poder contar estas rayas buscando total independencia
el valor de los registros. fácilmente. Cada raya de cada de la ROM del ordenador.
bloque significa un bit de
Utilizacion registro por lo que habremos Para ver, por ejemplo, dónde
La forma de utilizarla es la de traducir las ocho rayas de saltaría un RET en caso de que
siguiente: si tenéis un cada bloque (que se cumpliese, podemos utilizar
ensamblador teclear el corresponden con los ocho bits el Mini monitor ubicándolo
programa 1 y despues de de cada registro en binario) a precisamente en la dirección
ensamblarlo, grabar el código su equivalente en del RET y viendo el contenido
objeto resultante en una cinta hexadecimal. de la pila, es decir, los dos
con la orden: SAVE "break" últimos bloques gráficos que
CODE 60000,80. Si por el da el monitor.
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;;
;;
Esta instrucción tiene como rutina cargadora. Esta se otro para cargar y luego
códigos de operación: 31, FF y puede diferenciar en dos comprobar la cinta.
FF, por lo que es muy sencillo bloques principales, el primero El segundo bloque es el que
cargar un monitor en la es el que se encarga de cargar maneja el primero
memoria, por ejemplo el el programa en alta velocidad actualizando los registros
MONS y, poniendo su con esa cabecera tan especial y según sea necesario y
Memory Pointer en la posicion además se encarga de detectar haciendo las comprobaciones
8000 buscar (con la orden Get) si se está usando una copia oportunas. La semana que
por toda la memoria la pirata o una original con un viene trataremos en
sucesión de números: 31, FF, sofisticado algoritmo que más profundidad este tema.
FF. tarde se explicará. Esta parte
posee dos puntos de entrada:
Veremos como a la primera
una para cargar directamente y
nos sale el principio de la
/$%,%/,$'(/©+$&.(5ª;;,
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;;
;;,,
,,
situaremos despues las en una cinta el programa que Este segundo breakpoint es el
cabeceras para poder cargar ha entrado de cinta en Turbo, a del Listado 2 y para usarlo las
los bytes libremente desde velocidad normal. instrucciones son las mismas
Basic. que para el primero, situarlo
Si no encontrasemos sitio en la
en un sitio libre y cambiar el
Una vez situemos el memoria suficiente para el
salto del cargador al programa
breakpoint después del breakpoint habríamos de hacer
por otro que salte al
cargador, teniendo en cuenta unas cuantas peripecias para
breakpoint.
que no es reubicable y que la poder desmembrar el
labor se habrá de hacer con un programa: básicamente Por supuesto hay que
ensamblador, hay que cambiar utilizaremos un breakpoint actualizar el valor de los
el salto al principio del igual a este pero mucho más regitros IX y DE, de acuerdo
programa que se hace en el corto que se encargue de con la longitud y comienzo de
cargador después de cargar los grabarnos sólo un trozo del los bloques que vayamos a
bytes por otro que nos lleve a programa: consecuentemente grabar, esto es, el primero
la direccion donde hemos tendremos que cargar el 16384 y 6912, el segundo
ubicado nuestro breakpoint. programa original tres veces 23296 y 1704 y el tercero
Con esto conseguiremos que para poder lograr los tres 25000 y 40535.
cuando se acabe de cargar se bloques a los que arriba
salte a nuestro mini-programa aludimos. Listado del programa
que se encarga de grabarnos "Breakpoint"
/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
\;;
;;,,,
,,,
POKES, etc... De momento Obtención en tres trozos cargador capaz de cargar estos
indicar 0 (cero). gracias a un breakpoint en la bloques y arrancar el
rutina cargadora. programa.
Recapitulemos
Grabación de estos trozos en El camino hasta aquí ha sido
Básicamente, la filosofía que una drive (disco o microdrive, quizás un poco largo, pero
hemos tenido que seguir para da lo mismo). apostamos a que ha valido la
llegar a lo alto de la protección pena.
Turbo se puede resumir en los Grabación en esta misma
memoria de masa de un Listados del cargador
siguientes puntos:
Estudio y comprensión del
listado Basic, sito en el
cargador.
Estudio de la rutina
desenmascaradora del código
objeto.
Obtención del código objeto
cargador limpio de polvo y
paja.
Estudio del mismo.