IMÁGENES SUBLIMINALES EN LAS PUBLICACIONES DE LOS TESTIGOS DE JEHOVÁClaude LaCombe
Recuerdo perfectamente la primera vez que oí hablar de las imágenes subliminales de los Testigos de Jehová. Fue en los primeros años del foro de religión “Yahoo respuestas” (que, por cierto, desapareció definitivamente el 30 de junio de 2021). El tema del debate era el “arte religioso”. Todos compartíamos nuestros puntos de vista sobre cuadros como “La Mona Lisa” o el arte apocalíptico de los adventistas, cuando repentinamente uno de los participantes dijo que en las publicaciones de los Testigos de Jehová se ocultaban imágenes subliminales demoniacas.
Lo que pasó después se halla plasmado en la presente obra.
Durante el período citado se sucedieron tres presidencias radicales a cargo de Hipólito Yrigoyen (1916-1922),
Marcelo T. de Alvear (1922-1928) y la segunda presidencia de Yrigoyen, a partir de 1928 la cual fue
interrumpida por el golpe de estado de 1930. Entre 1916 y 1922, el primer gobierno radical enfrentó el
desafío que significaba gobernar respetando las reglas del juego democrático e impulsando, al mismo
tiempo, las medidas que aseguraran la concreción de los intereses de los diferentes grupos sociales que
habían apoyado al radicalismo.
Presentación de la conferencia sobre la basílica de San Pedro en el Vaticano realizada en el Ateneo Cultural y Mercantil de Onda el jueves 2 de mayo de 2024.
Elites municipales y propiedades rurales: algunos ejemplos en territorio vascónJavier Andreu
Material de apoyo a la conferencia pórtico de la XIX Semana Romana de Cascante celebrada en Cascante (Navarra), el 24 de junio de 2024 en el marco del ciclo de conferencias "De re rustica. El campo y la agricultura en época romana: poblamiento, producción, consumo"
Examen de Selectividad. Geografía junio 2024 (Convocatoria Ordinaria). UCLMJuan Martín Martín
Examen de Selectividad de la EvAU de Geografía de junio de 2023 en Castilla La Mancha. UCLM . (Convocatoria ordinaria)
Más información en el Blog de Geografía de Juan Martín Martín
http://blogdegeografiadejuan.blogspot.com/
Este documento presenta un examen de geografía para el Acceso a la universidad (EVAU). Consta de cuatro secciones. La primera sección ofrece tres ejercicios prácticos sobre paisajes, mapas o hábitats. La segunda sección contiene preguntas teóricas sobre unidades de relieve, transporte o demografía. La tercera sección pide definir conceptos geográficos. La cuarta sección implica identificar elementos geográficos en un mapa. El examen evalúa conocimientos fundamentales de geografía.
Ponencia en I SEMINARIO SOBRE LA APLICABILIDAD DE LA INTELIGENCIA ARTIFICIAL EN LA EDUCACIÓN SUPERIOR UNIVERSITARIA. 3 de junio de 2024. Facultad de Estudios Sociales y Trabajo, Universidad de Málaga.
4. 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
5. 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
6. 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
10. 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
14. 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
17. 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
23. 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
24. 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
27. 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
más sobre el tema os podeis
fundamentos que se han 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
a trata con mayor detalle este
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
28. 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
31. 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
32. 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
35. 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
38. 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
41. 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
42. 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
45. 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
46. 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