Novamente aqui , dessa vez vou fazer uma analise um pouco mais complicada do que a última que falava sobre keygen, aliás vou fazer um random key , sim um gerador de chaves randômicas para o Perfect Keylogger 1.68.
Como podemos ver nosso registro é composto de 16 caracteres , como sempre vamos debugar , abra ele no OllyDbg e execute , como podemos notar você também não acertou o código logo de cara como eu , vou usar uma técnica chama back to user que consiste em pausar o programa no OllyDbg (F12) e retornar com ALT+F9 com isso vá até a mensagem de erro e aperto OK , vamos ser jogados logo abaixo da MessageBox de erro se olharmos mais acima vemos um PUSH 00448140 que empurra a string "_r <()<1-Z2[l5,^" para STACK e logo abaixo um PUSH EAX empurrando novamente essa string pra EAX e uma CALL , vamos colocar um Breakpoint (F2) nela e reiniciar o programa .
Dessa vez nosso programa parou nessa CALL , vamos entrar nela com F8 , nossa rotina é essa:
Primeiramente antes da imagem temos a medida das duas strings , a medida da string hardcoded que é "_r <()<1-Z2[l5,^" que equivale a 16 e a do nosso nome , no meu caso 7 , temos uma exigências feitas por ele em relação a medida:
1- Se a medida do nome for menor do que a do hardcoded devemos completar com as letras do nome até chegar a medida exata
Gustavo = 7
GustavoGustavoGu = 16
2-Se a medida do nome for maior do que a do hardcoded toda diferença deve ser usada novamente no calculo
Gustavo membro do UBCT = 22
22-16 = 6
Os 6 primeiros caracteres do serial gerado vão novamente entrar na rotina para no novo calculo.
O calculo é o seguinte :
//^ = XOR , % = resto da divisão
( ( (nome[1]^hardcoded[1]) %25) +65)
nome++;
hardcoded++;
Separei por prioridades de calculos , primeiramente o XOR depois o resto da divisão e por fim a soma com 65 , sim o calculo é só esse , eu resolvi fazer um random key para não ter que manipular tanto a string nome e também para ter algo constante como um nome com 16 caracteres e seus respectivos 16 caracteres de serial, alguns programas que usam o serial HD ou outras informações do sistema para o calculo de serial utilizando uma técnica parecida com essa mas diferente de um random key , o serial é único e constante para cada máquina , já o random key gera várias combinações de nome e serial corretos.
Bem como o usuário não vai passar informação para nosso random key , vamos precisar da nossa array de letras e uma array com a hardcoded , ambos com o mesmo número de caracteres , em segundo lugar usar um comando que gere números randomicos inteiros para percorrer nossa array de letras , mas somente essa array porque a array que contém o hardcoded deve seguida em ordem correta.
Também vamos precisar de uma variavel auxiliar para guardar o número randomico , porque ?
Simples , não poderiamos deixar de usar ela já que nosso comando que gera randomico cria números diferentes a cada execução precisariamos de uma variavel para guardar o mesmo valor para exibir como a letra escolhida pelo programa para o nome de usuário
E por fim duas váriaveis para concatenar todas as letras de nome e serial separadamente para mostrar na tela.
Com isso em mente vejam meu source em python:
Bem espero que tenham entendido bem , segue no final meu random key em python e também em C:
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Gustavo .
07/07/09
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Como podemos ver nosso registro é composto de 16 caracteres , como sempre vamos debugar , abra ele no OllyDbg e execute , como podemos notar você também não acertou o código logo de cara como eu , vou usar uma técnica chama back to user que consiste em pausar o programa no OllyDbg (F12) e retornar com ALT+F9 com isso vá até a mensagem de erro e aperto OK , vamos ser jogados logo abaixo da MessageBox de erro se olharmos mais acima vemos um PUSH 00448140 que empurra a string "_r <()<1-Z2[l5,^" para STACK e logo abaixo um PUSH EAX empurrando novamente essa string pra EAX e uma CALL , vamos colocar um Breakpoint (F2) nela e reiniciar o programa .
Dessa vez nosso programa parou nessa CALL , vamos entrar nela com F8 , nossa rotina é essa:
Primeiramente antes da imagem temos a medida das duas strings , a medida da string hardcoded que é "_r <()<1-Z2[l5,^" que equivale a 16 e a do nosso nome , no meu caso 7 , temos uma exigências feitas por ele em relação a medida:
1- Se a medida do nome for menor do que a do hardcoded devemos completar com as letras do nome até chegar a medida exata
Gustavo = 7
GustavoGustavoGu = 16
2-Se a medida do nome for maior do que a do hardcoded toda diferença deve ser usada novamente no calculo
Gustavo membro do UBCT = 22
22-16 = 6
Os 6 primeiros caracteres do serial gerado vão novamente entrar na rotina para no novo calculo.
O calculo é o seguinte :
//^ = XOR , % = resto da divisão
( ( (nome[1]^hardcoded[1]) %25) +65)
nome++;
hardcoded++;
Separei por prioridades de calculos , primeiramente o XOR depois o resto da divisão e por fim a soma com 65 , sim o calculo é só esse , eu resolvi fazer um random key para não ter que manipular tanto a string nome e também para ter algo constante como um nome com 16 caracteres e seus respectivos 16 caracteres de serial, alguns programas que usam o serial HD ou outras informações do sistema para o calculo de serial utilizando uma técnica parecida com essa mas diferente de um random key , o serial é único e constante para cada máquina , já o random key gera várias combinações de nome e serial corretos.
Bem como o usuário não vai passar informação para nosso random key , vamos precisar da nossa array de letras e uma array com a hardcoded , ambos com o mesmo número de caracteres , em segundo lugar usar um comando que gere números randomicos inteiros para percorrer nossa array de letras , mas somente essa array porque a array que contém o hardcoded deve seguida em ordem correta.
Também vamos precisar de uma variavel auxiliar para guardar o número randomico , porque ?
Simples , não poderiamos deixar de usar ela já que nosso comando que gera randomico cria números diferentes a cada execução precisariamos de uma variavel para guardar o mesmo valor para exibir como a letra escolhida pelo programa para o nome de usuário
E por fim duas váriaveis para concatenar todas as letras de nome e serial separadamente para mostrar na tela.
Com isso em mente vejam meu source em python:
Código:
import random # importa o modulo random contador=0 #contador para auxiliar no nosso While hard_coded='_r <()<1-Z2[l5,^' #Hardcoded seq_letra='PAMLINDAGOSTOSAA' #Minha array de letras acumula_nome='' #vai acumular as letras do nome acumula_serial='' #vai acumular as letras do serial while contador<16: #Isso vcs ja sabem repetir até o contador atingir 16 que é o número de caracteres que vai gerar randomico=random.randint(0,15) #Variavel que vai armazenar o comando que gera números randomicos de 0 a 15 , lembrando de que a string começa em 0 copia_randomico=randomico #Armazena a copia do número gerado pela variavel acima acumula_nome=acumula_nome+chr(ord(seq_letra[copia_randomico])) #Acumula as letras escolhidas pelo random acumula_serial=acumula_serial+chr((((ord(seq_letra[randomico])^ord(hard_coded[contador]))%25)+65)) #Acumula o nosso calculo já feito contador=contador+1 #Atribui print "Name : %s" %acumula_nome #Exibe o nome print "Serial: %s" %acumula_serial #Exibe o serial
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Gustavo .
07/07/09
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Comment