A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Oficina

KeygenMe #1 (I-2)

Dom

27

Ago

2006


17:46

(16 votos, média 4.81 de 5) 


Calculando o serial

Até agora só fizemos um pouco de hardcoding introduzindo dois patches para transformar o executável no seu próprio gerador de seriais, mas esta não é a tarefa proposta. Para escrever um key generator autêntico é preciso entender o tipo de cálculo efetuado para criar o serial. Para isto, vamos seguir as instruções dos cálculos passo a passo. Vamos por partes com o código:

...
00401231  |. 33C0           XOR EAX,EAX
00401233  |. 33DB           XOR EBX,EBX
00401235  |. 33C9           XOR ECX,ECX
00401237  |. BF F8DC4000    MOV EDI,keygenme.0040DCF8                ;  ASCII "teste"
0040123C  |. 8B15 86DC4000  MOV EDX,DWORD PTR DS:[40DC86]
...

Siga o passo a passo apertando as teclas indicadas:

  1. (F7) XOR EAX,EAX - Zera o registrador EAX (XOR de um registrador com ele mesmo sempre resulta em zero).
  2. (F7) XOR EBX,EBX - Zera o registrador EBX.
  3. (F7) XOR ECX,ECX - Zera o registrador ECX.
  4. (F7_ MOV EDI,keygenme.0040DCF8 - Coloca em EDI o nome do usuário que no nosso exemplo é "teste").
  5. (F7) MOV EDX,DWORD PTR DS:[40DC86] - Coloca em EDX o valor armazenado na posição de memória 0040DC86. Só para dar uma treinadinha, role o conteúdo da memória mostrada no painel inferior esquerdo do OllyDbg até encontrar este endereço. Você deve ver logo depois de Name must be... o seguinte:
    0040DC60  00 4E 46 4F 00 4E 61 6D  .NFO.Nam
    0040DC68  65 20 6D 75 73 74 20 62  e must b
    0040DC70  65 20 34 20 2D 20 35 30  e 4 - 50
    0040DC78  20 63 68 61 72 73 20 6C   chars l
    0040DC80  6F 6E 67 21 00 0D 05 00  ong!            ; <- aqui!!!
      

Depois de preparar os registradores (o ECX costuma ser usado como contador e o EDX como referência), encontramos o seguinte loop de instruções:

...
00401242  |> 0FB60439       /MOVZX EAX,BYTE PTR DS:[ECX+EDI]
00401246  |. 83E8 19        |SUB EAX,19
00401249  |. 2BD8           |SUB EBX,EAX
0040124B  |. 41             |INC ECX
0040124C  |. 3BCA           |CMP ECX,EDX
0040124E  |.^75 F2          \JNZ SHORT keygenme.00401242
...
  1. (F7) MOVZX EAX,BYTE PTR DS:[ECX+EDI] - Coloca o valor ASCII hexadecimal do primeiro caracter do nome em EAX. O caracter ASCII de "t" = 74
  2. (F7) SUB EAX,19 - Subtrai 19h (25 decimal) de EAX, ou seja, EAX = 74 - 19 = 5B.
  3. (F7) SUB EBX,EAX - Subtrai EAX (5B) de EBX, ou seja, EBX = 00 - 5B = FFFFFFA5.
  4. (F7) INC ECX - Incrementa ECX, ou seja, ECX = 0 + 1 = 1.
  5. (F7) CMP ECX,EDX - Compara ECX com EDX ou seja, compara 1 com 5.
  6. (F7) JNZ SHORT keygenme.00401242 - Se ECX e EDX não tiverem valores iguais, salte para o início do loop.

É claro que este loop será repetido até que todos os caracteres do nome do usuário tiverem sido utilizados para o cálculo. Acompanhe o que acontece:

    EAX     EAX - 19     EBX - EAX     ECX
|====+===|============|=============|=======|
| 74 (t) |    5B      |  FFFFFFA5   |   1   |
| 65 (e) |    4C      |  FFFFFF59   |   2   |
| 73 (s) |    5A      |  FFFFFEFF   |   3   |
| 74 (t) |    5B      |  FFFFFEA4   |   4   |
| 65 (e) |    4C      |  FFFFFE58   |   5   |
|========|============|=============|=======|

Quando ECX = 5, o loop termina.

Informações adicionais