Aquí os dejo un KeygenMe, espero que os guste. Está programado en C++ no sé que nivel de dificultad decir que tiene, para crackearlo será nivel 0, pero el reto es hacer un keygen :).
https://mega.co.nz/#!CBdAyZhS!nhpX7Mji2TzPJSk3JAGlSttlsxQFX-h_kVnSLa1r9Ag
SaluDoS
user: peterpunk
pass: aaalmmppq
user undercode
pass: cddsstttt
No programo el keygen porque algunos users no podrían tener pass (ese es el motivo de que puse un pass para "underode" en lugar de "underc0de" o "UNDERC0DE"
Aunque el keygenme (yo lo llamaría bruteforceme) lo hace bastante lioso, en bucles multiplcando los caracteres del user con los caracteres del pass, al final se puede reducir a:
user y pass deben ser de 9 caracteres
suma de 1, 4 y 7 letras del user multiplicado por la suma de 3 primeras letras del pass
suma de 2, 5 y 8 letras del user multiplicado por la suma de las 3 letras del medio del pass
suma de 3, 6 y 9 letras del user multiplicado por la suma de las últimas 3 letras del pass
y la suma de los tres anteriores valores tiene que ser igual a 0x4CDFB (314875)
Ejemplo:
peterpunk ->
ascii(p) + ascii(e) + ascii(u) = 330
ascii(e) + ascii(r) + ascii(n) = 325
ascii(t) + ascii(p) + ascii(k) = 335
y ahora habría que buscar tres incógnitas tal que
330x + 325y + 335z = 314875
que sólo lograremos resolver por fuerza bruta
y obtendremos valores como estos (existen más posibilidades, éstos son los primeros que encuentro si empiezo a buscar a partir de la "a" minúscula):
x = 291, y = 326, z = 337
(330*291 + 325*326 + 335*337 = 314875)
Por último habría que trasladar esos resultados a caracteres.
Como ya he dicho, cada resultado es la suma de tres caracteres, así que por ejemplo, 326, podría ser "lmm" o "mlm" o "nnj" o lo que nos cuadre.
Por si a alguien le interesa, un pequeño bruteforce en masm32:
include masm32rt.inc
.data
szTitulo db "Bruteforcer",0
szFormato db "User: %s",13,"Pass: %s",0
.data?
szUser db 10 dup (?)
szPass db 10 dup (?)
Buffer db 50 dup (?)
dwUser1 dd ?
dwUser2 dd ?
dwUser3 dd ?
dwPass1 dd ?
dwPass2 dd ?
dwPass3 dd ?
.code
start:
mov esi, offset szUser
mov dwUser1, 291 ;"aaa"
.while dwUser1 <= 366 ;"zzz"
mov dwUser2, 291
.while dwUser2 <= 366
mov dwUser3, 291
.while dwUser3 <= 366
mov dwPass1, 291
.while dwPass1 <= 366
mov dwPass2, 291
.while dwPass2 <= 366
mov dwPass3, 291
.while dwPass3 <= 366
mov eax, dwPass3
imul eax, dwUser3
mov edx, eax
mov eax, dwPass2
imul eax, dwUser2
add edx, eax
mov eax, dwPass1
imul eax, dwUser1
add edx, eax
.if edx == 4cdfbh
mov ecx, 3
xor ebx, ebx
.repeat
lea eax, [offset dwUser1 + ebx*4]
mov eax, [eax]
cdq
div ecx
mov [esi + ebx], al
mov [esi + ebx + 3], al
mov [esi + ebx + 6], al
.if dl == 2
inc byte ptr [esi + ebx + 3]
inc byte ptr [esi + ebx + 6]
.elseif dl == 1
inc byte ptr [esi + ebx + 6]
.endif
inc ebx
.until ebx == 3
mov edi, offset szPass
xor ebx, ebx
.repeat
lea eax, [offset dwPass1 + ebx*4]
mov eax, [eax]
cdq
div ecx
mov [edi], al
mov [edi + 1], al
mov [edi + 2], al
.if dl == 2
inc byte ptr [edi + 1]
inc byte ptr [edi + 2]
.elseif dl == 1
inc byte ptr [edi + 2]
.endif
add edi, 3
inc ebx
.until ebx == 3
invoke wsprintf, addr Buffer, addr szFormato, esi, addr szPass
invoke MessageBox, NULL, addr Buffer, addr szTitulo, MB_OKCANCEL
.if eax == IDCANCEL
jmp @Sair
.endif
.endif
inc dwPass3
.endw
inc dwPass2
.endw
inc dwPass1
.endw
inc dwUser3
.endw
inc dwUser2
.endw
inc dwUser1
.endw
@Sair:
invoke ExitProcess, eax
end start
Saludos.
Lo crackee y reconocí la condición de los 9 caracteres y que se finalizaba comparando el resultado con 0x4CDFB, sin embargo estuve dándole varias vueltas al proceso para captar el algoritmo matematico pero no lo logre, creo que me falta bastante teoría para deducir la matematica a partir del desamblado.
bueno me dio duro este keygenme :'( y yo que me creia que ya iba aprendiendo , creo que aun me falta mucho por aprender , ojala alguien se anime a hacer un tuto de este gran keygenme ;)
es un verdadero bruteforceme, yo con pillar un serial valido quedo conforme, de paso coloco 5 de referencias:
en forma Práctica, asumiría que cualquier nombre minúsculas sin numeros, debería tener solución (bf)
Founded on 32064 attempts
username => apuromafo
password => oqtcqljjg
Founded on 7053 attempts
username => apuromafo
password => noabvezvb
Founded on 21767 attempts
username => apuromafo
password => lqacvdskt
Founded on 19950 attempts
username => apuromafo
password => xwvjfcpag
Founded on 13773 attempts
username => apuromafo
password => shhnslbth
y más
password => fgejzvhml
password => hnmrwddsg
password => crnvsdbbz
password => xweiincph
password => zwtcbnhfj
password => yfpjaeyjl
password => vehdxqiof
password => aicwmfexx
password => kuchxmbfv
password => ecesdsttm
password => daybybsqn
password => yhbhupfjn
password => iftatxqdi
password => pamjlghqy
password => slulfnnbk
password => tkzqxgbcb
password => wdygaxodh
password => mncqkauxe
password => nlidsvbfv
password => iperefxcw
source del keygen por @rextco
user y pass deben ser de 9 caracteres
suma de 1, 4 y 7 letras del user multiplicado por la suma de 3 primeras letras del pass
suma de 2, 5 y 8 letras del user multiplicado por la suma de las 3 letras del medio del pass
suma de 3, 6 y 9 letras del user multiplicado por la suma de las últimas 3 letras del pass
y la suma de los tres anteriores valores tiene que ser igual a 0x4CDFB (314875)
# Python 2.7 x86
# Bruteforce solution by @rextco, credits for analysis to @Bozwkd
from __future__ import print_function
import numpy as np
import string
import sys
# Just print array bytes on string way
def print_string_from_matrix(matrix_):
for byte in np.reshape(matrix_, 9):
print("%c" % byte, end='')
# Constant
SHAPE = (3, 3) # size for matrix
TARGET = 0x4CDFB
# pool = "0123456789" + string.ascii_lowercase
seed = string.ascii_lowercase
# print(string.printable)
# print(seed)
# sys.exit()
# make seed list for numpy.random.choice
# seed_list = []
# for c in seed:
# seed_list.append(ord(c))
# map(function_to_apply, string)
seed_list = list(map(ord, seed))
print("seed_list = %s" % seed_list)
# sys.exit()
username = "apuromafo"
username = list(map(ord, username))
# print(username, len(username))
matrix_username = np.reshape(username, SHAPE)
# print(matrix_username, matrix_username.sum())
# sys.exit()
matrix_password = np.empty(SHAPE)
matrix_product = np.empty(SHAPE)
solutions_number = 0
while solutions_number < 5:
check = 0
attempts = 0 # for debug
while check != TARGET and attempts < (1 << 18):
# vector_username = np.random.choice(seed_list, 9)
# matrix_username = np.reshape(np.random.choice(seed_list, 9), SHAPE)
matrix_password = np.reshape(np.random.choice(seed_list, 9), SHAPE)
matrix_product = np.matmul(matrix_username, matrix_password)
check = matrix_product.sum()
attempts += 1
# print("numpy.matrix.sum = 0x%x" % matrix_product.sum())
# sys.exit()
# print numpy values in hex
# np.set_printoptions(formatter={'int': lambda x: hex(int(x))})
print("\n\nFounded on %d attempts" % attempts, end="")
print("\nusername => ", end="")
print_string_from_matrix(matrix_username)
print("\npassword => ", end="")
print_string_from_matrix(matrix_password)
solutions_number += 1
Link para ejecución del keygen por si lo quieren ver
http://tpcg.io/El2Hka
Saludos Apuromafo