Craqueando Programas

Know-How e implicações jurídicas

1-Introdução:

Os programas comerciais possuem distribuições experimentais, destinadas ao teste

dos consumidores e, por isso, tem limitações, seja nas funções oferecidas, seja no período

de tempo oferecido para usa-los gratuitamente. Crackear um programa é retirar-lhe a

limitação de uso. Quando a limitação diz respeito à funcionalidade, e ele não possui a

opção de registro para uso completo, torna-se pouco provável o sucesso no crackeio.

Existem várias formas de crackear, mas antes de qualquer coisa é necessário que

classifiquemos o programa a ser crackeado segundo a sua limitação em uma das categorias

abaixo:

a) Programa Cinderela: é aquele que só funciona durante um certo período de tempo

(exemplo; 15 dias, um mês, etc.) contando a partir da data de instalação.

b) Programa Best-Before: funciona até uma data preestabelecida, independente da

data de instalação. Limitações deste gênero são as prediletas das empresas como a

Microsoft, a Simantec ou a Corel;

c) Programas Countdown: caracteriza-se pela contagem regressiva, o executável

funciona apenas por algumas horas, minutos ou segundos, Limitações deste tipo são

puoco comuns, mas por serem posíveis, nada mais justo que relacionarmos aqui.

d) Programa Quiver: tem seu funcionamento limitado pelo número de execuções.

Não se trata de uma proteção temporal, mas seu esquema de proteção se parece

muito com os dos três tipos anteriores.

2-Retirando a proteção Temporal:

Estudaremos agora como funciona uma proteção temporal e passaremos à análise de

como retirá-la. Vale salientar que a função deste artigo é meramente científica. Levar ao

conhecimento público a forma pela qual se dá o crackeio de programas é promover,

ainda que de maneira forçosa, o desenvolvimento dos métodos de proteção dos

softwares, pois só nos é dado desenvolver a solução de um problema quando o

conhecemos.

Os programadores lançam produtos completos, porém com algumas limitações.

Uma delas é a data de caducidade, como que uma data de “validade” do programa,

passada a qual, ele não funciona mais. A razão é simples: inundando o mercado com

cópias com limitações de tempo, cada vez mais usuários se acostumarão com o

software, e para muitos ele se mostrará indispensável, razão pela qual o comprarão

independentemente do preço.

Críticas à parte, pensemos sobre como se dá o funcionamento desta limitação:

instalaremos um programa do tipo Cinderela (evaluation) com limitação de uso de trinta

dias, no 1º de janeiro de 2002; portanto a partir do dia 30 de janeiro do mesmo ano o

programa não funcionará mais (o primeiro dia é, via de regra, incluído na contagem).

Quando executado, o programa confere se a data atual é menor que a de caducidade; em

caso positivo, ele é executado normalmente; caso contrário, exibirá a tão conhecida

mensagem “período de avaliação terminado, registre o programa para continuar a usalo”.

Assim sendo, uma coisa é certa: o programa deve guardar pelo menos uma das

seguintes informações: a data de instalação, o período de avaliação, ou ainda, a data de

caducidade. Mais freqüente é o registro da data de caducidade; o programa, na

instalação, calcula a data de caducidade e a grava em algum lugar, normalmente no

Registro do Windows com qualquer nome dificilmente relacionado ao programa sob

avaliação. Também pode ser guardada no win.ini, no system.ini ou em qualquer outro

arquivo, oculto ou não, criptografado ou não. Mas existe uma forma diferente e mais

complexa de se registrar a data de caducidade do programa, gravando-a dentro do

próprio programa(um exemplo é o programa Hotmetal 4.0, cuja avaliação é do tipo

best-before, funcionando apenas até 31/12/97).

Já sabemos onde procurar a data de caducidade, mas onde o programa busca a data

atual? Normalmente, ele captura a data do próprio relógio do windows, mediante as

chamadas getlocaltime ou getsystemtime, mas a data atual também pode ser verificada

conferindo arquivos que são freqüentemente modificadas pelo sistema, tal qual ocorre

com o system date o user.dat(registro) ou, ainda, o bootlog.txt,

Sabendo disso agora o programa pode ser atacado. Para isso, quatro são as técnicas

clássicas:

a) Modificar a contagem da data de caducidade: em vez de adicionar 30 dias à data

de instalação do programa, fazemo-lo somar anos, décadas ou até séculos, mas esta

modalidade não é fácil, pois trabalha com o próprio executável, e modificar um

executável é uma operação cirúrgica;

b) Modificar a data de caducidade: se a data é calculada na instalação,e não a cada

execução do programa, podemos aumenta-la em vários decênios(desde que também

não contenha uma limitação do tipo best-before, como ocorre com a Enciclopédia

Encarta 2000).

c) Antecipar a caduquez do programa: faz-se adiantando o relógio do windows;

com isso, verifica-se-ão as mensagens exibidas pelo programa uma vez vencido o

prazo de uso. Uma vez conhecidas estas mensagens, procuraremos a respectiva

chamada no programa e podemos desviar seu fluxo.

d) Ataque simultâneo as datas de atal e de caducidade: Faz com que sempre

estejamos no período de avaliação.

Pergunta bastante freqüente entre os usuários leigos; por que todo esse problema

não se resolve atrasando o relógio do windows? Os programadores evitam isso de duas

formas; Ou fazem uma marca em algum arquivo mostrando que o período de avaliação

já terminou (assim, ao ser executado, o programa, antes de conferir a data checa se esta

marca existe), ou registram a data da última execução do programa.(desta forma, antes

de conferir se ainda está no período de avaliação, o programa checa se a data da última

execução é anterior a da execução atual), resumindo, mais problemas a serem

verificados.

Muitas vezes, o programa tem a opção de terminar com a limitação temporal de uso

mediante o registro feito com a digitação de uma seqüência de caracteres referentes,

normalmente ao nome de usuário, nome da empresa e código de ativação.

Para verificarmos se o programa contém uma proteção temporal, pode se usar o

Softice com a instrução bpx getlocaltime. No entanto usaremos uma técnica mais

simples e nos valeremos do programa cobaia.exe, distribuído pela revista geek, # 13(

quem não tiver o programa, é só mandar um e-mail pedindo). Este programa é ideal

para exemplificarmos como se pode achar o código de série no executável, desviar o

fluxo do programa nas rotinas de verificação e construir patches (programas que

alteram apenas uma parte do programa, principalmente as rotinas relacionadas às

limitações temporais), MAS ATENÇÂO: O programa cobaia.exe, foi utilizado, antes

de tudo, porque crackear programas comerciais é crime. Como já dissemos, este

texto serve apenas para os programadores, sabendo das técnicas crackers, prestem

maior atenção na programação das rotinas de verificação e limitação de uso de seus

softwares. Apenas a título de conhecimento, consultemos a Lei9.609, de 19 de fevereiro

de 1998;

Art 12; Violar direitos de autor de programas de computador. Pena - detenção de 6

meses a 2 anos ou multa.

Art 14, § 5; Será responsabilizado por perdas e danos aquele que requerer e

promover as medidas previstas neste e nos Arts 12 e 13, agindo de má-fé ou por espírito

de emulação, capricho ou erro grosseiro, nos termos dos Arts; 16, 17 e 18 do Código de

processo Civil.

3-Crackeando o Programa Cobaia.exe:

3.1 – Extraindo o Código de ativação do programa;

Material Necessário: Cobaia.exe (obviamente); Hackman Editor(disponível no

CD-ROM) ou qualquer outro editor Hexadecimal.

Como o cobaia.exe requer o registro, nos usaremos o método reverso, ou seja,

inseriremos qualquer seqüência de caracteres no campo de registro, pressionaremos o

botão “Registrar” e conferiremos se há mensagem indicando que o código de ativação não

confere. Ela existe e é “Senha-Errada”.

Feito isso, abriremos o programa cobaia.exe com um editor hexadecimal e

procuraremos por esta string [“Senha-Errada”] no programa. Utilizaremos como referência

o Hackman Editor. Porque está disponível no CD-ROM da revista, mas nada impede que

você utilize o editor de sua preferência para isso, copie o programa cobaia.exe para o seu

computador, execute o Hackman Editor e pressione ctrl+o [arquivo/abrir.../abrir arquivo...],

localize o cobaia.exe e clique em Abrir. Uma vez aberto, pressione ctrl+f e clique no botão

ASCII [um dos 5 botões situados na parte inferior da caixa de diálogo], pois procuraremos

por uma seqüência de caracteres ASCII, e digite “Senha-Errada” [sem aspas] no campo de

procura. Então clique em localizar e VOILA!

Como podemos ver, a seqüência “Senha-Errada” vem depois de duas outras

referências bastante interessantes; “GEEK 13” e “parabéns”. Logicamente, tentaremos

conferir se a seqüência GEEK 13 é o código de ativação.

3.2 - Desativando o Fluxo de Verificação no Programa;

Material Necessário; Cobaia.exe(mais uma vez, obviamente) e o desassembler e

debugger w32dasm [se você não tiver, mande um e-mail pra gente].

Abra o w32dasm, vá à opção disassembler..., Escolha Open File to Disassemble...,

Procure pelo programa cobaia.exe e clique em Abrir. Espere por alguns instantes até que o

processo de abertura do arquivo termine. Você verá uma tela parecida com a da página

seguinte.

Não se assuste com a interface. Vá ao menu Refs e escolha String Data References.

Surgirá uma relação com as strings contidas no programa. Façamos de conta que ainda

não sabemos qual é a chave do programa. Então percorreremos a lista à procura de

“Senha-Errada”, encontrá-la-emos e clicaremos com o mouse por duas vezes:

Feche a janela com a lista de strings, e você ficará nesta tela;

Rolando a tela um pouco para cima, você verá a indicação de duas strings bastante

sugestivas: “GEEK 13” e “PARABÉNS”. Logo, tente a primeira delas como hipótese à

chave do produto, Voilá. Mas isto não é o suficiente, você quer fazer um crack, estudar

como é feita a verificação do código-chave e quebrar esta verificação desviando o fluxo

normal do programa. Para isso, é necessário um conhecimento prévio em assembler.

Analisando o código em assembler, verificamos que a indicação “Senha_incorreta”

[0045766D] é chamada pela rotina que contém a string “GEEK-13” [0045764F]

mediante o comando jne 0045776D, e que é responsável por pular para a indicação de

“Senha-Errada”, caso a senha digitada não seja “GEEK-13”. A instrução jne é

responsável pelo salto caso uma condição seja atendida – no caso, a senha digitada ser

diferente de “GEEK-13”. Para mudar o fluxo do programa, anote o endereço em que

está a rotina jne 00457659 [pois ela será modificada] e também o endereço ao qual irá

redireciona-la; 0045765B [início da rotina responsável pelo “parabéns”]. Então, acesse

o menu Debug e escolha Load process. Então clique no botão Go To Adress e digite o

endereço ao qual iremos [00457659]. Feito isso, clique em Patch Code e em Enter New

Instruction Below. Digitaremos a instrução alterada: jne 0045765B [assim, ainda que a

chave digitada seja diferente de “GEEK-13”, o programa dará os “parabéns”]. Digitada

esta instrução, dê um Enter para que ela seja incorporada e clique em Apply Patch.Será

pedido que seja confirmada a mudança do código: dê um OK e clique em CLOSE: Será

pedido, novamente para você confirmar a ação: dê OK novamente. Agora é só clicar em

RUN ou pressionar F9 até que o programa seja totalmente aberto [a cada vez que você

pressione F9 ou RUN, é executada apenas uma parte do programa].Quando isto

acontecer, tente digitar qualquer coisa [ou nada], clique em Registrare VOILÁ, você

crackeou o programa cobaia:

Para sair, feche o COBAIA e clique em “CLOSE”, confirme a saída e feche o

w32dasm, Se quiser, pode salvar o código assembler do cobaia.exe.

3.3 – Criando um patch para “brincar” com o programa.

Material Necessário; Hackman Editor[ou qualquer Editor Hexadecimal de sua

preferência].Patch Creation Wiizard [se Não tiver mande um e-mail pra gente] e

Cobaia .exe[obviamente].

Abra o cobaia.exe no Hackman Editor e procure pela string “Senha-

Incorreta”[conforma descrito no item 3.1].Então copie a tradução desta srting para

Hexadecimal. Para fazer isso, basta verificar que o Hackman Editor é composto de duas

telas; a da direita tem os caracteres em ASCII [é nela que vemos a referência para

“Senha-Incorreta”], enquanto a da esquerda em estes mesmos caracteres, só que em

linguagem hexadecimal[53 65 6E 68 61 5F 45 72 72 61 64 61], Copie também a

indicação em hexadecimal da palavra “Parabéns”[50 61 72 61 62 65 6E 73].

Com estes dados em mão, abra o Patch Creation Wizard, clique em Next, escolha

Seek and Destroy Patch,Clique em Next novamente, preencha os campos You

Handle[aparecerá como “Nome do Autor”],Target Title [objetivo do crack] e, Target

File, localize o programa Cobaia.exe: Feito isso, clique em Next novamente, então

clique em Add Item, em Length e digite 12, porque a seqüência que será substituída é

composta por 12 indicações em hexadecimal [cada indicação é composta por duas

casas]. Em Source, digite 53 65 6E 68 61 5F 45 72 72 61 64 61; Em New Source,digite

50 61 72 61 62 65 6E 73 20 20 20 20 [código da palavra “parabéns” seguido por quatro

espaços, o que na escrita hexadecimal, equivale ao Nº 20. Isso ´e feito porque a

substituição só ocorre com strings do mesmo tamanho e, neste caso, “Senha-

Incorreta”tem quatro letras a mais que “Parabéns”, devendo o espaço que sobrou ser

completado com espaços vazios – 20]. Finalmente, em Skip Seq, coloque 1 1 1 1 1 1 1

1 1 1 1 1 [pois todas as letras serão alteradas – cada Nº 1 se relaciona a uma referência

hexadecimal. Caso houvesse alguma referência aproveitável, ou seja, igual em ambas as

Strings localizada na mesma posição, colocaríamos o Nº 0 para esta posição, indicando

que ela não deve ser alterada]. Feito isto, dê ADD e clique em Next. O Patch foi criado

no mesmo diretórioi em que se encontra o executável Crackeado; certifique-se que o

Cobaia.exe não está marcado com o atributo Somente Leitura e execute o Patch, Se

tudo foi feito corretamente, o Patch indicará que modificou um setor programa. Então

execute o Cobaia e digite qualquer chave para testa-lo: VOILÁ, o cobaia agora acatará

qualquer coisa.

Vale salientar, todavia que, o que nós fizemos foi uma simples alteração da

mensagem exibida pelo programa, pois a rotina de verificação é a mesma, e ele

continua entendendo que a chave digitada foi diferente da esperada, ou seja, “GEEK –

13”. Para Crackear programas com chave de registro, isto não basta. Teríamos que

debulhar o código desassemblado para dele extrair a lógica de comparação entre a

chave digitada e o nome de usuário [caso o programa, além da chave, exija um nome de

usuário]; no caso do Cobaia.exe, bastaria que salvássemos uma cópia com aquela

mudança de fluxo efetuada, e daí gerássemos um Patch com a diferença entre ambos os

executáveis, pois, desviando o fluxo, o programa, ele executaria a rotina de liberação

do Software, destravando-o para uso ilimitado.

0 comentários:

Postar um comentário