- Um caso de análise e restauração do funcionamento de um dongle de porta paralela exigido por um compilador RPG II para contabilidade nos anos 1990
- O software original roda em um console DOS no ambiente Windows 98 e não funciona sem o dongle
- Após transferir a imagem de disco para um emulador e analisá-la, foi constatado que a mesma rotina de proteção contra cópia estava inserida dentro de executáveis como RPGC.EXE e SEU.EXE
- Por meio de análise em assembly, confirmou-se que a rotina sempre retorna um valor constante específico (7606h), e a verificação do dongle foi contornada com um patch de 4 bytes
- Com isso, o compilador RPG II da Software West passou a poder ser executado sem o dongle, um resultado significativo do ponto de vista da preservação de software clássico
A descoberta de um software contábil ancestral e do dongle
- Um software contábil baseado em RPG usado por 40 anos ainda estava em operação em um PC com Windows 98
- RPG é uma linguagem para computadores de médio porte como IBM System/3, System/32 e AS/400, que depois foi portada para MS-DOS
- Ao iniciar, o programa exigia um dongle de proteção contra cópia em hardware na porta paralela
- No dongle ainda restavam, de forma apagada, as inscrições “Stamford, CT” e o logotipo “Software Security Inc.”
- A palavra “RUNTIME” estava marcada nele, e seu significado foi esclarecido mais tarde durante a análise
Análise da imagem de disco e estrutura do compilador RPG
- A imagem de disco do sistema Windows 98 foi extraída e executada em um emulador
- Foram encontradas duas versões do compilador RPG II (produzido pela Software West Inc.) e o código-fonte RPG completo do software contábil
- O sistema tinha a forma de um menu composto por vários módulos RPG e arquivos de lote do DOS
- O próprio compilador fazia a verificação do dongle e também inseria a mesma rotina de proteção nos executáveis gerados
Engenharia reversa da rotina de comunicação com a porta paralela
- O disassemblador Reko foi usado para analisar o SEU.EXE
- Inicialmente, as instruções
in/out não apareciam, mas foram encontradas em outro segmento (0800h)
- Essa rotina lê o endereço da porta paralela na área de dados da BIOS e transmite/recebe dados pela porta LPT1
- O valor de resultado é armazenado no registrador
BX, não há valor de entrada e o retorno é sempre o mesmo
Inferência do valor constante e patch
- Foi confirmado que, no final da rotina, o valor de
BH fica fixo em 76h
- Apenas o valor de
BL permanecia desconhecido, então o intervalo de 0 a 255 foi explorado por força bruta
- A combinação correta foi confirmada como
BL=06h, isto é, BX=7606h
- Os primeiros 4 bytes da rotina foram substituídos por
MOV BX,7606h e RETF, contornando a verificação do dongle
- Depois disso, o programa passou a executar imediatamente, e a mesma modificação pôde ser aplicada a outros executáveis com a mesma rotina
Resultado e significado
- O mesmo código de proteção contra cópia foi encontrado em todos os componentes do compilador RPG II, permitindo uma correção em lote
- Como o dongle apenas retornava um valor constante, ele pôde ser neutralizado com apenas um patch de 4 bytes
- O compilador modificado funciona normalmente sem o dongle e, após a remoção de informações pessoais, deverá ser publicado como arquivo histórico de software
- Quase não há material online sobre a Software West Inc., então há a esperança de estabelecer contato adicional com os criadores
1 comentários
Comentários no Hacker News
A proteção de software no começo era realmente muito simples
Eu tinha um disco de upgrade do Windows 3.11, e o instalador falhava se não encontrasse uma versão anterior instalada
A solução era simplesmente criar um arquivo de texto vazio e salvá-lo com o nome
win.com. Isso acontecia porque o instalador varria o disco inteiro e só procurava esse arquivoNa prática, o disco de upgrade já incluía a instalação completa. Naquela época, era tudo muito simples
No fim, pegamos uma versão 3.x com um amigo e instalamos, e senti que era moralmente aceitável, já que o anúncio dizia outra coisa
Dá para ver fotos do produto neste link do eBay
Eu desenvolvo software para engenharia civil (mes100.com)
Ainda hoje há usuários que preferem dongles de hardware. Eles dizem que só se sentem seguros quando têm um dispositivo físico em mãos
Como vendo licenças perpétuas, quando um dongle quebra é complicado, porque não há peça de reposição. Licenciamento em nuvem é algo de que eles não gostam, embora permita receita por assinatura
Mas, por mais esforço que eu faça, versões crackeadas continuam circulando online. Não tenho estrutura para reagir legalmente, então proteção é essencial
Além disso, alguns simplesmente gostam da autonomia de não depender de um servidor de terceiros
Por isso, o modelo SaaS parece um desastre para o usuário. Não gosto de pirataria, mas também não gosto de SaaS
Antigamente, cracks eram muito mais simples
Dava para contornar a proteção simplesmente trocando JE ou JNE por JMP
O essencial era descobrir onde o código de proteção estava e como ele funcionava
Primeiro, como os desenvolvedores lidam com o código por muito mais tempo do que nós, uma proteção complexa demais dificulta a correção de bugs
Segundo, cada hacker só precisa conhecer alguns truques, mas o desenvolvedor precisa bloquear todos eles
Terceiro, funcionalidades de proteção são um trabalho pouco interessante e sem reconhecimento, então há grande falta de motivação
Digitei aquilo e ele foi ativado na hora. Depois acabei comprando a licença de verdade
Era um método de assinar o disquete com laser, mas até um adolescente que soubesse ler assembly conseguia quebrar facilmente
Na verdade, era possível copiar até só arranhando o disquete com um alfinete. No fim, foi um caso em que o marketing ficou à frente da tecnologia
Escrevi código RPG II nos anos 80 e, nos anos 90, ajudei na migração para um ambiente de emulação S/36
Usávamos um produto da California Software Products, e ele funcionava bem o bastante para a empresa continuar existindo até o fundador se aposentar
Sobre o comentário “esse método de proteção contra cópia não é simples demais?”, eu diria que, naquela época, era um nível adequado de engenharia
Com emuladores e decompiladores, dava para resolver em poucos dias, mas na época essas ferramentas nem existiam
90% do software daquela época era realmente tão simples assim. Não é que faltasse perceber algo complexo
Quando eu era criança, já crackeei um jogo Ultima
Foi porque eu achava um saco ter que colocar o disquete toda vez. O código se descriptografava sozinho e lia o endereço inicial de um setor específico do disco
Esse setor não podia ser copiado com ferramentas normais, mas resolvi o problema alterando o cabeçalho do executável
No começo dos anos 90, fiz manutenção de um sistema de renovação de licença desenvolvido internamente pela matriz de uma franquia
Era preciso renovar todo mês por disquete, e a matriz às vezes bloqueava arbitrariamente lojas de que não gostava
No fim, várias unidades se juntaram e abriram processo, e eu criei um gerador de licenças baseado em DOS para que cada loja pudesse renovar por telefone recebendo um código
Depois que o processo terminou, distribuí um patch que removia completamente a checagem de licença. Um dia ainda quero rodar isso de novo no DOSBox
Achei interessante ver um texto dizendo que o Windows 95 ainda é usado em produção
Ao contrário das tendências chamativas de IA, nas áreas mais sem graça da indústria as mudanças tecnológicas são lentas
Existem até hoje sistemas rodando em emulador de PDP-11
É impressionante que esse software e esse hardware ainda estejam em uso em algumas empresas
Por isso, publicar uma versão crackeada pode trazer risco jurídico
Como empresas pagam muito dinheiro para manter sistemas antigos funcionando, esse tipo de lock-in de fornecedor continua existindo
Se a patente ou a propriedade intelectual ainda estiverem em vigor, é preciso verificar isso antes de publicar qualquer coisa
Um dongle de hardware que simplesmente retorna um número fixo — realmente é um método de proteção muito simples
Mas, na época, isso já era suficiente. Até hoje softwares corporativos usam algo parecido, como apenas uma chave de licença
No fim, era a versão dos anos 80 da ideia de “se houver algum sinal de que existe uma cobrança, as pessoas pagam”