Tutorial de Linguagem de Montagem

Por favor escolha uma página tutorial:

  • Fundamentos — Informações sobre C
  • Ferramentas
  • Registros
  • Instruções simples
  • Exemplo 1 — SC CDKey Initial Verification
  • Exemplo 2 — SC CDKey Shuffle
  • Exemplo 2b — SC CDKey Final Decode
  • The Stack
    • Stack Example
  • Functions
  • Example 3 — Storm.dll SStrChr
  • Resumo da Montagem
  • Código da Máquina
  • Exemplo 4 — Esmagar a Pilha
  • Cracking a Game
  • Exemplo 5 — Cracking a Game
  • Exemplo 6 — Escrevendo um keygen
  • .dll Injection and Patching
  • Memory Searching
  • Exemplo 7 — Escrevendo uma trapaça para Starcraft (1.05)
    • Exemplo 7 Passo 1 — Exibindo mensagens
    • Exemplo 7 Passo 1b — Acima, c/ func ptrs
    • Exemplo 7 Final
  • Exemplo 8 — Obtendo IX86.dll files
  • 16-bit Assembly
  • Exemplo 9 — Keygen para um jogo de 16-bit
  • Exemplo 10 — Escrevendo um carregador

Esta seção irá rever várias técnicas usadas por crackers para registrar jogos/software. Eu não menciono cd-cracks, porque não sei como fazer isso; ao contrário, menciono ataques que geralmente são baseados em uma chave ou código de registro.

Protecções Comuns

A protecção mais comum, e aquela aqui discutida, é quando um programa requer uma chave de registo para desbloquear. Normalmente, a chave é baseada em um código de registro aleatório fornecido pelo programa, ou baseado no nome de usuário que você digitar.

I’ll listarei algumas definições aqui. Note que estas definições são minhas, e não correspondem necessariamente às definições que outros usam. Elas são simplesmente para facilitar a compreensão disto e das seções seguintes:

  • Um código de registro é um código gerado por um programa, do qual a chave de registro é derivada ou comparada com.
  • Um nome de usuário de registro ou apenas nome de usuário é um nome de usuário que um usuário digita. A chave de registro é baseada nesse nome de usuário.
  • Uma chave de registo é a chave utilizada para desbloquear um programa. Ela pode ser baseada em um código de registro, em um nome de usuário de registro, ou baseada em nada.

Localizar o Spot

O primeiro exemplo passa por cima do algoritmo de verificação CDKey do Starcraft, mas eu forneci o algoritmo. O Starcraft é o tipo mais simples de verificação, a chave se verifica a si mesma sem um nome de usuário ou código. A questão é, como você encontra o algoritmo?

Bem, a resposta infeliz é, ele varia, e geralmente não é fácil.

O primeiro passo é, obviamente, desmontar o programa. Depois disso, como um cracker, você tem que tentar encontrar um ponto fraco no programa. Aqui estão várias técnicas:

  • Procure pelo texto que solicita a chave
  • Procure pelo código de registro na memória, e descubra onde ele é acessado
  • Digite um código, faça com que ele falhe, depois procure na memória por aquele código que falhou
  • Procure por qualquer coisa única sobre o registro (cores, texto, diálogos, etc).
  • Procure a chave de registro que armazena a chave
  • Procure um arquivo que armazena informações de registro
  • Procure a mensagem de erro quando uma chave ruim é dada

A última técnica é a mais útil, eu encontrei. No entanto, tentar todas elas, e tentar qualquer outra coisa que pareça ser a mais adequada ao jogo funciona melhor. No exemplo na próxima seção, descobri que pesquisar o texto informando ao usuário que o software não está registrado funcionou bem para o jogo, como você verá mais tarde. Posso fazer um segundo exemplo onde procurei pelo ficheiro que guardou a chave, e onde foi criado.

Para encontrar o verificador de CDKey do Starcraft, comecei com o tráfego de rede, na função Winsock (send() e recv()). De lá, eu retrocedi para encontrar para onde o pacote é enviado que valida a chave do Starcraft com Battle.net. Foi muito trabalho, mas na época eu estava aprendendo sobre a atividade de rede do Starcraft, então foi principalmente um efeito colateral do que eu já estava fazendo. Se eu continuar escrevendo esses tutoriais, eu posso eventualmente entrar em muitos detalhes, mas eu ainda não tenho planos de.

Cracking the Game

Após o local certo ser encontrado, craquear um jogo é muitas vezes muito fácil. Tipicamente, um programa terá o seguinte código:

 if(keyIsValid) unlock() else displayError()

A montagem para isso pareceria:

85 xx test keyIsValid, keyIsValid74 06 jz errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:

Como discutido na seção sobre código de máquina, os bytes à esquerda podem ser os bytes de código de máquina (eu os fiz rapidamente a partir de uma folha de referência, então eles podem ou não estar exatamente corretos. Este programa pode ser modificado alterando alguns bytes, o que pode forçar o código a saltar sempre ou nunca.

Para forçar o código a pular (o que, neste caso, tornará a chave sempre válida), o jz é substituído por um jmp (alterando 74 para eb):

85 xx test keyIsValid, keyIsValideb 06 jmp errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:

Para evitar que o código pule (o que, neste caso, tornará a chave sempre válida), o jz é substituído por um par de instruções nop:

85 xx test keyIsValid, keyIsValid90 nop90 nope8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:

Faça a alteração apropriada, execute o jogo, e digite qualquer código. O resultado esperado deve ocorrer!

O próximo exemplo irá mostrar isso em um jogo real (em um jogo que eu não vou nomear aqui, por razões óbvias).

Escrever um Keygen

É melhor do que rachar um jogo é escrever um keygen para ele. O utilizador insere o seu nome de utilizador ou código de registo, e o keygen emite uma chave válida.

Geralmente, isto requer que o algoritmo seja totalmente modificado e compreendido de forma inversa. Depois é feita uma cópia do mesmo em C (ou qualquer outra linguagem) que produz os mesmos resultados. Note que os três primeiros exemplos neste tutorial fazem exatamente isso: transformar o código assembly de volta em C. Então qualquer um que realmente os tenha seguido deve estar em uma boa posição para escrever um keygen, que virá em um tutorial posterior.

Questões

Fique à vontade para editar esta seção e postar perguntas, eu farei o meu melhor para respondê-las. Mas você pode precisar entrar em contato comigo para me avisar que existe uma pergunta.

Deixe uma resposta

O seu endereço de email não será publicado.