Oficina
KeygenMe #1 (I-2)
Dom 27 Ago 2006 17:46 |
- Detalhes
- Categoria: Pilotando o rato I-2
- Atualização: Terça, 02 Setembro 2008 19:11
- Autor: vovó Vicki
- Acessos: 13227
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:
- (F7) XOR EAX,EAX - Zera o registrador EAX (XOR de um registrador com ele mesmo sempre resulta em zero).
- (F7) XOR EBX,EBX - Zera o registrador EBX.
- (F7) XOR ECX,ECX - Zera o registrador ECX.
- (F7_ MOV EDI,keygenme.0040DCF8 - Coloca em EDI o nome do usuário que no nosso exemplo é "teste").
- (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 ...
- (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
- (F7) SUB EAX,19 - Subtrai 19h (25 decimal) de EAX, ou seja, EAX = 74 - 19 = 5B.
- (F7) SUB EBX,EAX - Subtrai EAX (5B) de EBX, ou seja, EBX = 00 - 5B = FFFFFFA5.
- (F7) INC ECX - Incrementa ECX, ou seja, ECX = 0 + 1 = 1.
- (F7) CMP ECX,EDX - Compara ECX com EDX ou seja, compara 1 com 5.
- (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.