Está en la página 1de 48

/$

%,%/,$

'(/

+$&.(5

Por Jose Manuel Lazo


Originalmente publicado en la revista Microhobby.
TOP SECRET

Como entrar en un programa y averiguar sus secretos

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª ,
, 

Jose Manuel Lazo

Un "HACKER", según el diccionario de la lengua inglesa, es una persona


capaz de enfrentarse (con éxito) a todas las dificultades que le impone un
determinado sistema. ¿Cuántas veces has necesitado examinar el interior
de un programa, y no has podido por que te has estrellado contra
infranqueables protecciones?. En esta seccion vamos a abordar en
profundidad este delicado tema.

copia la utilizamos SOLO


Debido al masivo avance de la Y, ¿qué pasa con los
como back-up de seguridad.
piratería del software, las casa poseedores de sistemas de
productoras han añadido a sus almacenamiento más eficaces No creas que estás
creaciones una serie de y fiables que la cinta de infringiendo alguna ley
protecciones para evitar que cassete? desprotegiendo un programa:
terceros se adueñen copien o Los compradores de unidades
es una labor perfectamente
llenen sus bolsillo con este de disco, microdrives, etc., LEGAL siempre y cuando no
producto que , la mayoría de maldicen una y otra vez el día
negociemos con ello
las veces, ha requerido el en que se les ocurrió adquirir
enriqueciendonos a costa del
esfuerzo de muchas personas uno de estos artilugios, ya que
esfuerzo de los demás. Lo
durante bastante tiempo. no existen programas en estos
hemos dicho muchas veces, y
no está de más recordarlo
Esto, por una parte, está bien, formatos. La única posibilidad
aquí_ estamos en contra de la
ya que frena en lo posible la que les queda es adaptar el
PIRATERIA porque a la larga
piratería, pero bloquea al software de la cinta original.
puede hundir la industria del
usuario que legalmente ha Por último, hay numerosos software y eso no es bueno
adquirido un juego o una usuarios de software que para nadie
utilidad y, por cualquier encuentran mayor placer en
circunstancia, desea modificar "profanar" un programa y ver La proteccion del
el programa en alguna de sus sus intimidades que en matar a software
partes. tal o cual marciano. Ninguna cosa en el mundo de
Porque, ¿cuántas veces te los ordenadores es más
hubiera gustado ponerle vidas No a la pirateria
polifacética que la protección
infinitas a ese juego que tienes Con esta serie van a acabarse del software. Existen mil y un
arrinconado porque no logras estos problemas, pero los trucos con los cuales se puede
pasar de la tercera pantalla o piratas a los que ya se les están proteger un programa y
modificar las opciones de poniendo los dientes largos hacerlo inviolable a unos ojos
impresora en esta utilidad que que no sigan leyendo, pues no expertos en el tema; existen
tanto necesitas?. Y no has aquí NUNCA se va a explicar protecciones en el Basic, en el
podido, porque el programita la manera en que se puede CM, aprovechando errores del
en cuestión parece un cofre de copiar un programa, cosa que, microprocesador, etc.
titanio cerrado a cal y canto por otra parte, es legal si la
con mil cerrojos. Cada programa se puede decir
que es un mundo aparte,

2 - La Biblia del Hacker


TOP SECRET

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.

La Biblia del Hacker 3


TOP SECRET

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á.

4 - La Biblia del Hacker


TOP SECRET

Como entrar en un programa y averiguar sus secretos.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª ,,
,, 

Jose Manuel Lazo

Prosiguiendo con la serie, esta semana vamos a empezar por lo que


primero se puede encontrar en un programa: PROTECCIONES A NIVEL
BASIC.

la hora de cargarse, no se la tinta, o el papel en medio de


El cargador de cualquier
ejecutará. una linea y que esta no pueda
programa suele estar protegido
en un 99 por 100 de los casos Una vez que tengamos el verse. Es interesante primero
ver la forma de introducirlos
para evitar que se pueda cargado sin auto-run lo
efectuar un "Break" una vez podremos cargar para luego poder saber como
quitarlos fácilmente.
que éste se haya ejecutado. Lo tranquilamente y después nos
primero que hay que hacer es saldrá el informe "OK". Prueba a editar una linea de un
quitar el auto-run. Es un programa Basic cualquiera y
secreto a voces que haciendo Lineas 0 (cero) desplaza el cursor al medio de
Merge "" el programa se carga Al eliminar el listado nos la misma. Pulsa el modo
pero no se ejecuta. Debemos podemos encontrar con que extendido y a contnuacion el
probar esta forma en primer algunas o todas las lineas 4, por ejemplo. Verás que todo
lugar, si bien, también existen tienen como número el 0 el papel de la linea a
protecciones para esto (cero). Esto evita que se continuación se pone de color
corrompiendo alguna linea del puedan editar y modificar. verder. Pulsa otra vez el modo
Basic, con lo que se consigue Hay una manera de cambiar el extendido, pero esta vez el 1
que una vez cargado el número de lineas, aunque esto con Simbol Shift. Ahora es la
programa el SO (Sistema no es necesario como más tinta la que ha cambiado. Pulsa
Operativo) se cuelque adelante se verá. De momento "Enter" y podrñas comprobar
intentando "mergear" una y para poner un número a la que el listado Basic a partir de
linea falsa del Basic. primera linea del Basic, esta linea tiene otro color
puedes probar lo siguiente: distinto y que las ordenes INK
Si no se consiguen resultados
positivos, intentaremos hacer        
y PAPER no funcionan en esta
una copia del cargador sin
      zona. Esto mismo, pero con
    PAPER e INK del mismo
auto-run, usando para ello el
color, puede valer para que
programa "Copyupi" Con esto podremos editarla. una linea del listado sea
publicado en nuestros números La razón de editar una línea invisible.
44 y 45. Con su ayuda se del listado es poder quitarle
puede cargar un programa los controles de color que Vamos a ver ahora cómo
Basic y modificar cualquiera puedan existir dificultando su quitarlos: primero edita la
de los parámetros de la visión. linea que has modificado y
cabecera. En este caso desplaza el cursor hasta que
cambiaremos la linea de auto- Los controles de color en un este no se vea, o sus atributos
run del programa por el valor listado son los códigos ASCII cambien a los nuevos. Pulsa
32768, con lo cual el Basic, a entre el 16 y el 21, ambos "delete" dos veces por cada
inclusive. Sirven para cambiar control ya que el mismo tiene

La Biblia del Hacker 5


TOP SECRET

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

6 - La Biblia del Hacker


TOP SECRET

Como entrar en un programa y averiguar sus secretos

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª ,,,
,,, 

Jose Manuel Lazo

En el listado de un programa Basic pueden hacerse determinadas


alteraciones de tal forma que sea imposible averiguar su contenido e
incluso que, al intentarlo, el propio listado se modifique creando una gran
confusión.

.
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 H I 'J 8 D K L DM Esto último también puede ser
OCN @ 8 B<K DM P M 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 t u uv w x yx z { para permitir la edición.
"entero fuera de rango".
wz y  |t u u v w x y x ~ 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.

La Biblia del Hacker 7


TOP SECRET

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

La Biblia del Hacker 8


TOP SECRET

Cómo se guarda un número en un listado.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª ,
,99 

Jose Manuel Lazo

En el capítulo anterior comentábamos la posibilidad de modificar un listado


Basic de forma que confunda a cualquiera que trate de inspeccionarlo a la
vez que su funcionamiento es perfectamente correcto. Una de estas
posibilidades es alterar los valores ASCII de las cifras numéricas.

200, y sin embargo, en el modificaciones para que se


Imaginemos una linea de
listado se ve un 100 adapte mejor a este caso
Basic tal como: 10 LET a =
clareamente. Esto además, concreto. Tecleamos el nuevo
100. El número cien se guarda
tiene la siguiente listado (programa 1), lo
en la memoria de dos formas
particularidad: si editamos la salvamos en cinta y lo
distintas: primeramente los
linea 10 y la volvemos a guardamos muy bien pues lo
códigos ASCII del 1, y los dos
introducir en el listado con la vamos a tener que usar
0, luego el prefijo 14, que
tecla "Enter", la representación intensivamente. Un consejo: si
indica que los próximos 5
en coma flotante se ajusta tenemos un buen compilador
octetos son la representación
automáticamente a los valores hacemos lo propio con el
del número en coma flotante, y
inidcados por los códigos programa y obtendremos unos
a continuación los cinco
ASCII con lo que la linea ya resultados increíbles.
octetos de esta representación.
no es lo que era. Esta Con el presente programa se
En el ejmplo se guardaría de la protección se conoce con el pueden ver cargadores de
siguiente forma: 49, 48, 48, nombre de "Literales ASCII Basic sin tener que ubicarlos
14, 0, 0, 100, 0, 0. La retocadas". en la zona del Basic.
representación ASCII se
Obviamente existe el efecto
utiliza a la hora de presentar el Para ello, en primer lugar se
contrario, es decir , que en vez
número en la pantalla, y los ha de modificar la cabecera
de "pokear" en la
cinco octetos en coma flotante del cargador Basic para
representación del número en
se usan a la hora de los convertirla en bytes y poder
forma decimal a la hora de
cálculos que realiza el cargarlo en otra dirección, la
hacer la protección se
ordenador. manere de hacer esto es con el
modifique el literal ASCII "Copyupi" publicado en los
Si reflexionamos sore esto nos
De todo lo arriba expuesto se números 44 y 45.
daremos cuenta de que no hay
deduce que debemos buscar
nada que impida que en la Cargamos el programa con la
alguna forma de ver un listado
pantalla se imprima un número opción "LN" y luego, con la
sin que por ello se modifique
y, luego , al ahora de opción "CC" cambiamos los
sustancialmente.
considerarlo como un cálculo, datos de la cabecera. El dato
sea totalmente distinto. El programa COPYLINE número 1(tipo), pasarça a
Bastaría con hacer un Poke en bytes en lugar de programa y
la dirección que contiene el En la revista número 3 se el dato número 4 (comienzo),
100, por ejemplo con 200, publicó un programa, pasará a ser cualquier posición
para que al ejecutar la linea de COPYLINE, original de Jose de memoria que vayamos a
Basic con un RUN la variable María Reus, al que el autor de tener libre, por ejemplo la
"a" se actualice con el valor esta serie le ha hecho algunas 30000. Por supuesto, luego

La Biblia del Hacker 9


TOP SECRET

deberemos grabar en cinta el respuesta a la primera Es en estas dos últimas


nuevo cargador modificado. pregunta del Copyline. columnas en donde deberemos
centrar nuestra atención: la
En este punto ya sólo queda El programa nos lista un Basic
antepenúltima indica el valor
cargar en memoria el que esté ubcado en otra
del byte dentro del programa y
Copyline, y haciendo un dirección aunque tenga
la última, la más importante,
Break, cargr el programa cualquier protección de
puede indicar varias cosas: o
modificado en la dirección controles de color o cursor. El
bien el TOKEN que se halle
30000, por ejemplo. Damos listado lo produce en 5
en el listado, o bien nada si el
RUN al Copyline y columnas, la primera indica la
valor del octeto no es
respondemos a las preguntas posición de memoria que se
imprimible, o bien la
que nos hace con 0 (cero) , está explorando, en este caso
representación VERDADERA
para la primera linea del esta posición no nos vale para
de un argumento numérico que
listado, 9999 para la última, y nada ya que, recordemos,
se halle dentro del listado. De
30000, la dirección donde hemos ubicado el cargador en
esta forma no nos dejamos
hemos cargado el Basic, para otro sitio. Las dos columnas
engalar por la protección de
la tercera pregunta. EN el caso siguientes nos informan del
las literales ASCII retocadas.
de que el cargador tuviera una número de linea que se está
linea de auto-run distinta a la 0 explorando y la longitud el Listado del programa
(cero) habría que darla como octetos de la misma. Copyline

La Biblia del Hacker 10


TOP SECRET

Como entrar en un programa y averiguar sus secretos.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9 

Jose Manuel Lazo

La semana pasada analizábamos la utilidad de un programa, viejo conocido


nuestro, COPYLINE, en las tareas de análisis de los cargadores Basic.
Ahora continuaremos con esta labor incluyendo una interesante tabla que
recoge todos los controles de color y cursor que maneja Spectrum.

actúan sobre el listado. listado.


El programa en cuestión nos
Consultando la tabla adjunta
lista un Basic que esté ubicado Con el Copyline tenemos,
puedes averiguar la función de
en otra dirección aunque tenga además, la ventaja de que al
cada uno.
cualquier protección de no modificar ninguna de las
controles de color o cursor. El Estos últimos controles que partes del programa y no estar
listado lo produce en 5 son a modo de prefijos para éste en la zona del Basic no se
columnas cuyo significado se los parámetros que le corrompen la zona de las
explicó la pasada semana. acompañan, con unos variables ni la zona de edición,
argumentos erroneos, hacen lugar en el que se pueden
En la antepenultima columna
que el SO se confunda volcar programas en CM tal y
van los controles de color,
bastante a la hora de sacar el como veremos próximamente.
cursor, etc. Pero estos no

Controles de Color y Cursor


Valor Comentario
Control de print con coma, sirve para que en este punto el listado se desplace a la próxima posición
6
de TAB. Va solo.
Cursor izquierda. Provoca el desplazamiento del cursor una posición a la izquierda
8
sobreescribiendose lo que a continuación vaya encima del anterior carácter.
9 Cursor derecha. Igual que el anterio sólo que hacia la derecha.
Código de Enter. Indica el final de una línea. Colocado en cualquier posición de una línea puede
13
confundir al SO.
14 Código de un número. Precede a los cinco octetos que representan a un número en coma flotante.
16 Control de tinta. El código que le siga indicará de qué color se va a poner la tinta.
Control de papel. De igual manera que el control de tinta indica qué colo va a tomar el papel a partir
17
de este punto.
Control de flash. Indica si el flash está activado, si el próximo octeto es un 1, o no lo está , si el
18
próximo octeto es un 0 (cero).
19 Control de brillo. Funciona de idéntica forma al control de flash.
20 Control de inverse. Como el control de flash y brillo.
21 Control de over. Como los tres anteriores.
Control de AT. Los dos octetos que le sigan indican las nuevas coordenadas por las que va a
22
continuar el listado.
Control de TAB. Funciona igual que el control de AT, pero con un solo octeto que indica la nueva
23
columna hacia la que se va a dirigir el listado.

La Biblia del Hacker 11


TOP SECRET

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÷Ùû ÿ øËý×ýÜû     

La Biblia del Hacker 12


TOP SECRET

Rutinas CM en la zona de variables del Basic.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9,
, 

Jose Manuel Lazo

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.

distintas maneras que hay de


Un bloque CM se puede Cuando nosotros grabamos un
llamar al mismo.
guardar perfectamente en la programa con AUTO-RUN no
zona de las variables, para lohacemos de forma que se La forma más sencilla es
comprender esto es necesario haga un RUN a la linea que RANDOMIZE USR dirección.
saber como el interprete graba marquemos , sino un GOTO. Siempre que nos hayamos
un programa en Basic: Una expresión que sería asegurado de que la dirección
adecuada es: grabar un que se da sea la verdadera
Cuando damos la orden SAVE
programa con AUTO-GOTO. podemos pasar ya sin más al
"nombre", el SO coge la
desensamblado, pero esta
variable PROG y toma la El código máquina cargador
forma es poco corriente
información que la misma no tiene por qué estar
porque es muy facil de
contiene, como el primer necesariamente dentro del
desproteger y porque podría
octeto a grabar la longitud del listado, al contrario, lo más
dar problemas si se tiene el
Basic grabado depende de lo sencillo para el programador
interface 1 conectado.
que marque la variable E- es situarlo en un bloque de
LINE que señala el final de la código grabado Otra forma muy común es
zona de variables del Basic. independientemente, aunque RANDOMIZE USR (PEEK
Además, en la cabecera del esto es más sencillo de 23635 + 256 * PEEK 23636)
programa se guarda la longitud desproteger. Sólo hay qye + n. Esto podría valer para
del listado Basic dentro del averiguar la dirección donde arrancar un programa en CM
bloque grabado, que puede ser se carga y donde se ejecuta. ubicado en una linea REM al
igual o inferior al mismo. principio del listado. Si
Formas de ejecutar un deseamos desensamblar el CM
De todo esto se deduce que el CM. Cargador tendremos que tener en cuenta
señor que haga la protección
Partimos del caso de que en el que hemos cargado el Basic en
puede guardar perfectamente
programa en Basic, que actua otra posición para poderlo ver,
un programa en CM en la zona
como cargador, no se ve una por lo que en todos los CALL
de variables y grabarlo junto
sentencia LOAD por ninguna y JP que haya en su interior
con el programa. Una
parte, de esto se puede deducir hay que calcular la dirección
consecuencoa de lo mismo
que los demás bloques del sobre la que funcionan.
puede ser que si nosotros
ejecutamos un RUN se nos programa se cargan desde CM. Si tenemos CM en la zona de
borran las variables, y con ello No vamos a enrtare todavía en variables se puede usar la
el programa en CM con el cómo se crga un programa forma RANDOMIZE USR
consiguiente cuelgue. CM, pero vamos a ver las (PEEK VARS + 256 * PEEK
VARS + 1) + N. Esto lo que

La Biblia del Hacker 13


TOP SECRET

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.

La Biblia del Hacker 14


TOP SECRET

Rutinas de carga en Código Máquina.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9,,
,, 

Jose Manuel Lazo

Ya es hora de que estudiemos las distintas maneras en que puede cargarse


un programa desde CM. En primer lugar veremos la correcta utilización de
la rutina LOAD de la ROM.

LOAD de la ROM. Si de todas comienzo, longitud, tipo y


Partimos del supuesto de que
formas deseais profundizar demás...
habeis aprendido ya los
fundamentos que se han más sobre el tema os podeis El segundo bloque es el que os
dirigir al especial nº 2 de
sentado en los capítulos interesa, es lo que se llama:
anteriores sonbre protecciones MICROHOBBY, donde se "carga sin cabecera" ya que se
trata con mayor detalle este
a nivel Basic, aunque prescinde de la misma, de lo
volveremos a ello después, tema. cual se deduce que debemos
cuando nos centremos en la Esta rutina utiliza el registro de dar los valores de la
protección "turbo". IX para contener la dirección dirección y longitud del
Ahora vamos a introducirnos de comienzo donde se van a bloque de datos en los
de lleno ya en lo que se puede cargar los bytes, el registro DE registros que arriba se
llamar protecciones a nivel para contener la longitud del exponen.
CM, esto es, cuando el bloque y el registro A para el Al elevar el banderín de Carry
flag de identificación.
cargador del programa ejecuta con la instrucción SCF
una llamada a una rutina en Pero ¡ojo!, esto carga sin la provocamos que la rutina de la
CM para seguir cargando el "cabecera" que contiene la ROM se cargue, ya que de lo
resto del mismo.
La estructura general del
cargador CM puede ser ésta:

información del nombre y contrario, sólo verificaría.


longitud de los bytes, lo cual
Una asignación de vectores y trae consigo el que se cargue Primeros Trucos en
unas llamadas a rutinas de la lo primero que entre. Assembler
ROM. Este es el caso más Si observais el Gráfico I Esta es una estructura general
sencillo que usa la rutina de la podréis ver la manera en que suponiendo que el progama al
ROM LOAD ubicada en la están grabados unos bytes o un cargarse no tuviera cabecera y
dirección #566 (1366 en programa en la cinta: en entrase a velocidad
decimal) primer lugar, el tono guía, y NORMAL. Por regla general
luego, la cabecera en sí que se ha de buscar una asignación
La rutina LOAD de vectores en los registros IX
contiene un primer byte como
Es muy interesante antes de flag de identificación (0) y y DE los cuales indican
proseguir, echar un vistazo al otros 17 conm la información comienzo y longitud, unas
funcionamiento de la rutina de cabecera: nombre, llamadas a rutinas cargadoras

La Biblia del Hacker 15


TOP SECRET

y un retorno a Basic o un salto Tendría el siguiente salto directo al programa en


al programa en sí. significado, en nuestros CM. Por ejemplo:
mnemonicos imaginarios:
Pero hay muchas formas de
enredar esto tan sencillo para RET = POP PC o JP (pila).
hacerlo menos inteligibles. De esto se deduce que cuando
efectuamos un CALL
Sentemos primero unos
guardamos la dirección de Esto sería un ejemplo de una
sencillos conceptos de
retorno en la pila, y si rutina que cargase otra en la
Assembler:
efectuáramos otro se guardaría dirección 25000 y a
En primer lugar la instrucción la nueva encima sin borrarse la continuación ejecutase una
CALL dirección significa, antigua de forma que los RET llamda a esta rutina con la
como todos vosotros sabeis, que se vayan ejecutando van instrucción RET, fijaos en su
una llamada a una rutina en sacando esas direcciones de estructura pues abunda más de
CM., pero agrupa una serie de retorno de la pila. Es muy lo que sería de esperar.
operaciones como son: sencillo pokear la dirección de Otra forma es terminar el
CALL dirección = PUSH PC retorno en la rutina cargadora programa en vez de con un
(Program Counter) + JP y cambiarla por otra para que RET, con un JP a la rutina
direccion. la instrucción RET del final no LOAD de la ROM,ya que el
En segundo lugar, la ejecute un retorno a Basic RET se halla en la propia
instrucción RET que sirve para como sería de esperar, sino un rutina de la ROM.
retornar de una rutina CM.

La Biblia del Hacker 16


TOP SECRET

Protecciones en la rutina de carga.

/$%,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
9,,,
,,, 

Jose Manuel Lazo

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í

La Biblia del Hacker 17


TOP SECRET

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,

La Biblia del Hacker 18


TOP SECRET

Protecciones aleatorias con el registro "R".

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª ,
,;; 

Jose Manuel Lazo

Siguiendo con el estudio detallado de los diferentes tips de protecciones


que se pueden llevar a cabo a nivel de código objeto, vamos a mostraros
esta semana aquellas que están directamente relacionadas con el registro
de refresco o registro R.

a la del Checksum salvo que última, en vez de producir


El registro "R" es uno de los
todas las direcciones se código a partir del registro "R"
muchos que tiene el
Xorean con el registro "R" lo produzca a partir de la
microporcesador de uso
para producir el verdadero pantalla de presentación que
específico para él. En este caso
código objeto. acompaña al juego:
para la memoria ya que se
encarga de ir contabilizando la El siguiente código Esto podría ser así:
ágina de memoria que le toca corresponde con una rutina 10 LD HL,40000
ser refrescada por el mismo desenmascaradora. 20 LD DE,16384
(para más información 10 LD HL,25000 30 LD BC,6912
consultar los artículos de 20 LD BC,40000 40 LOOP LD A, (DE)
Primitivo en la sección 30 LD A,0 50 XOR (HL)
Hardware) 40 LD R,A 60 LD (HL),A
50 LOOP LD A,R 70 INC HL
Lo que a nosotros nos interesa
60 XOR (HL) 80 INC DE
es que su valor va variando
70 LD (HL),A 90 DEC BC
secuencialmente con el
80 INC HL 100 LD A,B
tiempo, y muy rápido
90 DEC BC 110 OR C
(relativamente), se puede decir
100 LD A,B 120 JR NZ,LOOP
que si consultamos su valor en
110 OR C 130 RET
un momento dado devuelve un
120 JR NZ,LOOP
número aleatorio, pero que Un Ejemplo
130 RET
para ciertas rutinas muy bien
sincronizadas puede resultar El colmo del refinamiento Seguro que ya estabais
predecible (vaya lío ¡eh!). viene cuando la rutina de pensando que nos habíamos
desenmascara otra que viene a olvidado de explicar la manera
De esto se deduce que es muy en que están protegidos ciertos
continuación y pasa el control
sencillo que lo que se cargue programas, pues no, y como el
a la misma, la cual ya
de la cinta sea un montón movimiento se demuestra
verdaderamente desenmascara
informe de bytes y que, andando aquí y ahora os
el código limpio y entre ambas
después de haberlos pasado vamos a exponer, como
no hay ninguna inicialización
por la piedra, oséase una rutina primicia mundial, la manera
del registro "R".
desenmascaradora, se en que se protegió el
conviertan en el verdadero Por supuesto, ambas técnicas EVERYONE´S A WALLY
código objeto limpio. de protección se pueden programa éste de MIKRO
mezclar y hasta incluso no hay GEN.
Una rutina desenmascaradora
nada que impida que esta
tiene un aspecto muy parecido

La Biblia del Hacker 19


TOP SECRET

De principio el programa se Luego se salta directamente a Llegados a este punto, ya se


halla protegido con una rutina una rutinita ubicada en la hace el salto al programa
de carga de velocidad distinta memoria intermedia de principal.
a la normal, cuestión ésta que impresora que se encarga de Vemos de esta forma como los
esrtudiaremos más adelante. producir otra con unos valores programadores de MIKRO-
La rutina cargadora se ubica situados después y otros GEN han impreso en sus
en la última página de ubicados en la pantalla de creaciones una serie de
memoria y el bloque que se presentación mediante un protecciones bastante
carga se solapa por encima del sencillo pero efectivo completas y difíciles de
cargador con lo cual todo lo algoritmo. desproteger. Además, hay que
que se encuentre por encima Una vez que se ha producido reconocer que la rutina de
de la cargadora no tiene esta rutina se pasa el control a carga rápida que se utiliza para
sentido ya que es lo que se la misma, la cual se encarga de cargar el código está
carga de la cinta. desenmascarar todo el código perfectamente hecha siendo,
Después de la carga se que ha entrado de la cinta hasta incluso, más fiable en la
procede a un Checksum de la mediante el registro "R" carga que la de la ROM
memoria, incluyendo el estándar. Esto es todo por esta
cargador, para comprobar que semana...
no se ha tocado nada.

La Biblia del Hacker 20


TOP SECRET

Más protecciones en el código objeto.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
; 

Jose Manuel Lazo

Volviendo sobre el tema que empezamos la seana pasada, vamos a seguir


estudiando las distintas protecciones que se pueden realizar sobre el
código objeto.

analizar el programa o pasarlo ULTIMATE, el cual inicializa


Usando el registro "R" se
a disco microdrive. el registro "R" en una rutina en
pueden hacer algunos trucos
la memoria intermedia de
en el tema de protecciones. Si lo que deseamos es
impresora antes de pasar el
Uno de ellos, difícilmente analizarlo deberemos buscar
control a la rutina
controlable, es el siguiente. en todo el programa objeto el
desenmascaradora. Luego, en
sitio donde se efectua la
Imaginemos que después de medio del programa se efectua
comparación con el contenido
tener cargado el código objeto una comparación del registro
del registro "R" y quitarla.
se pasa el control a una rutina "R" y si no corresponde, se
Este método es más tedioso
desenmascaradora, y luego al salta a la direccion 0.
que el que despues se explica,
programa principal. Pero es
pero tiene la ventaja de que Los nemónicos falsos
probable que antes de entrar
deja el código limpio de
en la rutina desenmascaradora Los nemónicos que manejan
protecciones y podemos
nos encontramos con unas los pares de registros IX e IY,
empezar a analizarlo.
instrucciones, tal como estas. llevan los prefijos DD y FD,
LD A,76 La manera de hacer esto es, o respectivamente. Cuando el
LD R,A bien desensamblarlo o buscar microprocesador encuentra
y que después no veamos nada el código de la instrucción LD uno de estos prefijos en la
A,R por todo el programa.
relacionado con el registro memoria, sabe que el próximo
"R". Esta última forma tiene pocas octeto marca una instrucción
posibilidades de éxito, ya que del juego que existe para estos
Luego, cuando tecleamos el
código objeto limpio y es bastante probable que la registros.
rutina de comprobación esté
queramos ejecutarlo vermos Las instrucciones que manejan
que en un punto específico del enmascarada para evitar el que el registro "HI", como pareja o
podamos encontrar la
programa, no necesariamente separado, no necesitan de
al principio, se cuelga o salta a comparación con este método. ningún prefijo.
la direccion 0, reseteando el Si lo que deseamos es, sin Solamente está el byte de la
sistema. embargo, pasar el programa a instrucción y a continuación,
disco, podemos hacerlo con el
Cuando nos encontremos en el del dato si existiese.
una situación como la anterior, código sucio e incluir la rutina
desenmascaradora con la Imaginémonos que a una
podemos decir que estamos instrucción normal de manejo
ante una protección de dificil inicialización del registro "R".
del registro "HI" se le pone
control que puede abordarse Este tipo de protección la delante de un prefijo para
de dos formas distintas, según utiliza, por ejemplo, el manejo de los registros "IX" o
el propósito que llevaemos, programa NIGHT SHADE de "IY". Si además sabemos que

La Biblia del Hacker 21


TOP SECRET

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.

La Biblia del Hacker 22


TOP SECRET

Rutinas de carga distintas a las de la ROM.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;,
, 

Jose Manuel Lazo

Hay muchas formas de cargar un programa en la memoria del ordenador,


aunque hasta ahora sólo hemos tenido en cuenta el uso de la rutina LOAD
de la ROM. Sin embargo, ello no es necesario, y de hecho actualmente casi
ningún programa utiliza este sistema.

Hace ya bastante tiempo que siempre se encarga de guardar


• Cambio de longitud en el
los programadores se dieron lo referente a los parámetros
tono guía.
cuenta de que cambiando de la velocidad de carga, y el
algunos de los parámetros de • Quitar el byte de C guarda dos cosas: los tres
la rutina de carga: distinta identificación. bits de menor peso, el color
velocidad en baudios, tono actual del borde y el quinto bit
• Poner dos bytes de
guía en otra frecuencia o con el tipo de señal que se ha de
identificación seguidos.
cortes como en la protección encontrar en la entrada "EAR"
"turbo" o simplemente quitar • Quitar el byte de paridad o de media onda o de onda
el byte de paridad, se falsearlo. completa.
conseguía que los • Añadir otros condimentos a De igual manera, el registro A
"copiadores" que por entonces la carga: contiene el byte de
existían no pudiesen copiar el identificación o flag y los
programa. • Textos o movimientos de diversos banderines / estados
gráficos según se carga.
Para ello es necesario de la carga.
desarrollar una rutina de carga • Distintas rayas de color en el Esto es así en la rutina de la
distinta a la de la ROM y usar borde. ROM, pero si se trata de otra
ésta en el cargador. Algunas • Quitar las mismas. cualquiera no tiene por qué ser
de estas rutinas son necesariamente de esta forma.
extremadamente parecidas a la • Tonos guía en medio de los Sin embargo, en la mayoría de
original ya que se han copiado bytes. los casos con que nos vamos a
íntegras y lo único que se ha • Carga aleatoria. encontrar, la rutina de carga es
hecho es variar los parámetros una modificación de la de la
de ajuste de la velocidad. • Carga al revés. ROM por lo que la utilización
Otras, sin embargo, son de En la rutina de carga de la de los registros va a ser
nueva concepción. A ROM los registros tienen los prácticamente la misma.
continuación podemos ver las siguientes cometidos: el IX
variaciones típicas. contiene la dirección donde va Problemas con el
a ir el byte que se está hardware
• Distinta velocidad de carga.
cargando, el L contiene este Ya os estareis preguntando:
• Cambio de frecuencia en el byte según se carga, el H bueno y el hardware ¿qué
tono guía (protección turbo) contiene una suma de todos tiene que ver con esto?. Pues
• Pausas en el tono guía los bytes que se cargan para mucho, como a continuación
(protección turbo) luego compararla con el byte veremos. En el caso de que se
de paridad, el último. El B utilicen rutinas de carga

La Biblia del Hacker 23


TOP SECRET

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

La Biblia del Hacker 24


TOP SECRET

Rutinas de carga aleatorias..

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;,,
,, 

Jose Manuel Lazo

Una de las protecciones más sorprendentes que podemos encontrar son


las Rutinas de carga aleatoria. Puesto que en el Spectrum la aleatoriedad es
perfectamente controlable, algunos programadores se aprovechan de esta
facilidad para diseñar rutinas de carga vistosas, a la vez que muy dificiles
de desproteger.

Hay un procedimiento Estas protecciones pueden dar Como ejemplo os proponemos


bastante curioso para poder muchos dolores de cabeza una corta rutina de carga
cargar bytes aleatoriamente de debido a que el programador aleatoria, a la velocidad
la cinta, esto es, para que el puede perfectamente cargar un estandar de la ROM. Esta
bloque de datos que está montón de cachitos del rutina está muy optimizada
grabado en la cinta no se programa en distintas zonas de aunque, eso si, no es capaz de
cargue secuencialmente desde memoria, o lo que es lo verificar, pero sin embargo,
la primera dirección a la mismo: el programa se halla podemos cargar con ella un
última, son que se carguen desordenado dentro del bloque bloque de bytes de forma
unos bytes en una dirección, grabado en cinta. aleatoria tal y como hemos
otros en otra, etc. Todo esto explicado.
son cabeceras de por medio Desgraciadamente una gran
sino que hay una única mayoría de los programas que Tiene dos puntos de entrada:
cabecera al principio del hemos visto protegidos con LOAD y BYTES. Si entramos
bloque y luego este de una este sistema tienen la por LOAD conseguimos que
longitud variable. particularidad de que uno de ésta espere una cabecera al
los primeros bloques que se cargar, pero si entramos por
Para esto se han de utilizar cargan va encima del propio BYTES se procede a la carga
rutinas de carga un tanto cargador perdiendo sentido la de los bytes directamente.
especiales que tienen dos asignaciónde vectores que
entradas, la primera espera la La actualización de los
vengan a continuación. parámetros es la normal en los
cabecera y luego el bloque de
bytes, y la segunda carga Pero se dice que a listo, listo y dos puntos de entrada: en IX
directamente los bytes sin medio, y este sistema presenta comienzo, en L. Hay que tener
esperar cabeceras de ningún una gran ventaja sobre todos en cuenta que el byte de
tipo. Como el CM es tan los llamados de carga rápida. identificación y el byte de
rápido, resulta despreciable el Como la rutina cargadora tiene paridad no intervienen, como
tiempo que se desperdicia en dos puntos de entrada, tampoco se verifica si se ha
la asignación de parámeto en podemos usar el que espera los producido un error de carga.
la carga y la rutina no se bytes sin tono guía para Esta vez no le acompaña el
entera de que hahabido una desviar hacia la ROM un trozo listado hexadecimal dado que
infima pausa entre el último de programa que al cargar nos la rutina sólo se puede usar
byte cargado y el que va a estorbe, siempre y cuando no desde CM y con las
entrar ahora. sea parte del mismo, esto es, interrupciones deshabilitadas.
sea una parte del cargador que Es completamente reubicable
conozcamos.

La Biblia del Hacker 25


TOP SECRET

siempre y cuando la usemos Otros métodos si de un programa de carga


en los 32 K superiores por las "Hackerizantes" normal se tratase.
razones ya aludidas. De todas formas, si en la carga Si vemos que la carga es
Esta técnica de carga se puede se han usado rutinas aleatoria y queremos usar este
combinar con otra rutina, muy secuenciales (las normales) método porque nos parezca
parecida, que efectua una podemos usar un método más sencillo, podemos usar la
carga de bytes al revés, esto es paralelo para analizar el rutina que proponemos, que
desde el final de la dirección problema, y es cargar el con toda seguridad ocupará
de memoria especificada hasta bloque de bytes en carga menos memoria que la que
el principio. Esto lo rápida con un copiador que utilice el programa, para
encontraremos en programas tenga esta facilidad y pasar efectuar el análisis del mismo.
que carguen los atributos esto a carga normal con el
desde abajo hacia arriba, por mismo. Luego se opera como
ejemplo.

La Biblia del Hacker 26


TOP SECRET

Código Máquina con Autoejecución.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;,,,
,,, 

Jose Manuel Lazo

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...

Es muy común la creencia de



Z ] 
^ K
_ ` Y
a b 
c %/
d 
e 
f.
g .
h 
i f por lo que el programa sigue
j e 7
k l +
m )
lp+
n .
o )
l c
que se puede grabar en corriendose en la próxima
cassette un programa en CM o sentencia a la grabación.
Ejecutarlo y salvar los bytes
unos bytes de forma que se en una cinta, luego inicializar Cómo analizar estos
ejecuten a la hora de cargarse. el ordenador y cargar el cargadores.
Lo sabemos por la gran programa con LOAD ""
cantidad de cartas que CODE. Como podréis Lo primero es enterarse dónde
recibimos preguntando cómo comprobar los bytes contenían cargan los bytes con el
quitar el autorun a un nuestro programa en Basic que Copyupi (puede ser en la
programa CM. Pues bien, de arrancó en la linea 30. Los direccion 23296 u otra
una vez por todas, es programadores más parecida), y una vez
imposible de todo punto "veteranos" que lleven más avariguado este dato cargarlos
grabar sólo un programa CM tiempo metidos en este mundo 10000 bytes desplazados hacia
en un cassette de forma que seguramente lo asociarán a la arriba, es decir, si van en la
con la sentencia normal de forma en que tenía el ZX-81 dirección 23296 los
carga. LOAD "" CODE estos de grabar un programa con cargaremos con la orden
se ejecuten. AUTO-RUN: si el programa LOAD "" CODE 33296.
Lo que ocurre, y aquí viene la se grababa en modo directo En segundo lugar, y con el
explicación, es que la éste iba sin el AUTO, sin Copyline en memoria,
proteccion consiste en grabar embargo, si lo grababamos averiguamos la direccion del
el CM junto con un Basic que desde una linea de programa Basic en el bloque de bytes de
lo arranca todo en un bloque, este se ejecutaba en la próxima la siguiente forma: PRINT
digamos que es un programa línea. PEEK 33635 - 256 * PEEK
basic con la cabecera como Volviendo a nuestro 33636, y luego la sentencia y
bytes. Spectrum, la explicación de la linea de AUTO-RUN del
que esto se produzca así es que programa así PRINT PEEK
¿Qué cómo se hace esto?.. 33618 - 256 * PEEK 33619
Muy sencillo, probar lo grabamos junto con el
programa todas las variables para la linea y PRINT PEEK
siguiente y lo comprenderéis
del sistema, y recordemos que 33620 para la sentencia.
rápidamente.

 % 
. 
 %
! " %
# '
$ /)
& +
( 
*., 
- * hay dos que marcan la linea y Cuando sepamos esto
2
0 71 +
3)
1 
4 +
5 )
1 6 la sentencia que se está arrancamos el Copyline y sólo
.
8 9 
:.
; .
< = %
>= .
? A
> 
@.
B .
C = ejecutando: pues bien, cuando nos queda darle estos datos
.
D 
E 
D 
F.I
G K
H M
J 
L 
N .
N O cargamos los bytes para ver el programa Basic
.
D 
E 
G PK
Q 
R%
D 
S K
G % L.
T  N 
N O inicializamos todas las como si de otro cualquiera se
.
D 
E 
G 
P.V
D U W Y
X 
Z .
X .
[ \ variables tal y como estaban, tratase.

La Biblia del Hacker 27


TOP SECRET

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

La Biblia del Hacker 28


TOP SECRET

Rutinas CM en la zona de variables del Basic.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
; ,9 

Jose Manuel Lazo

La semana pasada hablábamos del caso en que se carga un bloque de


bytes con autoejecución. Dentro de este tipo, a veces ocurre que el bloque
de bytes ocupa toda la memoria, presentando serias dificultadas en su
análisis.

Es indudable que la pantalla 100 bytes.


no la necesitaremos en nuestra Su dirección de trabajo es la
labor de análisis del programa, 64000 y ahí es a donde se ha
por lo que hay que separarla de efectuar la llamada para
del resto de los bytes, para ello que arranque. Lo que hace es
precisamos la ayuda del CM coger cualquier programa de
por lo que será necesario que cualquier longitud que
utiliceis el programa adjunto empiece a cargar en la pantalla
en el Listado 1. So no y separa ésta del mismo
tuvieseis ensamblador para adjudicándole una nueva
introducirlo podeis usar el cabecera por si no la tuviese.
Listado 2 con el mosmo
La forma de usarla es la
programa, pero en
siguiente: primero enterarse de
hexadecimal.
cuál es el flag del bloque que
Picarlo en el cargador vamos a dividir , esto lo
universal de CM y efectuar un hacemos con el Copyupi,
DUMP en la dirección 40000 luego cargamos la rutina, no
y luego lo salváis teniendo en sin antes haber hecho un
cuenta que la rutinita tiene una CLEAR 63999 y tecleamos la
logitud de aproximadamente siguiente línea de Basic:

La Biblia del Hacker 29


TOP SECRET

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 Biblia del Hacker 30


TOP SECRET

La proteccion turbo.

/$%
$%,,%/,$
$'
'(/©
/©++$&
$&..(5ª
ª
;9
;9


Jose Manuel Lazo

Por fin le ha tocado el turno a la protección TURBO, la cual hemos dejado


para el final debido a su extrema complejidad. Apostaríamos sin riesgo de
equivocarnos que una gran mayoría de vosotros, asiduos lectores, estábais
deseando que llegase este momento

veis que algún tema se queda además espera un tipo de tono


El sistema turbo es, sin lugar a
colgado una semana para la guía que tiene pausas (el
dudas, la protección de las
próxima. Esto es debido a la clásico pitido entrecortado).
protecciones. Tiene unas
gran extensión requerida por Esto es así para que ningún
interesantes características y
cada fundamento para su copión pueda copiarlo.
para lo antiguo que es, reune
perfecta comprensión.
casi todas las protecciones que Quizá el corazón de la
hemos explicado hasta ahora El sistema turbo:
protección turbo es el sistema
en una sola. Solamente esta fundamentos que emplea para detectar que
protección justificaría la serie, se está utilizando una copia:
y aunque sólo habláramos de En principio la protección cuando se hace la misma via
ella, habríamos tocado, con turbo tiene un basic con analógica, esto es , de un
ello, una gran mayoría. Por controles de color, lineas 0 cassette a otro, ocurre que en
otra parte cabe también esa (cero) y literales ASCII el momento en que el original
satisfacción tan grande que retocadas. Además, como está silencioso el cassette que
siente un "hacker" cuando luego se verá, el basic tiene está grabando aumenta su
llega a lo alto de una poco sentido, y casi todo lo sensibilidad de entrada, lo que
protección considerada por que tiene es incoherente. Este provoca que grabe ruido en la
todo el mundo poco menos Basic únicamente hace unos cintam aunque este
que invulnerable. Pokes en las variables del desaparezca en el momento en
sistema, y luego nada más, que entre una señal. Pues bien,
Por todo esto y por mucho pero como esperamos que nos la rutina cargadora verifica el
más vamos a tratar el sistema dé el informe Ok, nos ruido existente entre la
turbo desde un punto de vista encontramos con que ya está cabecera turbo y el bloque de
muy especial, profundizando esperando la carga turbo. datos. Si este es excesivo, el
el ello todo lo posible por que
El código máquina de la rutina cargador considera que es una
si conseguimos entrar a un
cargadora se halla en el msmo copia ilegal y actualiza una
turbo, ya nada se nos resistirá.
listado Basic, aunque no se vé; variable del mismo
Tiempo há que se trató este de ubicarlo en su sitio y indicándolo. Al terminar la
tema en nuestra revista, por desenmascararlo se encarga carga del programa éste se
aquel entonces se dieron unas otra rutina que también se autodestruye en virtud del
pistas sobre puntos sueltos de halla en el Basic pero esta vez valor almacenado en esta
la protección. Ahora vamos a en la zona de variables. variable.
ser más explícitos y
La rutina cargadora es Como arriba hemos dicho , la
explicaremos todos esos
especial: Tiene una velocidad rutina cargadora, que ha de ir
puntos y sus conexiones entre
de carga distinta a la normal y en los 32K superiores de la
sí. Por ello, no os extrañeis si

La Biblia del Hacker 31


TOP SECRET

memoria RAM, se halla el cargador (el Basic) turbo se ha El segundo objetivo es


listado del programa Basic, de seguir una filosofía un poco encontrar un medio de ver el
concretamente detrás de la diferente a la que hasta ahora Basic sin tener ningun
última linea. De todas formas, hemos impuesto debido a la programa en Basic (curiosa
no intentéis mirarlo con un gran complejidad del Basic y ironia). La forma más factible
desensamblador puesto que las rutinas asociadas al mismo. de logar esto es con el mismo
está enmascarado. Hemos de tener el Basic en su progama que veníamos usando
Para poder analizar la zona de trabajo, y no hacer hasta ahora (el copyline) pero
protección turbo hemos de ninguna modificación al compilandoselo con un buen
centrarnos en dos objetivos mismo (nada de editar lineas, compilador que acepte el
primordiales y bien crear variables, borrarlas o manejo de coma decimal
diferenciados: por una parte, mucho menos introducir más flotante (unos resultados
lograr ubicar y obtener la Basic). De esto se deducen dos excelentes se consiguen con el
turina cargadora limpia de cosas: la primera es que si "Colt" or el "FP Compiler").
polvo y paja en un lugar de tienes microdrive tienes que Lo de la coma decimal flotante
trabajo. Esto lo logramos desconectarlo inmediatamente, es importantísimo para que el
estudiando el listado Basic y piensa que este artefacto tiene proframa funcione bien a la
las rutinas que incorpora el la virtudo de crear los mapas hora de presentar una literal
mismo como después se del microdrive cuando ha de ASCII retocada.
explicará. presentar un informe de error
Si tuvieramos que ver listados
o hacemos uso de el, y ocmo
Después de obtener la rutina en CM (todo se andara)
estos mapas consumen una
cargadora se puede pasar ya utilizaríamos un
importante cantidad de
sin más dilación a su estudio desensamblador. Todas estas
memoria y desplazan Basic
con el fin de poder crear un operaciones sin tocar el Basic
hacia arriba nos hace tediosa
bloque de código compacto cargador para nada.
nuestra labor "hackeriana".
del programa protegido, tanto Huelga decir que lo que
si nuestra intención es Respecto al disco ya es otro
primero tendremos que hacer
transferir el programa a alguna cantar debido a que, aunque
es quitarle el auto-run al Basic
memoria externa distinta al tambien consume una pequeña
para cargarlo con tranquilidad,
cassette (disco, microdrive, porcion de memoria, esta no es
aunque esta vez no habremos
etc.) como si deseamos utilizará a no ser que hagamos
de transformar la cabecera en
analizar el programa en sí. una llamada al DOS por lo que
bytes.
, en principio, no molestará.
Hablando de microdrives y
discos: para poder estudiar un

La Biblia del Hacker 32


TOP SECRET

El Basic de la Proteccion Turbo.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;9
;9,
, 

Jose Manuel Lazo

Habiendo dado en el número anterior una pasada general sobre el tema,


vamos a continuación a analizarlo en profundidad y que mejor que empezar
por lo primero que nos encontramos: el Basic de un programa TURBO.

‘
.’“.

No vamos a referirnos a lo hacae en el sitio donde


”’
.• – —ˆ˜A
s•.
‘‘)™ “”›

ningún programa en especial, apunta la variable WORKSP.
œ‘

y es por una razón muy ”’
.• žŸ ”.
” Iš
Sin embargo, en la cinta el
importante: todos los ¡•
.””.
  Basic está grabado sólo el
cargadores turbo son listado del mismo y las
”’
.• “”
.”  ›
Iš¢”
.” 
hermanos gemelos, esto es, los variables Basic, estando el
listados Basic son espacio de trabajo despué de
Por favor, pensad y
parecidísimos, siempre y esto por lo que este POKE no
recapacitad sobre esto, y hasta
cuando ambos estén hace nada esencial.
es interesante qe intenteis
protegidos en turbo. De igual
sacar vuestras propias Depués se pokea otra
manera, las rutinas cargadora
conclusiones antes de seguir dirección, hacia donde apunte
y desenmascaradora tienen
leyendo. ERR-SP con el contenido de la
también una gran similitud.
variable VARS. Este poke es
Qué ocurre en realidad.
De momento podemos ver el el fundamental y es el que
listado 1, es un ejemplo del Lo primero que vemos es que verdaderamente arranca el
Basic de un cargador Turbo carga la dirección de la código máquina
protegido. Debido a que a la variable del sistema E-LINE desenmascarador. Veamos
impresora no le afectan los con el contenido de la variable como es esto:
controles de color, no salen WORKSP, eso puede
En primer lugar tenemos que
mensajes de error al listarlo. llevarnos a pensar que con esta
tener en cuenta que cuando el
Este Basic, como podemos operación creamos una serie
ordenador ha de presentar un
comprobar tiene 4 lineas cuyos de comandos en modo directo
informe de error (poner OK en
números son 0 (cero). Y que se ejecutarán después del
la pantalla se trata como un
además, posee la protección de listado Basic. La variable E-
error) , mira el contenido de
las literales ASCII retocadas, LINE se encarga de contener
esta variable, ERR-SP, para
como vemos en el programa la dirección donde se hallan
ver donde está la dirección de
que hemos confeccionado los comandos que
la rutina de error,
(listado 2) y que viene a introducimos en modo directo
normalmente en la ROM.
significar lo mismo que el en el ordenador y, la variable
primero, una vez "traducido". WORKSP apunta a la Esto es así porque al
dirección de memoria donde producirse un error normal
En lineas generales, y después
se halla el espacio del trabajo mente la pila está
de analizar lo que hace en
del SO, así cuando éste tiene desequilibrada con valores de
realidad este cargador, se
que guardar los datos de los últimos cálculos que se han
puede llegar a resumir en lo
importancia para no perderlos realizado. ERR-SP entonces,
siguiente:
.
‚ƒ„ …K†ˆ‡A
s„ Š‰Y‹ Œ% „IŽ
apunta a la dirección de la pila

La Biblia del Hacker 33


TOP SECRET

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

La Biblia del Hacker 34


TOP SECRET

Rutina desenmascaradora del "Turbo".

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;9
;9,,
,, 

Jose Manuel Lazo

Habíamos quedado la semana pasada en que todos los programas TURBO


tienen la rutina de carga enmascarada para dificultar las labores de análisis.
En este capítulo explicamos cómo funciona la dichosa rutina
desenmascaradora.

esperados el cargador no comprobar si funciona o no


Una vez que tenemos
funcionará. funciona.
localizada la rutina
desenmascaradora en la zona Lo primero que tenemos que El C.M. de la rutina
de variables, podríamos pensar hacer, por tanto, es averiguar desenmascaradora.
que con un RANDOMIZE el valor de los registros a la
USR a la correspondiente entrada en el CM. Esto se Ahora nos tendremos que
dirección arrancamos esta puede hacer de varias armar de una tremenda
rutina, siguiendo sin maneras, pero la más sencilla paciencia para estudiar el CM
dificultades la linea del consiste en tener un monitor desenmascarador. Este se halla
programa. Nada más lejos de en memoria con la facilidad de protegido con nemónicos
la realidad, pues la protección Breakpoints y colocar una inexistentes y lo primero que
turbo se caracteriza, como justamente en la dirección de tendremos que hacer es sacar
hemos mencionado en algún las variables. Entonces salimos un listado del CM y ponernos
capítulo anterior, por tener un del monitor y tecleamos a traducir todas esas
CM desconcertante, GOTO 0 (cero) , con lo que el intrucciones incoherentes por
superprotegido y totalmente Basic del cargador hace los otras que no lo son tanto. Este
oscuro. ¿Qué significa esto?. pokes y salta a lo que el espera tema ya se trató en un capítulo
Basicamente que si no sea su rutina desenmascadora, anterior, por lo que no nos
arrancamos la rutina con un pero antes se tropieza con vamos a detener en él. De
GOTO 0 (cero) no nuestro Breakpoint y todas formas, se pueden
conseguiremos nada. Esto es volvemos al monitor para estudiar las transformaciones
así porque en el punto de inspeccionar y apuntar el valor que se han realizado sobre el
entrada de la misma los de los registros, tanto de los Listado I, el cual, además de
registro han de estar de una normales como de los servirnos para aprender a
forma precisa, como los han complementarios. hacer esto, es el principio de la
dejado las sentencias del rutina desenmascaradora de
A partir de este punto, y para
programa Basic que se han turbo.
asegurarnos de que vamos por
ejecutado. De igual manera, la buen camino, podemos ir Como podéis ver, este listado
zona del Basic se ha colocando Breakpoints en tiene muy poco sentido, y
transfigurado un poco con los distintos sitios de la rutina habremos de tener una gran
pokes que comentamos que no desenmascaradora, paciencia para descrifrarlo y es
nos servían para nada ejecutándola hasta él mismo y muy probable que tengamos
concreto. De todo esto se luego volver a lanzarlo de que volver a empezar desde el
deduce que si no se han hecho forma que podamos principio varias veces. Es
estas operaciones y los conveniente apuntar en una
registros no tienen los valores

La Biblia del Hacker 35


TOP SECRET

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.).

La Biblia del Hacker 36


TOP SECRET

La rutina desenmascaradora del turbo, paso a a paso.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;9
;9,,,
,,, 

Jose Manuel Lazo

Una vez que tengamos la rutina desenmascaradora limpia de polvo y paja,


esto es, que hayamos "traducido" todos los nemónicos falsos por las
operaciones que éstos realizan realmente, como vimos en el capítulo
anterior, podemos pasar a su estudio. Esta rutina hace una serie de
operaciones muy bien definidas y tiene unas características muy
especiales.

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

La Biblia del Hacker 37


TOP SECRET

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

La Biblia del Hacker 38


TOP SECRET

MINI MONITOR "TURBO". Para analizar los registros en los programas.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
; ,; 

Jose Manuel Lazo

Uno de los problemas más grandes que podemos encontrarnos al analizar


un programa TURBO es conocer el estado de los registros en cada
momento, con objeto de poder predecir el curso lógico del programa. Para
echaros una mano en este terreno, hemos preparado este MINI MONITOR
"TURBO".

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.

La Biblia del Hacker 39


TOP SECRET

La Biblia del Hacker 40


TOP SECRET

Cómo aislar la rutina cargadora del "TURBO"

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;;
;;


Jose Manuel Lazo

Dentro del complejo entramado que es una proteccion Turbo, podemos


distinguir un bloque que es precisamente la rutina cargadora. Sin embargo,
ésta se encuentra fuertemente enmascarada y además se reubica en otras
direcciones de memeoria una vez arrancada. Para aislarla y proceder a su
cómodo estudio, os presentamos hoy la mini rutina "Break-Turbo".

protección y un "moralizador" haber situado una cinta virgen


En capítulos anteriores de esta
consejo que nos dice que en nuestro cassette y veremos
misma serie y con referencia a
intentar romper esta como por arte de POKE se nos
la protección Turbo, hemos
protección puede ser graba la rutina cargadora
explicado que la rutina de
perjudicial para nuestra salud limplia de polvo y paja.
carga se encuentra camuflada,
(y casi tiene razón).
siendo desenmascarada por Una vez conseguido esto
otra rutina especificamente Esta mensaje se halla detrás podemos ya relajarnos, pues lo
diseñada para ello. del bucle desenmascarador por más dificil ha sido superado.
lo que en este sitio podemos
Toda esta teoría está muy Cuando hayamos llegado a
poner perfectamente un
bienm pero ¿cómo nos las este punto dispondremos en
programa que nos salve el
apañamos para conseguir el una cinta una grabación de
trozo de memoria que nos
código desenmascarado si no toda la parte superior de la
interese cuando se termine de
podemos volver al Basic para memoria, y como dijimos en
desenmascarar la rutina
grabarlo una vez lanzada la capítulos anteriores en este
cargadora.
rutina ni tampoco situar sitio es donde debe ir la rutina
ningun programa en memoria La manera de hacer esto es de carga especial.
debido a que este se nos muy sencilla. En el ejemplo Lo primero que tenemos que
reubicaria en virtud del que nos ocupa, situaríamos un hacer es localizar su punto de
LDIRque se efectua a mitad de programa CM, tal como el que inicio: esto se puede hacer de
la memoria?. se halla en el listado 1 en el dos formas distintas, la
punto en el que se encuentra el
Esta cuestión , despues de primera es haberlo visto en el
RET PO (direccion #61F4).
pensarla muy bien, se nos ve RET PE que arrancaba esta
Esta parte de la rutina
solucionada por un, digamos cargadora en el bucle
desenmascaradora se publicó
exceso de orgullo de los desenmascarador con el MINI-
en el número 92.
diseñadores de la proteccion monitor. La segunda es
turbo. Después grabaríamos una bastante más sencilla y casi
cabecera en la cinta con la infalible, se base en otro
Resulta que si
orden SAVE "Cargadora" pequeño fallo de la protección
desensamblamos en ASCII, la
CODE 32768,32768 (sólo la turbo: resulta que todas las
rutian cargadora, nos podemos
cabecera). rutinas cargadoras de turbo
enconrtar con una increible
que hemos tenido ocasión de
sorpresa: en la misma se halla Por último, sólo tendríamos
analizar empiezan con la
un mensaje en ingles con el que arrancar el programa con
instrucción: LD SP, #FFFF.
copyright del autor de la un GOTO 0, no sin antes

La Biblia del Hacker 41


TOP SECRET

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

La Biblia del Hacker 42


TOP SECRET

El corazon de la rutina cargadora del Turbo

/$%,%/,$'(/©+$&.(5ª ;;, 

Jose Manuel Lazo

Como vimos la pasada semana, existen dos bloques dentro de la rutina


cargadora del TURBO. El segundo es el verdadero corazón de la misma y
esta semana lo analizaremos en profundidad.

identificación de la cinta, esto se encarga la inicialización de


Vamos a echar un vistazo a la
se hace, a grandes rasgos, de la registros que viene después:
rutina ejemplo del listado 1.
siguiente manera: se mira si como veis se empieza a cargar
En ella podemos observar
hay ruido en el puerto del en la pantalla (direccion
como en el primer lugar se
cassette durante un máximo de #4000) y con una longitudo de
actualizar el registro SP (Stack
2 segundos, y se comprueba el #BE00 que sumados a la
Pointer) con el valor #FFFF,
ruido que ha entrado con un direccion de comienzo nos
esto nos pone la pila detrás
umbral que separa la copia indica que la carga termina en
para que no nos estorbe.
legal de la pirata. Si la copia es la direccion #FE00.
Luego, si os dais cuenta, viene
legal habrá muy poco ruido
un bucle que se encarga de De esto se deduce una cosa
porque estará grabada con un
poner la memoria de atributos muy importante: los bytes no
sonido limpio: sin embargo, si
con el papel negro y la tinta se solapan con el cargador, el
la copia es pirata, en virtud del
tambien negra, lo que tiene cual siempre está en una
control automático de
como fin que no se vea la direccion intocable por la
ganancia (CAG) que llevan
pantalla hasta el final de la cinta. Además, no hemos
incorporado prácticamente
carga. No es imprescindible su tenido ocasión de ver ningún
todos los cassettes para hacer
presencia en el programa, pero turbo en el que los bytes se
las grabaciones, se grabará un
hace bonito. solapen con el cargador. Esto
pequeño pero suficiente
es así por una razñón muy
Después se inicializan unos zumbido en el sitio en donde
sencilla: si se solaparan se
registros: IX y DE que, al la cinta debería estar
actualizaría la única variable
igual que con la rutina LOAD silenciosa.
que tiene el cargador y que
de la ROM, se encargan de
La rutina detectará esto, pero indica la originalidad de la
contener el comienzo y
no saltará a la cero como sería cinta, con el valor que entrase
longitud del bloque que se va a
de esperar si ocurriese, sino de la misma cuando se cargue
cargar. En este caso se trata de
que inicializa una variable del esta dirección, por lo que
la cabecera del programa turbo
cargador con un valor siempre se detectaría lo
que tiene 20 bytes de longitud
específico (1), y la carga mismo: original o no original.
como podreis ver se carga en
continua tan normal como de Esta circunstancia la
la direccion #8000, o sea, en el
costumbre. aprovecharemos después para
principio de la parte superior
poder pasar el programa a
de la memoria. La detección se produce velocidad lenta con objeto de
El CALL que se ejecuta más tarde almacenarlo en un disco o
después a la dirección #FFF11 Después de haber cargado la microdrive.
se ocupa de cargar los bytes cabecera tendremos que cargar Como veis, el CALL a la
que marquen los registros IX y el resto del programa; de esto cargadora es en este momento
DE, y después proceder a la

La Biblia del Hacker 43


TOP SECRET

distincto, ya que ahora no es direccion #FE00 se encarga de Por último, ya se efectua un


necesario el detectar ruido pokear toda la memoria con 0 LDIR de una rutina a la
despues de la carga. si la copia es pirata. Si memoria intermedia de la
tuviesemos una cinta turbo ya impresora y se pasa el control
Una vez finalizado todo el
muy gastada y que no entrara a la misma.A partir de aquí se
proceso, se compara el valor
bien por esta circunstancia, puede considerar que arranca
de una celdilla de memoria
sólo es preciso quitar este JP el programa en sí.
con 0 (cero), esto es...,
NZ, #FE00 para que el
efectivamente, la variable que
programa entre aunque tenga
indica la originalidad de la
ruido donde no deba tenerlo.
cinta. La rutina situada en la

La Biblia del Hacker 44


TOP SECRET

Cómo pasar un programa "Turbo" a disco o microdrive.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
;;
;;,,
,, 

Jose Manuel Lazo

Al estudiar el cargador de un programa TURBO pueden perseguirse varios


objetivos, pero principalmente suele pretenderse adaptar estos programa a
otro dispositivo de carga distinto al cassette, como suele ser el disco o el
microdrive. En este capítulo explicaremos cómo hacerlo.

detrás mismo del cargador esto


Para adaptar un programa El trozo de programa que esté
quiere decir que estos valores
Turbo a disco o microdrive situado en la memoria desde la
son intocables.
tendremos que hacerlo de una direccion 25000, en decimal:
manera muy especial, ya que hasta el final puede ser Una vez encontremos este
la memoria RAM a partir de la cargado desde disco en su lugar libre y nos aseguremos
direccion #5B00, osease, la verdadera direccion de trabajo de que realmente esté libre
memoria intermedia de sin problema. (cuidado con la pila si lo
impresora, se ha de quedar de Lo que debemos hacer ahora
encontramos muy arriba, o con
igual manera que si lo es dividir el programa original
los bytes que que entren de
hubieramos cargado de cinta, en tres trozos bien
cinta si esta muy abajo),
por si acaso. diferenciados: por una parte la
tenemos que ubicar en este
situi un programa
Desgraciadamente, el disco, y pantalla, que aunque no es
Breakpoint,tal y como está
sobre todo el microdrive imprescindible para poder
impreso en el listado 1.
utilizan la zona de antes del jugar, ni para distraernos
Basic para guardar datos de la durante la carga, si puede ser El programa "Breakpoint"
carga. En el caso del disco no objeto de un checksum, tal y
es tan problemático ya que como se explicó en el capítulo Como podeis ver, este mini-
sólo se necesitan 112 octetos, anterior. breakpoint se encarga, en el
pero el microdrive ocupa sus momento de llamarlo, de
En segundo lugar el trozo de grabar en cinta toda la
buenos 600 o 700 octetos de programa que esté en la
memoria para funcionar. memoria del ordenador tal y
memoria desde la dirección como esté, en tres trozos,
De esto se deducen varias 23296 hasta la 24999, ambas precisamente los pedazos del
cosas, la primera, y haciendo inclusive, y en último lugar el programa de los que hablamos
un esfuerzo para que lo que trozo restante, hasta el final de arriba.
vamos a decir valga lo mismo la memoria.
para microdrive que para Entre trozo y trozo, y antes de
La manera de sacar estos tres grabar el primero, espera la
disco, es que el trozo de trozos del programa es muy
programa que va desde la pulsación de la tecla Enter
sencilla: habremos de buscar para dehar un adecuado
23296 hasta la 25000 no lo un lugar libre de la memoria,
podemos cargar directamente especio entre los tonos guía de
que tiene que haberlo, de unos los siguientes bytes que se van
en su sitio, sino que hay que 40 ó 50 octetos donde poder
hacerlo en otro sitio y despues a grabar. En estos espacios
situar un break point al silenciosos de la cinta, que
reubicarlo. cargador. Este sitio habremos de calcular
normalmente está ubicado cronómetro en mano,

La Biblia del Hacker 45


TOP SECRET

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"

La Biblia del Hacker 46


TOP SECRET

Cómo pasar un programa "Turbo" a disco o microdrive.

/$%
$%,,%/,$'
$'((/©
/©++$&
$&..(5ª
ª
\;;
;;,,,
,,, 


Jose Manuel Lazo

La semana pasada nos introducíamos en el apasionante tema de la


conversión de programas comerciales a otros periféricos más fiables y
rápidos que el clásico cassette, como puede ser el microdrive o cualquiera
de las unidades de disco existentes para el Spectrum. Ha llegado el
momento de completar esta información adecuadamente.

igual manera, al segundo


na vez que hemos conseguido Después de pasar al drive el
bloque habremos de hacerle un
tal como explicabamos en el trozo pequeño de código
reubicador para poderlo cargar
capítulo anterior, tener en una pasamos el grande, operación
en la direccion de pantalla y
cinta de cassette los tres esta muy sencilla ya que sólo
luego reubicarlo en su sitio.
bloques que constituyen el hay que hacer un CLEAR
programa Turbo, El programa al disco. previo a la dirección 24999 y
procederemos a intercalar las con un LOAD " " CODE lo
correspondientes cabeceras, ya El reubicador para el bloque cargamos sin más; luego lo
que en la cinta habíamos pequeño sería tal y como el grabaremos en el drive con un
dejado previamente espacio que mostramos en el listado 3. SAVE "nombre" CODE
para ello. Estas cabeceras son Este va colocado detrás del 25000,40535.
fundamenteales para poder bloque que se pretende
Respecto a la pantalla huelgan
manejar el programa desde reubicar en la direccion 23296
comentarios.
Basic y posteriormente y siguientes. La forma de
guardarlo en disco o preparar este bloque pequelo Cuando tengamos los tres
microdrive. es como sigue: bloques grabados en el drive
hemos de hacer un cargador
Esta operación es muy Primero volcamos el
para poderlos utilizar, este
sencilla, situamos la cinta reubicador en alguna dirección
puede ser uno como el del
antes del primer bloque , la de la memoria, por ejemplo la
Listado 4. El bloque pequeño
pantalla y tecleamos en modo 61704 (no es capricho esta
se ha de cargar en último
directo: SAVE "pantalla" dirección tan exacta). Luego
lugar, y arrancar con un
SCREEN$, pero solo cargamos en la dirección
RANDOMIZE USR 18088,
grabamos la cinta al principio 60000 el bloque pequeño y a
esta direccion es porque 16384
del segundo bloque y hacemos continuacion lo grabamos en
+ 1704 = 18088 y recordemos
lo mismo SAVE "printer" el drive con la orden SAVE
que el reubicador del trozo
23296,1704. Y por último, "nombre" CODE 60000,1750.
pequeño se hallaba después
realizamos la misma operación El motivo de todas estas del mismo.
con el último bloque: SAVE direcciones tan exactas es
"gordo" CODE 25000,40535. Como podeis ver el cargador
porque el trozo pequeño tiene
que hemos hecho para el
Una vez que tengamos esto un total de 1704 bytes, va en la
programa nos pregunta una
hecho hemos de procurar dirección 23296 y lo cargamos
dirección del mismo para
grabar estos bloques en disco en la 16384.
pokear, esto se ha previsto así
o microdrive y hacer un para utilizaciones futuras de
cargador para los mismos. De

La Biblia del Hacker 47


TOP SECRET

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.

La Biblia del Hacker 48

También podría gustarte