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 ou4 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:
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:
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
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:
Flávio, artigo interessante esse hem? Pode dar alguns exemplos de jogos que usam dessa artimanha?
ResponderExcluir[]s Daniel
Daniel, aguarde pela postagem de amanhã. ;)
Excluir