Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: fary en 8 Enero 2019, 21:05 pm



Título: KeyGenME fary - v1.0
Publicado por: fary en 8 Enero 2019, 21:05 pm
Aquí os dejo esto que acabo de crear  :P

Código:
https://turbobit.net/6aa4wraynw7x.html

El hosting tiene una poquita publicidad, pero es el único que he encontrado que me deja subir archivos sin registrarme.

Reglas del reto, crear un KeyGen :o

saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 8 Enero 2019, 22:25 pm
Lo he revisado y es bastante sencillo.

Especial para quienes comienzan y desean afianzar el conocimiento de instrucciones ASM (es 1 sola la que interesa aquí).

Como siempre, recuerden realizar los retos siempre en VMs!!

Saludos!

PD: @fary Gracias por el aporte!

EDIT:

Con el tamaño del ejecutable, lo podrías haber colocado en base64 en vez de subirlo a ese host...  :xD


Título: Re: KeyGenME fary - v1.0
Publicado por: karmany en 8 Enero 2019, 22:43 pm
Hola!!

Yo también lo he revisado y te felicito por tu trabajo. Es muy buen aporte para aprender y lo ¡has escrito directamente en ASM!
Good work! @Fary

PD. Por supuesto lo he guardado por si en un futuro desapareciera...
Cierto, el host es una M. Si consigo sacar tiempo intentaré subir aunque sea a Mega los crackmes que tengo de elhacker


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 8 Enero 2019, 22:50 pm
Gracias por vuestros comentarios  :)

No se me habia ocurrido McSys Argentina... ventajas de programar en ASM  ::)

Ahí va...

Código:
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

Y la web para reconvertirlo a archivo....
https://emn178.github.io/online-tools/base64_decode_file.html

obviamente hay que renombrarlo a .exe jeje


un saludo!!


Título: Re: KeyGenME fary - v1.0
Publicado por: FlyNDSkyGMFnD en 9 Enero 2019, 05:56 am
Gracias por compartir este reto Fary, pero también quería añadir un avance que tuve al momento de estar crackeando tu keygenme. Y resulta que encontré el call (Rutina) dónde se encuentra el algoritmo que genera los seriales válidos y genuinos, pero no pude crackear ese algoritmo.

VA: 0040111F (Windows 7 Only)

Adjunto tu keygenme parcheado para poder registrarse con cualquier serial:

http://tutorialeslinuxywindows.tk/FaryKeyGenME!_parcheado_aceptacualquierserialFlyNDSkyGMFnDElhackerNET.rar

Que Dios te bendiga, protega y acompañe.

 ;-)



Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 9 Enero 2019, 06:40 am
fary

  {Gracias por el desafío, por el tiempo dedicado a ello, por compartir
   En primer lugar, usted no tiene algo que hacer "Keygen", el valor es fijo.
   Correcto desafío =   Escribir la función inversa del serial
   Para keygen verdadero cada equipo genera diferente clave
   Me gustó mucho, voy a desarrollar la solución.}


FlyNDSkyGMFnD

    { No hacer parche ! }

MCKSys Argentina

    { buena idea de base64}

Saludos


   


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 9 Enero 2019, 07:31 am
Todos los seriales son validos para todos los equipos  :rolleyes:



PD: Alguien consiguió una contraseña válida?


saludos!!!


Título: Re: KeyGenME fary - v1.0
Publicado por: julio2002 en 9 Enero 2019, 19:42 pm
Me apunto el desafió. Estoy siguiendo los tutoriales de Ricardo Narvaja y cuando los termine lo intentare :D


Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 9 Enero 2019, 19:59 pm
PD: Alguien consiguió una contraseña válida?

El serial más corto que cumple con la condición es RzLX3  :P

Por supuesto, un keygen debería enumerar muchos más...  ;D

Saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 9 Enero 2019, 20:10 pm
El serial más corto que cumple con la condición es RzLX3  :P

Por supuesto, un keygen debería enumerar muchos más...  ;D

Saludos!

Que bueno!!! :P bruteforce, ¿No?,  yo probé  con 4 caracteres y no me saco ni una válida jajajaja :(


Por ahora les va dando caña el señor Argentina, ¿Quién mas tiene su serial válido?  :laugh: :laugh: :laugh:


Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 9 Enero 2019, 20:18 pm
Que bueno!!! :P bruteforce, ¿No?,  yo probé  con 4 caracteres y no me saco ni una válida jajajaja :(

Si. Al ser una validación "acumulativa", es complejo conseguir un serial en base a la constante...

Pero no digo más, que la idea es que participe más gente.  ;)

Saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: EdePC en 10 Enero 2019, 00:17 am
Saludos,

- Yo me hago líos con el "criptoanálisis" :xD, ya sé cual es el algoritmo que se usa, pero "darle vuelta" >:D es otra cosa. Supongo que también me inclinaré por Brute-Force, jeje no se si llamarle KeyGen a algo que se limita a mostrar unos cuantos Seriales HardCode al azar :xD.

- Voy a desempolvar mi viejo Disco Duro BackUp de hace años para extraer los Tutoriales de Assemble de RVLCN, muy buenos por cierto: PDF, Videos, Ficheros Fuente, etc. Tengo que armar desde cero el RadASM para empezar a hacer el Brute-Force en Assemble, así repaso este lenguaje.

------------------------------------------
- Por cierto, me he fijado de que la Web de Ricardo Narvaja no está el curso de RVLCN completo, solo están del 1 al 6, y tengo entendido de que el curso va del 1 al 8

- Para aprender Assemble en mi caso me ha ido bien con el curso de RVLCN y el de Programación de Virus de zeroPad, buenas bases para entender Assemble y hacer Keygen, Patch. Loader, etc.

-----------------------------
RVLCN Curso de ASM desde Cero + Tools: http://www.ricardonarvaja.info/WEB/OTROS/DE%20LA%20LISTA%20MASM32-RADSM/

Programación de Virus por zeroPad: http://www.ricardonarvaja.info/WEB/OTROS/PROGRAMACION%20DE%20VIRUS/

Referencia práctica de instrucciones Assemble por Caos Reptante (muy bueno): http://www.ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/000-100/001-ASSEMBLER%20por%20CAOS%20REPTANTE.zip

CheatSheet de instrucciones Assemble: http://www.jegerlehner.ch/intel/IntelCodeTable_es.pdf


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 10 Enero 2019, 06:49 am
Hola EdePe, en teoría no se podría hacer keygen, obviamente  :xD. Pero puse eso porque quería que el objetivo fuese que el atacante encontrara un serial válido ya que parchearlo es una chorrada... si esta hecho en FASM XD tiene 50 líneas de código por no decirte 30  :laugh:.

De todas formas, ánimo y intenta obtener el serial para registrar tu programa  ;-)

saludos.


Título: Re: KeyGenME fary - v1.0
Publicado por: karmany en 10 Enero 2019, 13:39 pm
bruteforce, ¿No?,  yo probé  con 4 caracteres y no me saco ni una válida jajajaja :(


Yo probé ayer un código rápido por fuerza bruta y con 5 caracteres (estuvo un buen rato) tampoco encontró nada válido. No sé si se podrá estudiar bien la rutina e intentar acotar para encontrar seriales válidos. Para los que empiezan es muy entretenido e interesante...


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 10 Enero 2019, 18:33 pm
¡Hola

La ingeniería inversa sobre la solución de MCKSys Argentina .

---------------------------------------------------------------------------------
RzLX3

0xF6C53333
-33          >33
F6C53300   rol 0x0D = A6601ED8
-58          >58
A6601E80   rol 0x0D = 03D014CC  
-4C          >4C
03D01480   rol 0x0D = 0290007A
-7A          >7A
02900000   rol 0x0D = 00000052 > 52

---------------------------------------------------------------------------------
ror > rol   + > -

Saludos


Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 10 Enero 2019, 19:56 pm
Yo probé ayer un código rápido por fuerza bruta y con 5 caracteres (estuvo un buen rato) tampoco encontró nada válido. No sé si se podrá estudiar bien la rutina e intentar acotar para encontrar seriales válidos. Para los que empiezan es muy entretenido e interesante...

Probando los chars desde 20h a 7Eh, sólo 2 soluciones de 5 chars. Si nadie postea más nada, en unos días posteo el source de mi bruteforce en ASM para 5 chars (hacerlo para n chars es sólo agregar más código.)

Saludos!

EDIT: El brute es para 5 chars..


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 10 Enero 2019, 22:50 pm
¿Ola, fuerza bruta?

No necesita fuerza bruta :)

más un ejemplo, la lógica va a aparecer.

@ RyLx#

# 23 F6C53310
rol  A6621ED8
x 78 A6621E60
rol  43CC14CC
L 4C 43CC1480
rol  82900879
y 79 82900800
rol  01001052
R 52 01001000
rol  02000020
  20 02000000
rol  00000040 =@

Saludos



Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 10 Enero 2019, 23:25 pm
¿Ola, fuerza bruta?

No necesita fuerza bruta :)

más un ejemplo, la lógica va a aparecer.

@ RyLx#

# 23 F6C53310
rol  A6621ED8
x 78 A6621E60
rol  43CC14CC
L 4C 43CC1480
rol  82900879
y 79 82900800
rol  01001052
R 52 01001000
rol  02000020
  20 02000000
rol  00000040 =@

Saludos

Muy bueno! Haz un keygen (sin que use fuerza bruta) y postéalo!

Saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 10 Enero 2019, 23:28 pm
Geovane  ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)  Buenísimo!!!!!!! para nada me lo esperaba  :rolleyes:


Título: Re: KeyGenME fary - v1.0
Publicado por: EdePC en 11 Enero 2019, 00:11 am
- O_o? No entiendo que pasa, jeje, mi programita en Masm32 se supone que debe de mostrar un serial válido aplicando fuerza bruta, pero me manda respuestas incorrectas :xD

- Incluso usando OllyDbg y depurando el programita me arroja un "serial válido", los registros concuerdan (edi), el Dump muestra el serial, pero si lo pruebo o incluso vuelvo a repasar con el mismo serial generado (new origin here) no funciona  :xD

- Lo he subido a PasteBin: https://pastebin.com/E38JfmPk he puesto como semilla: FSMMIvH, luego al ejecutar el programita me dice que FUWFoRL es un serial válido, pero no lo es XD. Será que hay algo mal en mi PC, o un bug o error mio?


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 11 Enero 2019, 01:02 am
¡Hola
más una oportunidad, para más personas comprender la lógica


F6C53333      11110110110001010011001100110011
                                                                          110011 33---3
                      11110110110001010011001100000000
                      10100110011000000001111011011000 58---X
                                                                
                      10100110011000000001111010000000
                      00000011110100000001010011001100 4C---L
                                                                  
                      00000011110100000001010010000000
                      00000010100100000000000001111010 7A---z
                                                      
                      00000010100100000000000000000000
                                                            0000001010010 52---R  

RzLX3

consome bits <= 8
girar 13 bits a la izquierda
de nuevo consumir
gire, consuma hasta 1 byte sobrando

Si nadie lo hace, voy a publicar en unos días

Gracias y Saludos


Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 11 Enero 2019, 01:43 am
Bueno, ya que hay un bruteforcer publicado, dejo el mío, también en MASM:

Código
  1. ; Esto lo meti en una DLL, ya que usando WinASM me resulta mas fácil hacer una DLL, cargarla con Olly y campiar EIP a la funcion que hice.
  2. ; El bruteforcing es mas lento por Olly, pero puedo poner BP's rapido.
  3. .386
  4.  
  5. .MODEL flat,stdcall
  6.  
  7. OPTION CASEMAP:NONE
  8.  
  9. Include windows.inc
  10. Include user32.inc
  11. Include kernel32.inc
  12. include masm32.inc
  13.  
  14.  
  15. IncludeLib user32.lib
  16. IncludeLib kernel32.lib
  17. includelib masm32.lib
  18.  
  19.  
  20. .DATA
  21. Serial db 01Fh              ; Buffer donde vamos a generar el string a probar
  22. pad     db 10h dup(00h)     ; Espacio que sigue al buffer (16 bytes) que nos permite ir creando un string mas largo cada vez, sin tener que allocar nada
  23. sep     db 00Dh, 00Ah, 000h ; Usado para ir separando los seriales encontrados
  24. seriales db 400h dup(00h)   ; Buffer donde guardaremos los seriales hallados.
  25.  
  26. TestHello proc uses esi edi
  27. ; Prueba hasta 5 chars (desde 20h hasta 7Eh)
  28. seguir:
  29.    mov eax, offset Serial
  30.    add byte ptr [eax], 1
  31.    cmp byte ptr [eax], 7Eh
  32.    jbe calc
  33.  
  34.    mov byte ptr [eax], 20h
  35.    .if byte ptr [eax+1] == 0           ; Sintaxis MASM para no tener que hacer los cmp a mano.
  36.       mov byte ptr [eax+1], 1Fh
  37.    .endif    
  38.    add byte ptr [eax+1], 1
  39.    cmp byte ptr [eax+1], 7Eh
  40.    jbe calc
  41.  
  42.    mov byte ptr [eax+1], 20h
  43.    .if byte ptr [eax+2] == 0
  44.       mov byte ptr [eax+2], 1Fh
  45.    .endif    
  46.    add byte ptr [eax+2], 1
  47.    cmp byte ptr [eax+2], 7Eh
  48.    jbe calc
  49.  
  50.    mov byte ptr [eax+2], 20h
  51.    .if byte ptr [eax+3] == 0
  52.       mov byte ptr [eax+3], 1Fh
  53.    .endif    
  54.    add byte ptr [eax+3], 1
  55.    cmp byte ptr [eax+3], 7Eh
  56.    jbe calc
  57.  
  58.    mov byte ptr [eax+3], 20h
  59.    .if byte ptr [eax+4] == 0
  60.       mov byte ptr [eax+4], 1Fh
  61.    .endif    
  62.    add byte ptr [eax+4], 1
  63.    cmp byte ptr [eax+4], 7Eh
  64.    jbe calc
  65.  
  66.    jmp salida
  67.  
  68. calc:
  69.    xor edi,edi
  70.    xor eax, eax
  71.    mov esi, offset Serial
  72. bucle:
  73.    lodsb
  74.    test al,al
  75.    jz compara
  76.    ror edi,0Dh
  77.    add edi, eax
  78.    jmp bucle
  79. compara:
  80.    cmp edi, 0F6C53333h
  81.    jnz seguir
  82.    invoke szCatStr, offset seriales, offset sep        ; MASM macro szCatStr. Une 2 szStrings y guarda el resultado en la 1era.
  83.    invoke szCatStr, offset seriales, offset Serial
  84.    jmp seguir
  85.  
  86. salida:
  87.    ret    
  88. TestHello endp
  89.  

Saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 11 Enero 2019, 01:56 am
Gracias MCKSys Argentina

Muy elegante su código

Recordando, mi solución no es fuerza bruta.
Precaución sólo para utilizar caracteres imprimibles
Ya que se escribirá serial.

Muchas gracias fary, me encantó este desafío

saludos


Título: Re: KeyGenME fary - v1.0
Publicado por: EdePC en 11 Enero 2019, 03:49 am
- Anda es cierto, solo hay que hacer la inversa, como no hay pérdida de bits se puede reversear, siendo bruto y eliminando (restando) siempre el último byte para después hacerle un ROL 13, esto hasta obtener 00000000, un serial válido es: PxÌØ3

- Como dice Geovane, se puede sacar <= 8 para obtener un Ascii normal, pero el ya lo puso  :xD

Código
  1. .386
  2. .model flat, stdcall
  3. option casemap: none
  4.  
  5. include windows.inc
  6. include kernel32.inc
  7. includelib kernel32.lib
  8.  
  9. .data?
  10. password db 5 dup(?)
  11.  
  12. .code
  13. keymaker:
  14.  
  15. mov   eax, 0F6C53333h    ; Constante a reversear
  16. lea   edi, password + 4  
  17.  
  18. inicio:
  19. mov   [edi], al  ; Guardando el serial
  20. dec   edi        ;   generado
  21.  
  22. movzx ebx, al
  23. sub   eax, ebx
  24. rol   eax, 0Dh
  25. cmp   eax, 0
  26. jne   inicio
  27.  
  28. invoke ExitProcess, 0
  29.  
  30. end keymaker


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 11 Enero 2019, 14:10 pm
EdePC
Esto va bien, pero necesita trabajar en bits, en el byte.

1-  sustrae 8 bits de la derecha.
     si el valor es mayor que 1F, sustrae 7 bits

2-  ahora gire 13 bits a la izquierda

3-  Repita 1e 2, hasta 1 byte.

Saludos


Título: Re: KeyGenME fary - v1.0
Publicado por: Yuki en 11 Enero 2019, 20:10 pm
Muy interesante el desafío, es una lástima que no haya podido crear un Keygen, la gracia de este ejemplo es que solo aplica un ror y un add en busca de bits específicos.

Espero con ansias la solución de Geovane.

Para no dejar únicamente un comentario dejo acá el algoritmo que utiliza el programa en VB6.

Código
  1. Private Declare Function fROR Lib "FBin.dll" (ByVal Num As Long, ByVal pos As Long) As Long
  2. Function EncriptAlgorithm(s As String, Optional ByVal target As Long = &HF6C53333) As Boolean
  3.    Dim barr() As Byte
  4.    Dim edi As Long
  5.    Dim i As Long
  6.    barr = StrConv(s, vbFromUnicode)
  7.    For i = 0 To UBound(barr)
  8.        edi = fROR(edi, &HD)
  9.        edi = edi + barr(i)
  10.    Next
  11.    EncriptAlgorithm = (edi = target)
  12. End Function

FBin.dll

Código:
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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

¡Saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 11 Enero 2019, 20:17 pm
¡Hola

el keygen esta listo

1-  sustrae 8 bits de la derecha.
     si el valor es mayor que 1F, sustrae 7 bits

2-  ahora gire 13 bits a la izquierda

3-  Repita 1e 2, hasta 1 byte.


es suficiente escribir, cualquier lenguaje.
si nadie es capaz, voy a publicar en días.
espero que más gente participe antes

Una sugerencia, mire a bits, no bytes.

F6C53333      11110110110001010011001100110011
                                                                          110011 33---3
                      11110110110001010011001100000000
                      10100110011000000001111011011000 58---X
                                                               
                      10100110011000000001111010000000
                      00000011110100000001010011001100 4C---L
                                                                 
                      00000011110100000001010010000000
                      00000010100100000000000001111010 7A---z
                                                     
                      00000010100100000000000000000000
                                                            0000001010010 52---R 

RzLX3

saludos


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 11 Enero 2019, 23:10 pm
Ya que esta esto resuelto, diré que la contraseña maestra es: f4RyKeY    :laugh:


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 12 Enero 2019, 18:40 pm
Fue un gran desafío

Hasta se ha considerado no posible hacer Keygen !
Como una función hash, sólo ida, no vuelve.

Pero, todo resume en mira a bits, no el byte !!!!

observación.

ya que hizo en asm, podía escribir isDebuggerPresent() en asm, no api.
mov     eax, large fs:30h
movzx   eax, byte ptr [eax+2]
retn


Fue el mejor reto que he participado.
Parece simple, pero complejo!
MCKSys Argentina me motivó a continuar, después de publicar un serial válido.
Voy a hacer la solución del keygen.

Gracias, Saludos.




Título: Re: KeyGenME fary - v1.0
Publicado por: EdePC en 12 Enero 2019, 23:49 pm
- Me parece que la clave está en eliminar los últimos 8 bits para que queden en cero, luego hacer el ROL 13 y repetir hasta que todo quede en 00000000, luego todos los bits eliminados será los bytes del password, Esto es lo más rápido, pero se podría obtener bytes no normales, por ejemplo el password válido más corto es: PxÌØ3

- Sin embargo, para obtener un password Ascii común, habría que ir eliminando (restando) de siete en siete bits:

Código
  1. .386
  2. .model flat, stdcall
  3. option casemap: none
  4.  
  5. include windows.inc
  6. include kernel32.inc
  7. includelib kernel32.lib
  8.  
  9. .data?
  10. password db 5 dup(?)
  11.  
  12. .code
  13. keymaker:
  14.  
  15. mov   eax, 0F6C53333h    ; Constante a reversear
  16. lea   edi, password + 4  
  17.  
  18. inicio:
  19. movzx ebx, al
  20. shl   bl, 1      ; Descarta el primer bit
  21. shr   bl, 1      ;   para trabajar en ASCII de 7 bits
  22.  
  23. mov   [edi], bl  ; Guardando el serial
  24. dec   edi        ;   generado
  25.  
  26. sub   eax, ebx
  27. rol   eax, 0Dh
  28. cmp   eax, 0
  29. jne   inicio
  30.  
  31. invoke ExitProcess, 0
  32.  
  33. end keymaker

-- Devuelve: RzLX3 que es el Ascii normal más corto, y PxÌØ3 es todavía más corto (menor) pero no es Ascii normal.

- Con respecto al Keygen, y teniendo en cuenta que al final lo que hay que hacer convertir la constante 0F6C53333 a 00000000 utilizando el algoritmo inverso: restar los últimos 8 o siete bits y luego hacer el ROL 13, repetir hasta obtener 00000000 y guardar los bits restados que serán los bytes del password (ordenados al revés). Supongo que se puede restar menos bits, ya no ocho o siete, sino seis o menos, esto haría un password con más bytes debido a que serán más vueltas al algoritmo.

-- Lo que me gustaría es que el KeyGen pida una semilla (Nombre de usuario o algo así), luego aplicar el algoritmo no-inverso (el original) a la semilla para ver que valor devuelve (valor de EDI), luego aplicar el algoritmo inverso hasta obtener 00000000 sobre la semilla trabajada (valor de EDI que había quedado), de esta manera obtener seriales válidos como: EdePC - XXXXXX


Título: Re: KeyGenME fary - v1.0
Publicado por: karmany en 13 Enero 2019, 00:16 am
La verdad que esta clase de retos te distrae de la tareas cotidianas, así que he decidido distraerme un poco y hacer un keygen (generador de claves) para todos los seriales SOLO de 6 caracteres. Este keygen no lo he querido programar (sería muy sencillo) y lo voy a hacer escrito para que todo el mundo sin conocimientos de programación pueda usarlo.

Solo he utilizado caracteres imprimibles desde el valor 20hex hasta el 7Fhex, los demás los he obviado.
¿Cómo lo he resuelto? Pues hice directamente en OllyDBG fuerza bruta, me fui a cenar y después de cenar estudié los resultados que el script me dejó en memoria, así que es un keygen post-estudio.

Empecemos.
1º CARÁCTER
El que el usuario quiera. Voy a poner, por ejemplo, la letra v que equivale a 76hex. Los guiones siguientes, aunque puedan valer, en este caso no sirven y los pongo únicamente para mostrar los caracteres pendientes.
v-----

Antes de continuar con los siguientes caracteres, es necesario saber que según el valor hex de este primer caracter, existen 3 zonas.
PRIMERA ZONA. ZONA 4A. Del valor 68h al 7Fh (a.i.)
SEGUNDA ZONA. ZONA 4B. Del valor 1Fh al 7Fh (a.i.)
TERCERA ZONA. ZONA 4C. Del valor 1Fh al 27h (a.i.)

Para que sea sencillo de entender, pongo el ejemplo de la letra v=76h. El valor 76h puede estar:
-En la zona 4A (Del 68h al 7Fh) y
-En la zona 4B (Del 1Fh al 7Fh) pero no puede estar en la zona 4C.

2º y 5º CARACTERES
Estos caracteres son siempre fijos y corresponden a las letras R y X. Por lo tanto, ya tenemos:
vR--X-

3º CARÁCTER
Solo puede ser o los dos puntos : o la letra zeta minúscula (z).
Solo hay una condición:
Si el primer carácter es par, el 3º carácter es la letra zeta minúscula (z), si no : .
Por lo tanto, el primer carácter es la v que equivale a 76hex y es par, así que el 3º carácter es una z. Ya tenemos:
vRz-X-

4º CARÁCTER
El 4º carácter corresponde con la Zona. Así que podemos tener 2 casos para ZONA 4A (J) y ZONA 4B (K).
vRzJX-
vRzKX-

6º Y ÚLTIMO CARÁCTER
Realizamos las operaciones de cifrado del serial hasta el último carácter, así:
PRIMER SERIAL: vRzJX-
v = 76h
R = 52h
z = 7Ah
J = 4Ah
X = 58h

Código
  1. EDI = 0    ; EDI = 00000000h
  2. ADD EDI, 76; EDI = 00000076h
  3. ROR EDI, D ; EDI = 03B00000h
  4. ADD EDI, 52; EDI = 03B00052h
  5. ROR EDI, D ; EDI = 02901D80h
  6. ADD EDI, 7A; EDI = 02901DFAh
  7. ROR EDI, D ; EDI = EFD01480h
  8. ADD EDI, 4A; EDI = EFD014CAh
  9. ROR EDI, D ; EDI = A6577E80h
  10. ADD EDI, 58; EDI = A6577ED8h
  11. ROR EDI, D ; EDI = F6C532BBh

Y ahora tan sencillo como restar la semilla F6C53333 con ese valor:
F6C53333 - F6C532BB = 78hex
6º carácter = 78h (x), por lo tanto, primera contraseña válida:
vRzJXx

SEGUNDO SERIAL: vRzKX-
v = 76h
R = 52h
z = 7Ah
K = 4Bh
X = 58h

Código
  1. EDI = 0    ; EDI = 00000000h
  2. ADD EDI, 76; EDI = 00000076h
  3. ROR EDI, D ; EDI = 03B00000h
  4. ADD EDI, 52; EDI = 03B00052h
  5. ROR EDI, D ; EDI = 02901D80h
  6. ADD EDI, 7A; EDI = 02901DFAh
  7. ROR EDI, D ; EDI = EFD01480h
  8. ADD EDI, 4A; EDI = EFD014CBh
  9. ROR EDI, D ; EDI = A65F7E80h
  10. ADD EDI, 58; EDI = A65F7ED8h
  11. ROR EDI, D ; EDI = F6C532FBh

F6C53333 - F6C532FB = 38hex = 8
Segundo serial válido: vRzKX8

Otro ejemplo rápido sin tanta explicación:
3-----
solo está en ZONA 4B: 3--K--
2 caracteres fijos: 3R-KX-
impar: 3R:KX-

F6C53333 - F6C532D9 = 5Ah = Z
Serial válido: 3R:KXZ


Título: Re: KeyGenME fary - v1.0
Publicado por: fary en 13 Enero 2019, 00:30 am


ya que hizo en asm, podía escribir isDebuggerPresent() en asm, no api.
mov     eax, large fs:30h
movzx   eax, byte ptr [eax+2]
retn


Si te fijas, compruebo si estoy siendo debugeado dos veces... una llamando a la propia API y otra vez lo compruebo mientras estoy creando los objetos de la ventana :) aunque creo que nadie se tomo cuenta de eso...

Aquí os el código fuente!

Código
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'win32w.inc'
  5.  
  6. section '.text' code readable executable
  7. start:
  8.    invoke  GetModuleHandle,0
  9.    mov     [wc.hInstance],eax
  10.    invoke  LoadIcon,0,IDI_APPLICATION
  11.    mov     [wc.hIcon],eax
  12.    invoke  LoadCursor,0,IDC_ARROW
  13.    mov     [wc.hCursor],eax
  14.    invoke  RegisterClass,wc
  15.    test    eax,eax
  16.    jz      error
  17.  
  18.    invoke IsDebuggerPresent,0    ; ACTIVAR despues de depurar
  19.    cmp eax,0
  20.    jne end_loop
  21.  
  22.    invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,100,NULL,NULL,[wc.hInstance],NULL
  23.    test    eax,eax
  24.    jz      error
  25.  
  26.    msg_loop:
  27.        invoke  GetMessage,msg,NULL,0,0
  28.        cmp     eax,1
  29.        jb      end_loop
  30.        jne     msg_loop
  31.        invoke  TranslateMessage,msg
  32.        invoke  DispatchMessage,msg
  33.        jmp     msg_loop
  34.  
  35.  error:
  36.        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
  37.  
  38.  end_loop:
  39.        invoke  ExitProcess,[msg.wParam]
  40.  
  41. proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
  42.        cmp     [wmsg],WM_DESTROY
  43.        je      .wmdestroy
  44.        cmp     [wmsg],WM_CREATE
  45.        je      .wmcreate
  46.        cmp     [wmsg],WM_COMMAND
  47.        je      .wmcommand
  48.  
  49.        jmp .defwndproc
  50.  
  51.  .wmcommand:
  52.        xor eax, eax
  53.        xor edx, edx
  54.  
  55.        mov eax, [_buttonregistry]
  56.        mov edx, [lparam]
  57.  
  58.        cmp eax,edx
  59.        jne .finish
  60.  
  61.        invoke GetWindowTextA,[_editregistry],password,10
  62.  
  63.        stdcall checkpass,password ; Comprobamos la contraseña.
  64.  
  65.        jmp .finish
  66.  .defwndproc:
  67.        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
  68.        jmp     .finish
  69.  .wmcreate:
  70.        invoke CreateWindowExA,WS_EX_APPWINDOW,_labelclass,_labeltext,WS_CHILD+WS_VISIBLE,10,10,150,20,[hwnd],NULL,[wc.hInstance],NULL
  71.        mov edx,dword[fs:0x18]
  72.        push edx
  73.        invoke CreateWindowExA,WS_EX_APPWINDOW,_editclass,0,WS_CHILD+WS_VISIBLE+WS_BORDER,115,10,125,20,[hwnd],NULL,[wc.hInstance],NULL
  74.        mov [_editregistry],eax
  75.        pop edx
  76.        mov edx,dword[edx+0x30]
  77.        push edx
  78.        invoke CreateWindowExA,WS_EX_APPWINDOW,_buttonclass,_buttonname,WS_CHILD+WS_VISIBLE,10,40,230,20,[hwnd],NULL,[wc.hInstance],NULL
  79.        mov [_buttonregistry],eax
  80.        pop edx
  81.        movsx edx,byte[edx+2]
  82.        mov [dbg],edx    ; Si esta debugger presente
  83.  
  84.        jmp .finish
  85.  .wmdestroy:
  86.        invoke  PostQuitMessage,0
  87.        xor     eax,eax
  88.  .finish:
  89.        ret
  90. endp
  91.  
  92. proc checkpass,pass
  93.    mov esi, [pass]
  94.  
  95.    compute_hash:
  96.        xor     edi, edi     ;EDI = 0
  97.        xor     eax, eax   ;EAX = 0
  98.        cld
  99.    compute_hash_again:
  100.        lodsb                ;AL = BYTE[ESI] , ESI = ESI + 1
  101.        test    al, al
  102.       jz       compute_hash_finished
  103.        ror     edi, 0xD
  104.        add     edi, eax
  105.       jmp      compute_hash_again
  106.    compute_hash_finished:
  107.  
  108.    ;EDI = El Hash de la cadena
  109.    cmp edi,0xF6C53333
  110.    jne salircheck
  111.    mov eax, [dbg]
  112.    cmp eax,1
  113.    je salircheck
  114.  
  115.    invoke MessageBoxA,0,_goodpass,_goodtitle,MB_OK+MB_ICONINFORMATION
  116.  
  117.    salircheck:
  118.    ret
  119. endp
  120.  
  121. section '.data' data readable writeable
  122.  
  123.  _class        TCHAR 'KeyGenMe Fary',0
  124.  _title        TCHAR 'Fary KeyGenME - 1.0',0
  125.  _error        TCHAR 'Startup failed.',0
  126.  _goodpass     db    'Enhorabuena, superaste el reto!ahora el keygen ;)',0
  127.  _goodtitle    db    'Good Boy',0
  128.  
  129.  _buttonregistry       dd ?
  130.  _buttonclass          db 'BUTTON',0
  131.  _buttonname           db 'Registrar',0
  132.  
  133.  _editregistry         dd ?
  134.  _editclass            db 'EDIT',0
  135.  
  136.  _labelclass           db 'STATIC',0
  137.  _labeltext            db 'Fary Password: ',0
  138.  
  139.   password             rb 11
  140.   dbg                  dd 0
  141.  
  142.  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
  143.  
  144.  msg MSG
  145.  
  146. section '.idata' import data readable writeable
  147.  
  148.  library kernel32,'KERNEL32.DLL',\
  149.          user32,'USER32.DLL'
  150.  
  151.  include 'api\kernel32.inc'
  152.  include 'api\user32.inc'
  153.  

También quiero aclarar que el código que crear los hashes no es mio! pero me parecio interesante  >:D >:D >:D

https://foro.elhacker.net/programacion_visual_basic/asmvb6invoke_llamas_apis_sin_declararlas_kinvokebas-t290072.0.html

Aunque claro, veté tu a saber quién sea el autor porque por aquí también aparece el mismo hash  :xD

https://github.com/debasishm89/x86-Assembly/blob/master/speaking%20shell%20code.asm

Entre otras páginas...


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 13 Enero 2019, 00:52 am
Fary , usted tiene razón, hay segunda verificación, en la confirmación de la contraseña
felicitaciones.

karmany , "Este keygen no lo he querido programar (sería muy sencillo)"
eso es un poco divertido
Si es simple muestre la lógica de creación de una contraseña!
Lo que mostró, basta mirar en el EDI, en el debugger!

Saludos




Título: Re: KeyGenME fary - v1.0
Publicado por: karmany en 13 Enero 2019, 11:45 am
Bueno, he creado este simple generador de claves para 6 caracteres, usando solo la zona 4B. Unicamente el usuario debe escribir el primer carácter de (20hex hasta 7Fhex) y el resto lo calcula el programa.
Para no usar registros EDI ni nada por el estilo, he escrito la fórmula en un Excel. Os lo pongo en descarga.
(http://subirimagen.me/uploads/20190113044317.png)

Descarga del Excel:
https://mega.nz/#!i5YwSYLI!koy5ybfMZG1Op0v7-Ui8c3NdNIsvjU5R2tQW_4pOfuQ (https://mega.nz/#!i5YwSYLI!koy5ybfMZG1Op0v7-Ui8c3NdNIsvjU5R2tQW_4pOfuQ)

Un saludo.
No puedo dedicar nada más de tiempo a este keygen. Espero el keygen de Geovane, que es muy interesante lo que explicó.


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 13 Enero 2019, 19:13 pm
Gracias karmany por compartir, realmente tiempo es un problema, cuando el desafío exige mucho tiempo de nosotros

Aquí esta Keygen
Parece que "reinventó la rueda", con las funciones ....

El propósito y analizar lo más profundo posible en la lógica
Pero tiene como mejorar mucho el código.
Agradecimientos especiales a todos los que participaron en este desafío.
Aprendí mucho, con todos.

¿Quién puede mejorar el código, favor dice

Código
  1. function HexToBin(Hex: String): String;
  2. var
  3.   Bin: String;
  4.   k: Byte;
  5. Begin
  6.   Bin:='';
  7.   For k:=1 to Length(Hex) do
  8.      if      Hex[k]='0' then Bin:=Bin+'0000'
  9.      else if Hex[k]='1' then Bin:=Bin+'0001'
  10.      else if Hex[k]='2' then Bin:=Bin+'0010'
  11.      else if Hex[k]='3' then Bin:=Bin+'0011'
  12.      else if Hex[k]='4' then Bin:=Bin+'0100'
  13.      else if Hex[k]='5' then Bin:=Bin+'0101'
  14.      else if Hex[k]='6' then Bin:=Bin+'0110'
  15.      else if Hex[k]='7' then Bin:=Bin+'0111'
  16.      else if Hex[k]='8' then Bin:=Bin+'1000'
  17.      else if Hex[k]='9' then Bin:=Bin+'1001'
  18.      else if Hex[k]='A' then Bin:=Bin+'1010'
  19.      else if Hex[k]='B' then Bin:=Bin+'1011'
  20.      else if Hex[k]='C' then Bin:=Bin+'1100'
  21.      else if Hex[k]='D' then Bin:=Bin+'1101'
  22.      else if Hex[k]='E' then Bin:=Bin+'1110'
  23.      else if Hex[k]='F' then Bin:=Bin+'1111';
  24.   HexToBin:=Bin;
  25. End;
  26.  
  27. function BinToHex(Bin: String): String;
  28.  
  29. var
  30.   k: Byte;
  31.   s: String;
  32.   Hex: String;
  33. Begin
  34.   Hex:='';
  35.   While Length(Bin) mod 4<>0 do Bin:='0'+Bin;
  36.   For k:=0 to Length(Bin) div 4 -1 do
  37.   Begin
  38.      s:=Copy(Bin,k*4+1,4);
  39.      if      s='0000' then s:='0'
  40.      else if s='0001' then s:='1'
  41.      else if s='0010' then s:='2'
  42.      else if s='0011' then s:='3'
  43.      else if s='0100' then s:='4'
  44.      else if s='0101' then s:='5'
  45.      else if s='0110' then s:='6'
  46.      else if s='0111' then s:='7'
  47.      else if s='1000' then s:='8'
  48.      else if s='1001' then s:='9'
  49.      else if s='1010' then s:='A'
  50.      else if s='1011' then s:='B'
  51.      else if s='1100' then s:='C'
  52.      else if s='1101' then s:='D'
  53.      else if s='1110' then s:='E'
  54.      else if s='1111' then s:='F';
  55.      Hex:=Hex+s;
  56.   End;
  57.   BinToHex:=Hex;
  58. End;
  59.  
  60. function StrToHex(Str: String): Integer;
  61. var
  62.   Hex:Integer;
  63. Begin
  64.  
  65.   if (str.Length=7) Then
  66.   Begin
  67.        str:='0' + str;
  68.   end;
  69.  
  70.   if (str.Length=6) Then
  71.   Begin
  72.        str:='00' + str;
  73.   end;
  74.  
  75.   Hex:=       (strToInt(copy(Str,1,1))*128);
  76.   Hex:= Hex + (strToInt(copy(Str,2,1))*64);
  77.   Hex:= Hex + (strToInt(copy(Str,3,1))*32);
  78.   Hex:= Hex + (strToInt(copy(Str,4,1))*16);
  79.   Hex:= Hex + (strToInt(copy(Str,5,1))*8);
  80.   Hex:= Hex + (strToInt(copy(Str,6,1))*4);
  81.   Hex:= Hex + (strToInt(copy(Str,7,1))*2);
  82.   Hex:= Hex + (strToInt(copy(Str,8,1))*1);
  83.   StrToHex:=Hex;
  84. end;
  85.  
  86. function shLeft(Str:String;N:integer): String;
  87. var
  88.   s:String;
  89. Begin
  90.         s:=copy(Str,N+1,32-N)+copy(Str,1,N);
  91.         shLeft:=s;
  92.   end;
  93.  
  94. procedure TForm1.Button1Click(Sender: TObject);
  95.      var
  96.         A,B:String;
  97.         C:Integer;
  98. Label
  99. rotacionar,ciclo;
  100.                      //F6C53333    Caractere >=32 <=126  $20 $7E
  101. begin
  102.      A:= 'F6C53333';
  103.      B:= HexToBin(A);
  104.  
  105.      ciclo:
  106.      // 8 bits
  107.      C:= strToHex(copy(B,25,8));
  108.      IF (C>31) and (C<127) Then
  109.      Begin
  110.        Edit1.text:= (intTohex(C,2)) + Edit1.text ;
  111.        B:= (Copy(B,1,24)) + '00000000';
  112.        GOTO rotacionar;
  113.      end;  // fin 8 bits
  114.  
  115.  
  116.      //7 bits
  117.      C:= strToHex(copy(B,26,7));
  118.      IF (C>31) and (C<127) Then
  119.      Begin
  120.        Edit1.text:= (intTohex(C,2)) + Edit1.text;
  121.        B:= (Copy(B,1,25)) + '0000000';
  122.        GOTO rotacionar;
  123.      end;   //fin 7 bits
  124.  
  125.  
  126.      //6 bits  (Con 6 bits positivos no passa valor $7E  No precisa testar con 5)
  127.      C:= strToHex(copy(B,27,6));
  128.      IF (C>31) and (C<127) Then
  129.      Begin
  130.        Edit1.text:=  (intTohex(C,2)) + Edit1.text;
  131.        B:= (Copy(B,1,26)) + '000000';
  132.        GOTO rotacionar;
  133.      end;    //fin 6 bits
  134.  
  135.  
  136.      rotacionar:
  137.      IF ((Copy(B,1,32)) <> '00000000000000000000000000000000') Then
  138.      begin
  139.        B:=shLeft(B,13);
  140.        goto ciclo;
  141.       //Showmessage(B);
  142.      end;
  143. end;                        

Esto se basa en la lógica que ya he posteado

F6C53333      11110110110001010011001100110011
                                                                          110011 33---3
                      11110110110001010011001100000000
                      10100110011000000001111011011000 58---X
                                                                
                      10100110011000000001111010000000
                      00000011110100000001010011001100 4C---L
                                                                  
                      00000011110100000001010010000000
                      00000010100100000000000001111010 7A---z
                                                      
                      00000010100100000000000000000000
                                                            0000001010010 52---R  

RzLX3

En texto, función, después al final .......

Código
  1. Function HexToStr(s: String): String;
  2. Var i: Integer;
  3. Begin
  4.  Result:=''; i:=1;
  5.  While i<Length(s) Do Begin
  6.    Result:=Result+Chr(StrToIntDef('$'+Copy(s,i,2),0));
  7.    Inc(i,2);
  8.  End;
  9. End;

Código
  1. Showmessage(hexTostr(Edit1.text));

Fary ¡Muy bueno su codigo, excelente desafío !!!!!

Actualización 1

Usted puede intentar con otro valor.
Pero el valor necesita estar correctamente construido, mediante función inversa!

Para evitar este error, antes rotacionar:
¿Por qué con 6 bits no encontró valor válido !!!!



Código
  1.     Showmessage('¡Hummmm, valor incorrecto !!!!!');
  2.     rotacionar:
  3.      IF ((Copy(B,1,32)) <> '00000000000000000000000000000000') Then
  4.      begin
  5.        B:=shLeft(B,13);
  6.        goto ciclo;
  7.       //Showmessage(B);
  8.      end;



Gracias, Saludos


Título: Re: KeyGenME fary - v1.0
Publicado por: karmany en 13 Enero 2019, 22:43 pm
¡¡Excelente trabajo Geovane!!
Tu punto de vista ha sido muy instructivo e interesante.

Gracias a tu idea se me ha ocurrido lo siguiente que no se si se podrá generalizar para otros caracteres o tamaños de serial.

Partimos del último carácter que me invento: 8 que es 38hex
Inicio: F6C53333

Código
  1. F6C53333 - 38   = F6C532FB; //38hex es el carácter 8
  2. ROL F6C532FB, D = A65F7ED8
  3.  
  4. Y ahora voy restanto 7/8 bits como tu mencionas:
  5. A65F7ED8 - 58   = A65F7E80; //58hex es el caracter X
  6. ROL A65F7E80, D = EFD014CB
  7. EFD014CB - 4B   = EFD01480; //4Bhex es el caracter K
  8. ROL EFD01480, D = 02901DFA
  9. 02901DFA - 7A   = 02901D80; //7Ahex es el caracter z
  10. ROL 02901D80, D = 03B00052
  11. 03B00052 - 52   = 03B00000; // 52hex es el caracter R
  12. ROL 00000076, D = 00000076
  13. 00000076 - 76   = 00000000; //76hex es el caracter v

Por lo tanto, el serial válido es vRzKX8

Un saludo
Good work!


Título: Re: KeyGenME fary - v1.0
Publicado por: MCKSys Argentina en 13 Enero 2019, 23:03 pm
Y así es como, de un reto "simple", se puede aprender mucho...

Felicitaciones y agradecimientos para todos los involucrados.

Saludos!


Título: Re: KeyGenME fary - v1.0
Publicado por: Geovane en 14 Enero 2019, 22:21 pm
Hello friends

Hasta ahora tenemos un keygen que busca el primer serial válido.
Tenemos uno que busca mediante fuerza bruta

¿Dónde está lo que busca la contraseña correcta?

Recuerda a los amigos (ver los bits !!!)


Tengo la solución, voy a publicar si nadie encuentra.

Saludos.



Título: Re: KeyGenME fary - v1.0
Publicado por: apuromafo CLS en 16 Enero 2019, 04:16 am
Ya que esta esto resuelto, diré que la contraseña maestra es: f4RyKeY    :laugh:
;-)