domingo, 15 de dezembro de 2013

Proteger programa contra BREAK

Uma medida obrigatória para proteger um programa e evitar sua listagem é não deixar que seja interrompida. Quando um programa BASIC é executado no TK90X, pode ser interrompido ao se pressionar a tecla BREAK (Caps-shift e Espaço).


BREAK reseta computador

Experimente digitar e rodar o seguinte programa BASIC:

10 LET e=PEEK 23613+256*PEEK 23614:POKE e,0:POKE e+1,0
20 FOR n=0 TO 1e6
30 PRINT AT 10,0;n
40 NEXT n

Ao pressionar a tecla BREAK, ao invés de de interromper sua execução, ocorrerá reset do computador.

A variável de sistema em 23613 (P_ERR ou ERR_SP) contém o endereço do elemento da pilha do Z80 com o endereço de retorno de uma sub-rotina, caso ocorra uma interrupção ou fim do programa. No programa BASIC acima, o elemento da pilha ficaria no endereço e e o endereço de retorno seria dado por PEEK e+2546*PEEK (e+1). Ao colocar com POKE o valor 0 em e e em e+1, o endereço de retorno é redefinido como 0, o que é equivalente a USR 0, isto é, a rotina de reset (inicialização) do TK90X é chamada. Qualquer interrupção no programa BASIC, inclusive por se pressionar a tecla BREAK, irá apagar toda a RAM.

BREAK desativado

Experimente digitar e rodar o seguinte programa BASIC:

10 LET e=PEEK 23613+256*PEEK 23614:
15 LET e=e-2:POKE 23614,INT (e/256):POKE 23613,e-256*PEEK 23614
20 FOR n=0 TO 1e6
30 PRINT AT 10,0;n
40 NEXT n

Mesmo que se pressione a tecla BREAK, o programa em execução não será interrompido. O efeitos dos POKEs acima é alterar a variável de sistema P_ERR ou ERR_SP, para que aponte uma posição abaixo na pilha do Z80. Com isto o BREAK, ao invés de direcionar a execução para a rotina de tratamento de dados, irá retornar para o interpretador BASIC.

BREAK trava computador

Experimente digitar e rodar o seguinte programa BASIC:

10 POKE 23659,0
20 FOR n=0 TO 1e6
30 PRINT AT 10,0;n
40 NEXT n

Se o programa for interrompido, a tela fica toda preta e o computador fica travado (crash). A variável de sistema em 23659 é o DF_SZ, que especifica o número de linhas da parte inferior da tela, empregada pelo editor de linhas. O editor requer no mínimo 2 linhas para funcionar, caso contrário o monitor BASIC fica travado. Quando um programa BASIC está rodando, o editor não está ativo e não há grandes problemas. Porém quando o programa é interrompido por qualquer motivo, o monitor tenta acionar o editor de linhas e acaba travando.

O comando INPUT uitliza o editor de linhas e portanto travará se for invocado após POKE 23659,0. O remédio é fazer um POKE 23659,2 antes de INPUT.

Conclusão

Foram apresentadas três técnicas empregadas por programas comerciais para proteger um programa BASIC, normalmente um dos pontos fracos contra pirataria. Nenhuma delas é infalível, pois há situações em que as variáveis de sistema acabam sendo sobrepostas. Em programas longos, recomenda-se colocar os POKEs em vários locais diferentes.

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.