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

kiTo KGNmeAGAiN (C-1)

Seg

28

Ago

2006


10:20

(7 votos, média 5.00 de 5) 


Tirando as dúvidas

Tudo muito bem, tudo muito bom, só que ainda ficaram algumas dúvidas que precisam ser esclarecidas. De onde vem aquela stringona em Base64 que é concatenada com o nome do usuário também em Base64? Outra coisa, cadê o MD5 que o PEiD indicou como encriptação? Se você quiser escrever seu próprio keygen, vai precisar dos algoritmos. Se você escolher a linguagem Assembly, pode até reaproveitar o código do kiTo. Se escolher outra linguagem de programação, os textos referentes ao assunto (indicados no início deste artigo) podem ajudar. Então, vamos lá.

A stringona Base64

Vimos que a string em Base64 do nome do usuário foi concatenada com uma outra. A chamada para criar a segunda deve ter ocorrido em algum ponto anterior ao que estávamos. Reinicie o programa com Ctrl+F2 e vá rastreando com F7 logo a partir da primeira instrução:

/$ E8 A6000000    CALL kiToKGNm.004010AB

Esta chamada nos leva ao endereço 004010AB:

004010AB  /$ E8 32090000    CALL <JMP.&kernel32.GetVersion>
004010B0  |. BB 08000000    MOV EBX,8
004010B5  |. F7E3           MUL EBX
004010B7  |. 50             PUSH EAX                       ; /<%X>
004010B8  |. 68 00304000    PUSH kiToKGNm.00403000         ; |Format = "%X"
004010BD  |. 68 A8314000    PUSH kiToKGNm.004031A8         ; |s = kiToKGNm.004031A8
004010C2  |. E8 33090000    CALL <JMP.&user32.wsprintfA>   ; \wsprintfA
004010C7  |. 83C4 0C        ADD ESP,0C
004010CA  |. 68 DA314000    PUSH kiToKGNm.004031DA
004010CF  |. 6A 08          PUSH 8
004010D1  |. 68 A8314000    PUSH kiToKGNm.004031A8
004010D6  |. E8 C5070000    CALL kiToKGNm.004018A0
004010DB  |. 68 A8314000    PUSH kiToKGNm.004031A8         ; /StringToAdd = ""
004010E0  |. 68 0C324000    PUSH kiToKGNm.0040320C         ; |ConcatString = ""
004010E5  |. E8 FE080000    CALL <JMP.&kernel32.lstrcatA>  ; \lstrcatA
004010EA  |. 68 DA314000    PUSH kiToKGNm.004031DA         ; /StringToAdd = ""
004010EF  |. 68 0C324000    PUSH kiToKGNm.0040320C         ; |ConcatString = ""
004010F4  |. E8 EF080000    CALL <JMP.&kernel32.lstrcatA>  ; \lstrcatA
004010F9  |. 68 3E324000    PUSH kiToKGNm.0040323E
004010FE  |. 6A 10          PUSH 10
00401100  |. 68 0C324000    PUSH kiToKGNm.0040320C
00401105  |. E8 96070000    CALL kiToKGNm.004018A0
0040110A  \. C3             RETN

Observe que a primeira instrução desta subrotina chama a função GetVersion. Esta função retorna o valor da versão do Windows no registrador EAX (no meu caso, EAX = 0A280105). Logo em seguida, o valor de EAX é multiplicado por 8 (EAX = 51400828). Logo em seguida este valor é transformado em string através da chamada à função wsprintfA e, juntamente com o valor 8, a string é colocada na pilha antes da chamada ao endereço 004018A0 - onde fica a rotina onde é feita sua conversão para Base64 (meu resultado foi NTE0MDA4Mjg=).

Depois da conversão, a string é concatenada com uma string vazia ("" + "51400828" = "51400828") e o resultado é concatenado com a string Base64 ("51400828" + "NTE0MDA4Mjg=" = "51400828NTE0MDA4Mjg="). Assim preparada, além desta string, é colocado na pilha o valor 10h (16 decimal) e a rotina de codificação Base64 é chamada novamente. Apenas 16 caracteres serão usados na codificação e o resultado obtido é NTEMDA4MjhOVEUwTURBNE==. Taí a stringona que procurávamos e agora sabemos que ela depende da versão do Windows do freguês smile

Informações adicionais