Oficina
kiTo KGNmeAGAiN (C-1)
Seg 28 Ago 2006 10:20 |
- Detalhes
- Categoria: Pilotando o rato C-1
- Atualização: Quarta, 22 Abril 2009 11:09
- Autor: vovó Vicki
- Acessos: 11875
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