sábado, 28 de julho de 2012

Proteção de programas em fitas: constantes numéricas

Eu já tive oportunidade, na série sobre adaptação de jogos para disquetes Beta 48, mencionar sobre proteção de programas BASIC contra listagem. Na ocasião, recomendei o uso do utilitário STK para poder carregar e listar tais programas. O que eu não tinha dito é que existe uma forma de proteção que não pode ser contornada pelo STK. 

Fonte: Wikipédia

Para ter uma ideia de como isto funciona, digite no TK90X ou emulador a seguinte linha BASIC e rode com RUN:

10 PRINT 0

Como esperado, observa-se que aparece impressa na tela o número 0. Agora digite a seguinte linha:

POKE PEEK 23635+256*PEEK 23636+10,1

e faça um LIST. Aparentemente o programa BASIC não mudou nada. Rode o programa, e... surpresa! Não aparecerá na tela o número 0, mas um outro valor! Como isso seria possível?

O BASIC Sinclair armazena constantes numéricas em duas formas, sendo uma que é usada apenas para ser vista na listagem. A outra, com codificação binária. de fato é a usada no processamento, porém é invisível da listagem. O motivo de se fazer isto é que a velocidade de processamento em codificação binária é muito mais rápida do que em decimal, porém esta última que é compreensível ao ser humano. Portanto, armazenando uma constante com dupla codificação consegue-se contemplar tanto uma boa velocidade de execução, como a legibilidade da listagem.

A proteção consiste justamente em subverter a dupla codificação, deixando que a listagem deixe de coincidir com o valor binário. No caso acima, o POKE alterou o valor binário para 256, porém a listagem foi mantida como se fosse 0. A propósito, os endereços 23635-23636 correspondem à variável de sistema PROGBAS ou PROG que contém o endereço do início da área em que o programa BASIC é armazenado.

Infelizmente o STK não leva em conta a codificação interna das constantes numéricas e acaba sendo ludibriado por alguns jogos protegidos. Eu tive que elaborar um pequeno programa assembly para estes casos, o Basic Lister, que exibe em modo INVERSE os códigos invisíveis inseridos numa listagem. Este programa está disponível no Google Drive ou 4 Shared. Eu pretendo melhorar este programa ainda, mas é possível ir usando como está.

Carregando este programa na RAM a partir do endereço 50000, para rodá-lo basta digitar:

RAND USR 50000

No exemplo acima, será exibida a constante 0 seguido do valor codificado em binário que é 256.

Para entender melhor como uma linha BASIC é armazenada na RAM, e como é a codificação numérica de 5 bytes no BASIC Sinclair vide:

2 comentários:

  1. Flávio, artigo interessante esse hem? Pode dar alguns exemplos de jogos que usam dessa artimanha?
    []s Daniel

    ResponderExcluir

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