Técnicas de Protección para BASIC
1. Introducción
Esta vez hablaremos de las diferentes técnicas de protección para nuestros programas hechos en ATARI BASIC, se preguntaran para que usarlo ahora, que fin tiene, Etc. Pero la idea es saber cómo se realizaban.
2. Desactivando teclas
Partimos con la primera de ella, y la más fácil que es desactivando teclas que permiten que un programa en BASIC pare su ejecución.
Tecla BREAK : Presionando esta tecla se para la ejecución de un programa en BASIC, con lo cual nos devuelve el control para hacer lo que queramos con el programa ya sea listarlo, modificarlo, grabarlo etc.
Para desactivar esta tecla se deben pokear las siguientes 2 posiciones de memoria dejando los siguientes valores.
POKE 16,112:POKE 53774,112
No olvidar que esta línea debe ir después de un GRAPHICS. Ya que cuando se ejecuta esta instrucción en BASIC las posiciones de memoria vuelven a su estado original.
10 GRAPHICS 1 20 POKE 16,112:POKE 53774,112 30 POSITION 0,3:PRINT #6;"PRESIONA TECLA break" 40 GOTO 40
Tecla RESET : Presionando esta tecla se resetea nuestro ATARI, con lo cual nos devuelve otra vez el control para hacer lo que queramos con el programa. Para desactivarlo tenemos que pokear la siguiente posición de memoria y lo dejamos con el valor 1, ahora cada vez que se presione esta tecla el ATARI se resetea pero borrando completamente todo.
POKE 580,1
10 POKE 580,1 20 GRAPHICS 1 30 POSITION 0,3:PRINT #6;"PRESIONA TECLA reset" 40 GOTO 40
3. Ocultar y ofuscar el listado
La segunda, es cambiar las variables de ATARI BASIC por valores inválidos para evitar que modifiquen nuestro programa, así evitamos que alguien cambie cualquier cosa. Guarde su programa y después escriba:
32766 END 32767 FOR VARI=PEEK(130)+PEEK(131)*256 TO PEEK(132)+PEEK(133)*256:POKE VARI,155:NEXT VARI
Para ejecutarlo escriba GOTO 32767.Ahora liste el programa con el comando LIST y enter, vera que todas las variables fueron reemplazadas por un enter (155).
10 DIM NOM$(10) 20 NOM$="ATARIWARE" 30 PRINT CHR$(125);" ";NOM$ 32766 END 32767 FOR VARI=PEEK(130)+PEEK(131)*256 TO PEEK(132)+PEEK(133)*256:POKE VARI,155:NEXT VARI
La tercera, es como evitar que listen nuestro programa con lo cual evitamos que miren nuestro código escrito. Antes ejecutar estas líneas primero guarde su programa normalmente, después escribe lo siguiente:
32766 END 32767 POKE PEEK(138)+256*PEEK(139)+2,0:SAVE "D:PROGRAMA2.BAS":NEW
Para ejecutarlo escriba GOTO 32767 y el programa se guardara sin problema, pero ahora solo lo podrá ejecutar con la instrucción RUN "D:PROGRAMA2.BAS", ya que si lo trata de cargar con load el atari lo cargara pero no dejara escribir nada.
10 DIM NOM$(10) 20 NOM$="ATARIWARE" 30 PRINT CHR$(125);" ";NOM$ 32766 END 32767 POKE PEEK(138)+256*PEEK(139)+2,0:SAVE "D:PROGRAMA2.BAS":NEW
4. Encriptación
La encriptación consiste básicamente en codificar una zona de memoria para ser luego decodificada durante la ejecución del programa. Con esto se logrará que el pirata no pueda editar los textos del autor, ya que simplemente no las encontrará.
Lo siguiente muestra un ejemplo de encriptación.
10 AUX=20:I1=AUX/AUX:ENCRYPT=AUX*I1:REM TODO ESTO ES PARA CONFUNDIR A LOS PIRATAS 20 DIM AUTOR$(AUX) 30 RESTORE I1*AUX 40 FOR I=I1 TO AUX:READ X:ENCRYPT=ENCRYPT+X:AUTOR$(I,I)=CHR$(ENCRYPT):N.I 50 ?"Creado por :";AUTOR$ 60 DATA 51,14,-12,3,0,-7,13,-5,2,-47,38,15,-16,9,12,-25,11,-3,-5,-3
Tipeenlo y saldrá el siguiente mensaje:
Esto es sólo un ejemplo. Ustedes pueden crear sus propias encriptaciones mediante sistemas aún más difíciles de detectar. Insisto: Este es el objetivo de este artículo.
Ahora lo que puede hacer el pirata (¿Todavia puede? Si.) es simplemente eliminar la linea de donde aparece el autor y después cambiarla por otra a su gusto, sin usar ningún tipo de variables. O también eliminando las rutina de encriptación. Ante esto, se puede solucionar colocando rutinas mprescindibles junto con la rutina de encriptación en el programa (Ojalá que esas rutinas ocupen la mayor cantidad posible de variables, pero no tantas como para hacer el programa muy lento y con poca memoria), de modo que el pirata, una vez que elimine las rutinas, se de cuenta que no puede hacer correr el programa.
Otra técnica es utilizar como variable numérica auxiliar uno de los códigos de la variable AUTOR$, para después, por ejemplo, utilizarla para instrucciones GOSUB y GOTO.
Aquí hay un ejemplo (No lo tipeen):
10 DIM AUTOR$(20) 20 AUTOR$="GUILLERMO FUENZALIDA" 30 REM PUDO HABERSE USADO LA ENCRIPTACION 40 AUX=ASC(AUTOR$(4,4))*2-ASC(AUTOR$(10,10)-10:REM = 100 50 GOTO AUX 60 END 70 NEW 80 NEW 90 NEW 100 REM AQUI VIENE EL RESTO
Tal vez sea un poco complicado para ti el hacer esto, pero imagina que mientras más difícil lo haces, más difícil le será al pirata.
5. Llave de seguridad
Es una que me llamo bastante la atención ya que es una llave de seguridad a nivel de hardware y software.
A nivel de hardware se crea un puente entre los pines del joystick, la idea es usar los pines correspondientes a los paddles y fijar los valores que usan (0 al 288) . Los fijamos uniendo los puntos con una resistencia. Esta nos entregara un valor único la cual nos servirá para validar si el usuario tiene la llave de seguridad.
Como se ve en la imagen se unirían con una resistencia los pines 5 con el 7, el 9 con el 7 y el 4 con el 8. Con esto tenemos un valor fijo para el paddle 0, paddle 1 y botón. Ahora podemos preguntar fácilmente en ATARI BASIC.
10 IF PADDLE(0)<>100 AND PADDLE(1)<>50 AND STRIG(0)=1 THEN NEW
Y preguntamos al inicio del programa, si no está la llave colocada en el ATARI el programa se borra.
10 FOR I=1 TO 10 20 GOSUB 100 30 GRAPHICS 1 40 POSITION 0,3:PRINT #6;"PANTALLA #";I 50 A=1^1^1^1^1^1^1^1 60 NEXT I 70 END 100 IF PADDLE(0)<>100 AND PADDLE(1)<>50 AND STRIG(0)=1 THEN NEW 110 RETURN
No olvidar que todas las técnicas de protección escritas aquí se pueden usar en conjunto para así hacer un programa más seguro.
Gracias a Guillermo Fuenzalida por compartir unos artículos de técnicas de protección que fueron escritos para la revista STAK 11 y 12 "las cuales nunca se publicaron" con ese material se complementó este artículo.