Showing posts with label Keygenning. Show all posts
Showing posts with label Keygenning. Show all posts

Thursday, 29 September 2011

(Archive) KEYGENiNG FooMe 1 With Xylitol

Outils Nécessaires :
Scanning -> C:\Documents and Settings\Xylitol\Bureau\foome {part I}.exe
File Type : Exe, Size : 11264 (02C00h) Byte(s)
[!] File appears to have no protection or is using an unknown protection
MD5 du keygenMe: 2a2592726448585000eb3ad5304c1bc3

On peut remarquer ici que le KeygenMe ne possède aucune protection Anti-Reversing particulière, ce qui va nous faire gagner un peu de temps au final.

Aperçu du KeygenMe :


[+] Charger le KeygenMe dans OllyDbg.
[+] Click Droit >> Search For >> All Referenced Text String

004012A3   SUB ESP,8                                 (Initial CPU selection)
00401324   MOV DWORD PTR SS:[EBP-168],foome_{p.0040  ASCII "OLLYDBG.EXE"
0040132E   MOV DWORD PTR SS:[EBP-164],foome_{p.0040  ASCII "idag.exe"
00401338   MOV DWORD PTR SS:[EBP-160],foome_{p.0040  ASCII "windbg.exe"
00401403   MOV DWORD PTR SS:[ESP+8],foome_{p.004030  ASCII "U sUck"
0040140B   MOV DWORD PTR SS:[ESP+4],foome_{p.004030  ASCII "t4pZ"
00401431   MOV DWORD PTR SS:[ESP],foome_{p.0040302C  ASCII "                 [ foome part I by fyuw]",LF,LF,"Login : "
00401447   MOV DWORD PTR SS:[ESP],foome_{p.0040305F  ASCII "%s"
00401466   MOV DWORD PTR SS:[ESP],foome_{p.00403062  ASCII "Need more 5 char..."
00401494   MOV DWORD PTR SS:[ESP],foome_{p.00403076  ASCII "Need less 10 char..."
004014AF   MOV DWORD PTR SS:[ESP],foome_{p.0040308B  ASCII "pwd : "
004014C5   MOV DWORD PTR SS:[ESP],foome_{p.00403092  ASCII "%d"
0040151A   MOV DWORD PTR SS:[ESP+8],foome_{p.004030  ASCII "Iz N0t da g00d password"
00401522   MOV DWORD PTR SS:[ESP+4],foome_{p.004030  ASCII "t4pZ"
0040154D   MOV DWORD PTR SS:[ESP+8],foome_{p.004030  ASCII "U win.. make a keygen"
00401555   MOV DWORD PTR SS:[ESP+4],foome_{p.004030  ASCII "t4pZ"
004017DB   MOV DWORD PTR SS:[ESP],foome_{p.004030E8  ASCII "w32_sharedptr->size == sizeof(W32_EH_SHARED)"
004017E7   MOV EAX,foome_{p.00403118                 ASCII "../../gcc-3.4.5/gcc/config/i386/w32-shared-ptr.c"
004017F9   MOV DWORD PTR SS:[ESP],foome_{p.0040314C  ASCII "GetAtomNameA (atom, s, sizeof(s)) != 0"
00401805   MOV ECX,foome_{p.00403118                 ASCII "../../gcc-3.4.5/gcc/config/i386/w32-shared-ptr.c"

anti-débogues:
OLLYDBG.EXE
idag.exe
windbg.exe

Le programme check dans la liste des processus pour voir si il y a un des trois l'a chargé dedans, si il le found, le foome s'auto kill, foutez des nops ou renommez le fichier OLLYDBG.EXE par autre chose et voilà,
now: retournez dans les string data references:
"Need more 5 char..."
"Need less 10 char..."

Votre nom doit faire plus de 5 caractères et moins de 10 caractères pour continuer la routine
Double clickez sur "pwd : " dans les SDR

Placez un point d'arrêt sur:
004014B6 |. E8 49060000 CALL<JMP.&msvcrt.printf>
Lancez le fooMe (touche F9 par défaut), entrez votre nom et validez
olol on break c'est beaucoup trop tôt !
olol (bis) le registre: ECX 0022FE00 ASCII "xylitol"
bon supprimez le point d'arrêt, olol, la fonction scanf, olol le bordel en dessous se pourrait t'il que...
Placez un point d'arrêt en 0040150A, tapez un faux serial, regardez dans le dump

EAX=00002A75                 <- 10869
Stack SS:[0022FE2C]=00007A69 <- 31337

Le bon serial et stoké dans EAX...
kewl on a serialfish le truc mais c'était pas le but quoi...
Enfin bon now on avance, on connait désormais la routine.

Routine de Génération de Serial Valide:
004014D1  |. 0FBE9D 8AFEFFFF  MOVSX EBX,BYTE PTR SS:[EBP-176]  ; |||
004014D8  |. 8D85 88FEFFFF    LEA EAX,DWORD PTR SS:[EBP-178]   ; |||
004014DE  |. 890424           MOV DWORD PTR SS:[ESP],EAX       ; |||
004014E1  |. E8 0E060000      CALL Strlen                      ; ||\strlen
004014E6  |. 89C2             MOV EDX,EAX                      ; ||
004014E8  |. 89D0             MOV EAX,EDX                      ; ||
004014EA  |. 01C0             ADD EAX,EAX                      ; ||
004014EC  |. 01D0             ADD EAX,EDX                      ; ||
004014EE  |. C1E0 09          SHL EAX,9                        ; ||
004014F1  |. 01D0             ADD EAX,EDX                      ; ||
004014F3  |. 01C3             ADD EBX,EAX                      ; ||
004014F5  |. 8B85 A0FEFFFF    MOV EAX,DWORD PTR SS:[EBP-160]   ; ||
004014FB  |. 890424           MOV DWORD PTR SS:[ESP],EAX       ; ||
004014FE  |. E8 F1050000      CALL Strlen                      ; |\strlen
00401503  |. 29C3             SUB EBX,EAX                      ; |
00401505  |. 89D8             MOV EAX,EBX                      ; |
00401507  |. 83C0 0C          ADD EAX,0C                       ; |
0040150A  |. 3985 B4FEFFFF    CMP DWORD PTR SS:[EBP-14C],EAX   ; | Comparaison Final entre le Serial Entré & le Sérial Réel

Détails:
004014D1  |. 0FBE9D 8AFEFFFF  MOVSX EBX,BYTE PTR SS:[EBP-176]  |Prend la 3e Lettre du Login que l'on place dans EBX
004014D8  |. 8D85 88FEFFFF    LEA EAX,DWORD PTR SS:[EBP-178]   |Insère le Contenue du Login dans EAX
004014DE  |. 890424           MOV DWORD PTR SS:[ESP],EAX       |Aucune utilité particluière pour la Génération du Serial
004014E1  |. E8 0E060000      CALL strlens                     |Strlen() renvoi la Longueur du Login Entré (Xylitol : 7)
004014E6  |. 89C2             MOV EDX,EAX                      |Déplace le contenue de EAX dans EDX
004014E8  |. 89D0             MOV EAX,EDX                      |Déplace le contenue de EDX dans EAX
004014EA  |. 01C0             ADD EAX,EAX                      |EAX = EAX * 2 (Xylitol : 7*2). Soit 7h + 7h = Eh
004014EC  |. 01D0             ADD EAX,EDX                      |EAX = EAX + EDX (EDX = 7h)
004014EE  |. C1E0 09          SHL EAX,9                        |Décalage dans EAX de 9 Rangs vers la Gauche
004014F1  |. 01D0             ADD EAX,EDX                      |Additionne EDX à EAX
004014F3  |. 01C3             ADD EBX,EAX                      |Additionne EAX à EBX
004014F5  |. 8B85 A0FEFFFF    MOV EAX,DWORD PTR SS:[EBP-160]   |EAX = "windbg.exe"
004014FB  |. 890424           MOV DWORD PTR SS:[ESP],EAX       |Aucune utilité dans l'algorithme, paramètre pour l'API Strlen
004014FE  |. E8 F1050000      CALL                             |EAX = A (en hexa, 10 en decimale), EDX est écrasé, et  ECX = "windbg.exe"
00401503  |. 29C3             SUB EBX,EAX                      |Soustrait EAX à EBX
00401505  |. 89D8             MOV EAX,EBX                      |Déplace le contenue de EBX dans EAX
00401507  |. 83C0 0C          ADD EAX,0C                       |Additionne 0C à EAX
0040150A  |. 3985 B4FEFFFF    CMP DWORD PTR SS:[EBP-14C],EAX   |Compare le Vrai Serial au Sérial Entré par l'Utilisateur


[+] Remarque : N'oubliez pas qu'en ASM, chaques Calculs effectués sont effectués en Héxadécimal !!

À présent que l'on en sait un peu plus sur la Routine Principale du Keygen, nous allons
pouvoir reprogrammer celle-ci et en faire un Keygen fonctionnel et Valide. Sophocle a programmé un Keygen en Python et 0vercl0k en C. Je ne souhaitais pas coder un Keygen en utilisant un langage qui avait déjà été usité, et par conséquent, j'ai opté pour l'ASM de Windows, à savoir MASM.

Par soucis de clairvoyance, je ne vous insère ici que la fonction de génération du Serial Valide.

Routine MASM:
MOV EDX,EAX
MOV EAX,EDX
ADD EAX,EAX
ADD EAX,EDX
SHL EAX,9
ADD EAX,EDX
ADD EBX,EAX
       
PUSHAD            ;Sauvegarde tout les Registres
MOV ECX, EDX      ;Insère la Longueur du Login dans ECX (Correction Trouvé lors du Debug)
XOR EDX, EDX      ;Compteur pour la Longueur de la Chaine.
LEA ESI, szName   ;On pointe la Chaine à Analyser.
JMP Strlen   

Char_Traite:
MOV EBX, EAX      ;On met le caractère contenue dans AL dans BX
JMP Continue      ;On continue sur la Routine du Keygen

Strlen:
CMP EDX,3         ;Compare si EDX vaut 3 (3e Char)
JE Char_Traite    ;Si c'est le cas, on JMP sur la Fonction Char_Traite
LODSB             ;Charge dans AL le caractère courant et pointe le suivant.
OR EAX, EAX       ;On test si c'est la fin de la chaine.
JZ Continue       ;Si c'est le cas, on sort de la routine.
INC EDX           ;On rajoute un caractère de plus dans la chaine.
JMP Strlen        ;Saute sur le caractère suivant de la chaine.

Continue:
POPAD             ;Restaure tout les Registres
ADD EBX, ECX
MOV EAX,0Ah
SUB EBX,EAX
MOV EAX,EBX
ADD EAX,0Ch

Au final, un algorithme respecté et fonctionnel, sur un Keygen assez rudimentaire, mais qui permet de bien s'initier au Reversing.

Et on va se quitter sur une petite screen réjouissante:

__
Xylitol le 27 Novembre 2008

Package

Thursday, 17 March 2011

LuTiN NoIR Small RSA keygenme for newbies

In February, Le_MaLaDe reopened UFDC (Université Française de Cracking)
The first challenge of the 'Competence 5' is a packed (ASPack) KeygenMe: LuTiN NoIR Small RSA keygenme for newbies (Yeah, the site is from 2000-2002 it's old)
Protection: MD5+RSA.


For make fast:
M = C^D mod N
M = MD5(NAME)


You grab N inside (2F774486FD3B97FFA559687F7F9D5335CA3D16FBB60C0019)
And factorise it with RSA-Tool 2 by tE, after few seconds/mins you get P and Q

PRIME FACTOR: 69EF193F0EC20A9E57B455DB
PRIME FACTOR: 72B4BF519A43852C9F9C761B

Now with that you calculate D: 2312552808E487A2F561E2BBEF5FB7275C2BD350491DB9A1

MD5 for "Xylitol": 9F01C4DEFB31F597423AC2E0CAB0FA54

Now rSab0x:

Name: Xylitol
Serial: 1A82A1823B1445B66580029237258D411C788A202D982451

I wanted make a keygen in PHP but finaly i've not found a RSA classe for do it
so i hope you like assembly... :)

The code seem crappy in blogspot :'(


base.asm:
.386
.model  flat, stdcall
option  casemap :none

include     windows.inc
include     user32.inc
include     kernel32.inc
include     comctl32.inc
include     \masm32\macros\macros.asm
includelib  user32.lib
includelib  kernel32.lib
includelib  comctl32.lib
include     winmm.inc
includelib  winmm.lib

include     biglib.inc
includelib  biglib.lib
include     cryptohash.inc
includelib  cryptohash.lib
include     ufmod.inc
includelib  ufmod.lib


DlgProc     PROTO :DWORD,:DWORD,:DWORD,:DWORD

.const
IDD_MAIN      EQU 1000
IDB_EXIT      EQU 1001
IDC_NAME      EQU 1002
IDC_SERIAL    EQU 1005
IDB_GENERATE  EQU 1006
IDB_ABOUT     EQU 1007
IDI_ICON      EQU 100
MAXSIZE       EQU 512

.data
N           db  "2F774486FD3B97FFA559687F7F9D5335CA3D16FBB60C0019",0
D           db  "2312552808E487A2F561E2BBEF5FB7275C2BD350491DB9A1",0

.data?
hInstance   dd  ?

szName          db  MAXSIZE dup(?)
szSerial        db  MAXSIZE dup(?)
szHash          db  MAXSIZE dup(?)

BigN        dword ?
BigD        dword ?
BigC        dword ?
BigM        dword ?

.code
start:
    invoke  GetModuleHandle, NULL
    mov hInstance, eax
    invoke  DialogBoxParam, hInstance, IDD_MAIN, 0, offset DlgProc, 0
    invoke  ExitProcess, eax
    invoke  InitCommonControls

DlgProc proc uses esi edi hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
        mov eax,uMsg
            .if eax == WM_INITDIALOG
                invoke  LoadIcon,hInstance,200
                invoke  SendMessage, hWnd, WM_SETICON, 1, eax
                invoke uFMOD_PlaySong,666,hInstance,XM_RESOURCE
                invoke  GetDlgItem,hWnd,IDC_NAME
                invoke  SendMessage,eax,EM_LIMITTEXT,60,0
                invoke  GetDlgItem,hWnd,IDC_SERIAL
                invoke  SendMessage,eax,EM_LIMITTEXT,32,0
                jmp @KEYGENNiNG
            .elseif eax == WM_COMMAND
                mov eax,wParam
                    .if eax == IDB_EXIT
                       
                        invoke  SendMessage, hWnd, WM_CLOSE, 0, 0
                    .elseif ax == IDC_NAME
                        shr eax, 16
                        .if ax == EN_CHANGE
                            jmp @KEYGENNiNG
                        .endif
                    .elseif eax == IDB_GENERATE
                        @KEYGENNiNG:
                            invoke GetDlgItemText,hWnd,IDC_NAME,addr szName,MAXSIZE
                            cmp eax,0
                            jnz @NEXT
                            invoke  SetDlgItemText,hWnd,IDC_SERIAL,chr$('Enter your name, buddy!')
                        @NEXT:
                            mov edx,eax
                            invoke  MD5Init
                            invoke  MD5Update,addr szName,edx
                            invoke  MD5Final
                            invoke HexEncode,eax,MD5_DIGESTSIZE,addr szHash
                            invoke _BigCreate,0
                            mov BigN,eax
                            invoke _BigCreate,0
                            mov BigD,eax
                            invoke _BigCreate,0
                            mov BigC,eax
                            invoke _BigCreate,0
                            mov BigM,eax
                            invoke  _BigIn,addr N,16,BigN
                            invoke  _BigIn,addr D,16,BigD
                            invoke  _BigIn,addr szHash,16,BigM
                            invoke  _BigPowMod,BigM,BigD,BigN,BigC
                            invoke  _BigOutB16,BigC,addr szSerial
                            invoke  SetDlgItemText,hWnd,IDC_SERIAL,addr szSerial
                            invoke  RtlZeroMemory,addr szName,sizeof szName
                            invoke  RtlZeroMemory,addr szHash,sizeof szHash  
                            invoke  RtlZeroMemory,addr szSerial,sizeof szSerial
                            invoke _BigDestroy,BigN
                            invoke _BigDestroy,BigD
                            invoke _BigDestroy,BigC
                            invoke _BigDestroy,BigM
                    .endif
            .elseif eax == WM_CLOSE
                invoke uFMOD_PlaySong,0,0,0
                invoke  EndDialog, hWnd, 0
            .endif
        XOR EAX,EAX
        RET
DlgProc endp
end start

base.rc:
;This Resource Script was generated by WinAsm Studio.

#define IDD_MAIN 1000
#define IDB_EXIT 1001
#define IDC_STATIC1003 1003
#define IDC_STATIC1004 1004
#define IDC_NAME 1002
#define IDC_SERIAL 1005
#define IDB_GENERATE 1006
#define IDI_ICON 100
#define IDC_IMAGE1008 1008
#define IDC_STATIC1009 1009
#define tune 666

1 24 DISCARDABLE "manifest.xml"
IDI_ICON ICON DISCARDABLE "app.ico"
946 BITMAP DISCARDABLE "5ab9y001.bmp"
tune RCDATA DISCARDABLE "music.xm"

IDD_MAIN DIALOGEX 10,10,392,135
CAPTION "LuTiN NoIR Small RSA keygenme for newbies *KeyGen*"
FONT 8,"Tahoma"
STYLE 0x90c80804
EXSTYLE 0x00000188
BEGIN
    CONTROL "Exit",IDB_EXIT,"Button",0x10010000,343,120,45,13,0x00000000
    CONTROL "Xylitol",IDC_NAME,"Edit",0x50010000,27,89,360,13,0x00000200
    CONTROL "Name",IDC_STATIC1003,"Static",0x50000000,3,89,20,8,0x00000000
    CONTROL "Serial",IDC_STATIC1004,"Static",0x50000000,4,108,20,9,0x00000000
    CONTROL "",IDC_SERIAL,"Edit",0x50010800,27,105,360,12,0x00000200
    CONTROL "GEN",IDB_GENERATE,"Button",0x10010000,297,120,44,13,0x00000000
    CONTROL "#946",IDC_IMAGE1008,"Static",0x5080020e,3,3,384,81,0x00000000
    CONTROL "17/03/2011",IDC_STATIC1009,"Static",0x58000000,0,126,81,7,0x00000000
END

cryptohash for the MD5, biglib for RSA and ufmod for the music...
these libs are easy to find ;)


Also if you want play with RSA, try Xyl Crypto-KeygenMe 2: rEvErs0rEd