Hola Flamer , ya estaba con ese crame
, bueno ya está vencido, un pequeño tute.
1.Abrimos el programa con el Olly , buscamos las APIS a ver que hay de interesante... ummm GetDlgItemInt ... para que será? jeje , ponemos el breakpoint en las dos.
2.Bien , ejecutamos el programa dando F9 , ponemos nuestro ID , y el serial , y presionamos registrar.
3. Aleluya! , caemos en donde coge los seriales... Seguimos mirando , y coge mi ID , y lo mete en ebx, despues coge mi serial y lo mete en ECX...
4. Entramos al call , ese que hay ahí abajo , está muy claro , al serial , le suma 4C , lo incrementa en uno , le añade 38B , se añade a sí mismo , se multiplica por trés y se le resta uno.
5. Salimos del call y vemos una comparación de ebx con eax , ¿con eax? , si.. yo también me extrañé , pero es que al coger el serial en el ultimo GetDlgItemInt, devolvió su valor en eax , lo movió a ecx , pero no borró eax, por lo tanto está comparando nuestro serial original , con las operaciones que le ha hecho a nuestro ID.
Pues listo! Armemos nuestro keygen en ASM que estoy practicando jeje:
TITLE keygen (keygen.asm)
.386 ; Hace el código compatible con el procesador 386
.MODEL flat,stdcall
INCLUDE user32.inc
INCLUDE kernel32.inc
INCLUDE msvcrt.inc
INCLUDELIB user32.lib
INCLUDELIB kernel32.lib
INCLUDELIB msvcrt.lib
;PARA TENER LOS BUFFERS
__p__iob PROTO C
_iobuf STRUCT
_ptr DWORD ?
_cnt DWORD ?
_base DWORD ?
_flag DWORD ?
_file DWORD ?
_charbuf DWORD ?
_bufsiz DWORD ?
_tmpfname DWORD ?
_iobuf ENDS
FILE TYPEDEF _iobuf
;PROTOTIPOS DE FUNCIONES EN C
EXTRN fgets:NEAR
EXTRN sscanf:NEAR
EXTRN getchar:NEAR
EXTRN printf:NEAR
EXTRN strlen:NEAR
;PROTOTIPOS DE FUNCIONES EN ASM
.data ;Datos del programa
MSG_ID BYTE "Ingrese su ID(maximo 4 digitos):",0
MSG_KEY BYTE "Su serial es: %d",0Ah,0Dh,0
PULSE_TECLA BYTE "Pulse intro para salir . . .",0
;ESPECIFICADORES DE FORMATO
ESPI BYTE "%d",0
ESPS BYTE "%s",0
.data?
ID DWORD ?
SERIAL DWORD ?
BUFFER_FGETS DWORD ?
stdin DWORD ?
stdout DWORD ?
stderr DWORD ?
.code ;Código del programa
main PROC
;Buffers
call __p__iob
mov stdin,eax ; #define stdin (&__iob_func()[0])
add eax,SIZEOF(FILE)
mov stdout,eax ; #define stdout (&__iob_func()[1])
add eax,SIZEOF(FILE)
mov stderr,eax ; #define stderr (&__iob_func()[2])
;Inicio código.
push OFFSET MSG_ID
push OFFSET ESPS
call printf
;COGEMOS DEL BUFFER DIEZ CARÁCTERES POR SI LAS MOSCAS.
push stdin
push 10
push OFFSET BUFFER_FGETS
call fgets
;COGEMOS EL ID DEL BUFFER DE FGETS CON SSCANF
push OFFSET ID
push OFFSET ESPI
push OFFSET BUFFER_FGETS
call sscanf
;;;;;;;;;;;;;;;;;;;;;;;;
;CREACIÓN DEL SERIAL ;
;;;;;;;;;;;;;;;;;;;;;;;;
mov ebx ,ID ;
add ebx,4Ch ;
inc ebx ;
add ebx,38Bh ;
add ebx,ebx ;
imul ebx,3 ;
dec ebx ;
;;;;;;;;;;;;;;;;;;;;;;;;
;IMPRIMIMOS SERIAL
push ebx
push OFFSET MSG_KEY
call printf
;IMPRIMIMOS PARA AVISAR
push OFFSET PULSE_TECLA
push OFFSET ESPS
call printf
;CUANDO PULSE INTRO CERRAMOS
call getchar
invoke ExitProcess,0
ret
main endp
END main
Y no podía abandonar a mi querido C , uff , que liviano se me hace al ASM:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * buffer_fgets
= malloc(10); int ID;
int serial;
printf("Ingresa el ID (4 caracteres maximo):"); fgets(buffer_fgets
,6,stdin
); sscanf(buffer_fgets
,"%d",&ID
); serial=ID;
//Rutina de creación.
serial+=76;//4c en hex
++serial;
serial+=907;//38b en hex
serial+=serial;
serial*=3;
--serial;
printf("Tu serial es: %d \n",serial
); printf("Presione intro para terminar . . ."); return 0;
}