Zoom Icon

Leap FTP 2.7.2

From UIC

Troviamoci un seriale valido per LeapFTP 2.7.2

Contents


Infos
Author: Spider
Email: spider_xx87 (AT) hotmail (DOT) com
Website: http://bigspider.has.it/
Date: ??/07/2002 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Image:Flag_Italian.gif
Comments: Que: Grande Spider, ottimo lavoro, minuzioso e completo :)


Un esempio di routine di check del serial alla portata di tutti :)


Introduzione

Il programma vittima è un bel client FTP semplice e intuitivo, che nulla ha da invidiare al più noto CuteFTP. Per la registrazione vengono richiesti Nome e Serial, ma il nome inserito non viene utilizzato ai fini del calcolo del seriale.


Tools


Link e Riferimenti


Essay

Occhei, possiamo incominciare :)
Per prima cosa che facciamo? Osserviamo la box di registrazione. La casella del seriale accetta qualunque carattere e volge al maiuscolo tutte le lettere minuscole. Non ci sono limiti di lunghezza. Bene, ora possiamo prendere il SoftICE. I bpx su GetWindowTextA e GetDlgItemTextA non fungono... sfoderiamo la nostra arma segreta... inserite il serial, battete in sice "bpx hmemcpy" e premete ok. Non appena il sice poppa eliminiamo il breakpoint e premiamo F12 fino a quando non torniamo al processo di LeapFTP. Prima di arrivare alla call della routine di check del serial dovrete steppare qualche ret e qualche altra istruzione, ma la call incriminata è inconfondibile... la tipica call seguita da test e jump condizionale :)
Analizziamo adesso la (semplice) routine di check del serial:


<nowiki>:</nowiki>004877D0 push ebp
<nowiki>:</nowiki>004877D1 mov ebp, esp
<nowiki>:</nowiki>004877D3 add esp, FFFFFFF4
<nowiki>:</nowiki>004877D6 push ebx
<nowiki>:</nowiki>004877D7 push esi
<nowiki>:</nowiki>004877D8 push edi
<nowiki>:</nowiki>004877D9 mov dword ptr [ebp-04], edx ;edx contiene un puntatore al serial inserito
<nowiki>:</nowiki>004877DC mov eax, dword ptr [ebp-04]
<nowiki>:</nowiki>004877DF call 004040B8 ;inutile per il nostro obiettivo
<nowiki>:</nowiki>004877E4 xor eax, eax
<nowiki>:</nowiki>004877E6 push ebp
<nowiki>:</nowiki>004877E7 push 0048793D
<nowiki>:</nowiki>004877EC push dword ptr fs<nowiki>:</nowiki>[eax]
<nowiki>:</nowiki>004877EF mov dword ptr fs<nowiki>:</nowiki>[eax], esp
<nowiki>:</nowiki>004877F2 mov [ebp-05], 00
<nowiki>:</nowiki>004877F6 mov eax, dword ptr [ebp-04] ;ebp-04 contiene un puntatore al serial inserito
<nowiki>:</nowiki>004877F9 call 00403F04
<nowiki>:</nowiki>004877FE cmp eax, 00000013 ;se il serial non è di 19 char...
<nowiki>:</nowiki>00487801 jne 00487927 ;...beggar off <nowiki>:</nowiki>)
<nowiki>:</nowiki>00487807 mov eax, dword ptr [ebp-04]
<nowiki>:</nowiki>0048780A cmp byte ptr [eax+04], 2D ;se il 5° carattere non è "-"...
<nowiki>:</nowiki>0048780E jne 00487927 ;...beggar off
<nowiki>:</nowiki>00487814 mov eax, dword ptr [ebp-04]
<nowiki>:</nowiki>00487817 cmp byte ptr [eax+09], 2D ;se il 10° carattere non è "-"...
<nowiki>:</nowiki>0048781B jne 00487927 ;...beggar off
<nowiki>:</nowiki>00487821 mov eax, dword ptr [ebp-04]
<nowiki>:</nowiki>00487824 cmp byte ptr [eax+0E], 2D ;se il 15° carattere non è "-"...
<nowiki>:</nowiki>00487828 jne 00487927 ;...beggar off
<nowiki>:</nowiki>0048782E xor esi, esi ;azzera esi
<nowiki>:</nowiki>00487830 xor edi, edi ;azzera edi
<nowiki>:</nowiki>00487832 xor eax, eax ;azzera eax
<nowiki>:</nowiki>00487834 mov dword ptr [ebp-0C], eax ;azzera ebp-0C
<nowiki>:</nowiki>00487837 mov ebx, 00000001 ;ebx farà da contatore

<nowiki>*</nowiki> Jump at Address<nowiki>:</nowiki>
|<nowiki>:</nowiki>004878C2(C)
|
<nowiki>:</nowiki>0048783C mov eax, ebx ;mette ebx in eax
<nowiki>:</nowiki>0048783E and eax, 80000003 ;salva gli ultimi 2 bits. eax sarà quindi
;un numero compreso tra 0 e 3
<nowiki>:</nowiki>00487843 jns 0048784A ;salta SEMPRE, dato che ebx è positivo <nowiki>:</nowiki>)
<nowiki>:</nowiki>00487845 dec eax
<nowiki>:</nowiki>00487846 or eax, FFFFFFFC
<nowiki>:</nowiki>00487849 inc eax

<nowiki>*</nowiki> Jump at Address<nowiki>:</nowiki>
|<nowiki>:</nowiki>00487843(C)
|
<nowiki>:</nowiki>0048784A test eax, eax ;se eax != 0 ovvero se ebx è divisibile per 4)...
<nowiki>:</nowiki>0048784C jne 00487864 ;...salta a 00487864
<nowiki>:</nowiki>0048784E mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al seriale da noi inserito
<nowiki>:</nowiki>00487851 mov al, byte ptr [eax+ebx-01] ;mette in al il byte a eax+ebx-01
<nowiki>:</nowiki>00487855 call 004877A8 ;controlla che sia il codice ascii di un numero
<nowiki>:</nowiki>0048785A test al, al ;se non lo è...
<nowiki>:</nowiki>0048785C je 00487927 ;...beggar off!
<nowiki>:</nowiki>00487862 jmp 00487886

<nowiki>*</nowiki> Jump at Address<nowiki>:</nowiki>
|<nowiki>:</nowiki>0048784C(C)
|
<nowiki>:</nowiki>00487864 mov eax, ebx ;eax = ebx
<nowiki>:</nowiki>00487866 mov ecx, 00000005 ;ecx = 5
<nowiki>:</nowiki>0048786B cdq ;azzera edx
<nowiki>:</nowiki>0048786C idiv ecx ;divide eax per 5
<nowiki>:</nowiki>0048786E test edx, edx ;se il resto è 0 (cioè se ebx è divisibile per 5)...
<nowiki>:</nowiki>00487870 je 00487886 ;...salta (in pratica i "-" vengono ignorati)
<nowiki>:</nowiki>00487872 mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al seriale da noi inserito
<nowiki>:</nowiki>00487875 mov al, byte ptr [eax+ebx-01] ;mette in al il byte a eax+ebx-01
<nowiki>:</nowiki>00487879 call 004877BC ;è il codice ascii di una lettera maiuscola?
<nowiki>:</nowiki>0048787E test al, al ;se non lo è...
<nowiki>:</nowiki>00487880 je 00487927 ;...solita beggar off

<nowiki>*</nowiki> Jump at Addresses<nowiki>:</nowiki>
|<nowiki>:</nowiki>00487862(U), <nowiki>:</nowiki>00487870(C)
|
<nowiki>:</nowiki>00487886 mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al seriale da noi inserito
<nowiki>:</nowiki>00487889 mov al, byte ptr [eax+ebx-01] ;mette in al il byte a eax+ebx-01
<nowiki>:</nowiki>0048788D cmp al, 2D ;se il carattere è "-"...
<nowiki>:</nowiki>0048788F je 004878BE ;...non lo aggiunge ad esi
<nowiki>:</nowiki>00487891 cmp ebx, 00000005 ;se il numero del carattere è maggiore o uguale a 5...
<nowiki>:</nowiki>00487894 jge 004878A2 ;...non lo aggiunge ad esi
<nowiki>:</nowiki>00487896 mov edx, dword ptr [ebp-04] ;mette in edx il puntatore al seriale da noi inserito
<nowiki>:</nowiki>00487899 and eax, 000000FF ;tiene solo al (che contiene il carattere)
<nowiki>:</nowiki>0048789E add esi, eax ;somma il carattere ad esi
<nowiki>:</nowiki>004878A0 jmp 004878BE

<nowiki>*</nowiki> Jump at Address<nowiki>:</nowiki>
|<nowiki>:</nowiki>00487894(C)
|
<nowiki>:</nowiki>004878A2 cmp ebx, 0000000A ;se il numero del carattere è maggiore o uguale a 10...
<nowiki>:</nowiki>004878A5 jge 004878B3 ;non aggiunge il carattere ad edi
<nowiki>:</nowiki>004878A7 mov edx, dword ptr [ebp-04]
<nowiki>:</nowiki>004878AA and eax, 000000FF ;prende solo al
<nowiki>:</nowiki>004878AF add edi, eax ;somma il carattere ad edi
<nowiki>:</nowiki>004878B1 jmp 004878BE

<nowiki>*</nowiki> Jump at Address<nowiki>:</nowiki>
|<nowiki>:</nowiki>004878A5(C) ;se il numero del carattere è maggiore o uguale a 10
| ;somma il carattere ad ebp-0C
<nowiki>:</nowiki>004878B3 mov edx, dword ptr [ebp-04]
<nowiki>:</nowiki>004878B6 and eax, 000000FF
<nowiki>:</nowiki>004878BB add dword ptr [ebp-0C], eax

<nowiki>*</nowiki> Jump at Addresses<nowiki>:</nowiki>
|<nowiki>:</nowiki>0048788F(C), <nowiki>:</nowiki>004878A0(U), <nowiki>:</nowiki>004878B1(U)
|
<nowiki>:</nowiki>004878BE inc ebx ;incrementa ebx
<nowiki>:</nowiki>004878BF cmp ebx, 0000000F ;se non siamo ancora al quindicesimo carattere...
<nowiki>:</nowiki>004878C2 jne 0048783C ;...riprende da capo, altrimenti continua.
<nowiki>:</nowiki>004878C8 lea ecx, dword ptr [edi+esi] ;ecx=edi+esi
<nowiki>:</nowiki>004878CB add ecx, dword ptr [ebp-0C] ;somma ad ecx il valore contenuto in ebp-0C
<nowiki>:</nowiki>004878CE mov eax, esi ;eax=esi
<nowiki>:</nowiki>004878D0 mov ebx, 0000001A ;mette 1Ah (26 decimale) in ebx
<nowiki>:</nowiki>004878D5 cdq ;azzera edx
<nowiki>:</nowiki>004878D6 idiv ebx ;divide eax per ebx
<nowiki>:</nowiki>004878D8 add edx, 00000041 ;aggiunge 41h al resto della divisione
<nowiki>:</nowiki>004878DB mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al serial da noi inserito
<nowiki>:</nowiki>004878DE cmp dl, byte ptr [eax+0F] ;se il 16° carattere è diverso dal valore in dl...
<nowiki>:</nowiki>004878E1 jne 00487927 ;...beggar off
<nowiki>:</nowiki>004878E3 mov eax, edi ;eax=edi
<nowiki>:</nowiki>004878E5 mov ebx, 0000001A ;mette 1Ah (26 decimale) in ebx
<nowiki>:</nowiki>004878EA cdq ;azzera edx
<nowiki>:</nowiki>004878EB idiv ebx ;divide eax * ebx
<nowiki>:</nowiki>004878ED add edx, 00000041 ;aggiunge 41h al resto della divisione
<nowiki>:</nowiki>004878F0 mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al serial da noi immesso
<nowiki>:</nowiki>004878F3 cmp dl, byte ptr [eax+10] ;se il 17° carattere è diverso dal valore in dl...
<nowiki>:</nowiki>004878F6 jne 00487927 ;...beggar off
<nowiki>:</nowiki>004878F8 mov eax, dword ptr [ebp-0C] ;mette in eax il valore contenuto in ebp-0C
<nowiki>:</nowiki>004878FB mov ebx, 0000001A ;mette 1Ah (26 decimale) in ebx
<nowiki>:</nowiki>00487900 cdq ;azzera edx
<nowiki>:</nowiki>00487901 idiv ebx ;divide eax per ebx
<nowiki>:</nowiki>00487903 add edx, 00000041 ;aggiunge 41h al resto della divisione
<nowiki>:</nowiki>00487906 mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al serial da noi immesso
<nowiki>:</nowiki>00487909 cmp dl, byte ptr [eax+11] ;se il 18° carattere è diverso dal valore in dl...
<nowiki>:</nowiki>0048790C jne 00487927 ;...beggar off
<nowiki>:</nowiki>0048790E mov eax, ecx ;eax = ecx (che conteneva esi + edi + [ebp-0C])
<nowiki>:</nowiki>00487910 mov ecx, 0000001A ;ecx = 1Ah (26 decimale)
<nowiki>:</nowiki>00487915 cdq ;azzera edx
<nowiki>:</nowiki>00487916 idiv ecx ;divide eax per ecx
<nowiki>:</nowiki>00487918 add edx, 00000041 ;aggiunge 41h al resto della divisione
<nowiki>:</nowiki>0048791B mov eax, dword ptr [ebp-04] ;mette in eax il puntatore al serial da noi immesso
<nowiki>:</nowiki>0048791E cmp dl, byte ptr [eax+12] ;se il 19° carattere è diverso dal valore in dl...
<nowiki>:</nowiki>00487921 jne 00487927 ;...beggar off
<nowiki>:</nowiki>00487923 mov [ebp-05], 01 ;seriale esatto! <nowiki>:</nowiki>-)

<nowiki>*</nowiki> Jump at Addresses<nowiki>:</nowiki>
|<nowiki>:</nowiki>00487801(C), <nowiki>:</nowiki>0048780E(C), <nowiki>:</nowiki>0048781B(C), <nowiki>:</nowiki>00487828(C), <nowiki>:</nowiki>0048785C(C)
|<nowiki>:</nowiki>00487880(C), <nowiki>:</nowiki>004878E1(C), <nowiki>:</nowiki>004878F6(C), <nowiki>:</nowiki>0048790C(C), <nowiki>:</nowiki>00487921(C)
|
<nowiki>:</nowiki>00487927 xor eax, eax
<nowiki>:</nowiki>00487929 pop edx
<nowiki>:</nowiki>0048792A pop ecx
<nowiki>:</nowiki>0048792B pop ecx
<nowiki>:</nowiki>0048792C mov dword ptr fs<nowiki>:</nowiki>[eax], edx
<nowiki>:</nowiki>0048792F push 00487944

<nowiki>*</nowiki> Jump at Address<nowiki>:</nowiki>
|<nowiki>:</nowiki>00487942(U)
|
<nowiki>:</nowiki>00487934 lea eax, dword ptr [ebp-04]
<nowiki>:</nowiki>00487937 call 00403C84
<nowiki>:</nowiki>0048793C ret

Ricapitolando:

  1. controlla che il serial sia di 19 caratteri e che il 5°, il 10° ed il 15° carattere siano "-" (trattino). Non ci vuol molto a capire che il serial è in questa forma: xxxx-xxxx-xxxx-xxxx.
  2. per i primi 15 caratteri controlla che quelli la cui posizione è divisibile per 4 siano numeri, mentre gli altri lettere. Pertanto i primi 15 caratteri saranno in questa forma: xxxn-xxnx-xnxx-, dove x rappresenta una qualunque lettera e n un qualsiasi numero.
  3. controlla gli ultimi 4 caratteri del seriale tramite un algoritmo che tra poco spiegheremo.

Come abbiamo visto per le prime tre parti del serial abbiamo la più ampia libertà... dobbiamo solo stare attenti a mettere lettere e numeri al posto giusto :-). Diverso è per l'ultima parte del serial. Esso dipende infatti dal resto del serial. Notate infatti che il programma somma in esi i codici ascii dei primi 4 caratteri del serial, in edi quelli della seconda parte del serial, e in ebp-0C quelli della terza parte del serial. Se chiamiamo i risultati di queste somme a, b e c, le lettere della quarta parte del serial saranno date da queste formule (i calcoli sono in esadecimale):

16° = (a mod 1A) + 41
17° = (b mod 1A) + 41
18° = (c mod 1A) + 41
19° = [(a+b+c) mod] 1A + 41

Bene... calcoliamoci adesso un serial valido! Intanto stabiliamo i primi 15 char, ricordandoci di rispettare la forma in xxxn-xxnx-xnxx-:

SPI1-DE2R-F3TP-

S = 53
P = 50
I = 49
1 = 31

a = 53 + 50 + 49 + 31 = 11D

D = 44
E = 45
2 = 32
R = 52

b = 44 + 45 + 32 + 52 = 10D

F = 46
3 = 33
T = 54
P = 50

c = 46 + 33 + 54 + 50 = 11D

16° = (11D mod 1A) + 41 = 19 + 41 = 5A = "Z"
17° = (10D mod 1A) + 41 = 9 + 41 = 4A = "J"
18° = (11D mod 1A) + 41 = 19 + 41 = 5A = "Z"
19° = [(11D + 10D + 11D) mod 1A] + 41 = [347 mod 1A] + 41 = 7 + 41 = 48 = "H"

Ed ecco il serial completo:

SPI1-DE2R-F3TP-ZJZH

Lascio a voi il compito di creare il keygen :-)

Ciauzzzzz, Spider


Note Finali

Saluto TheMR che mi ha segnalato il prog e ovviamente tutti gli studenti e frequentatori di UIC, Ringzer0 (finalmente up!), #asm, #crack-it, e, last but not least, il Quequero nazionale a cui dobbiamo l'UIC :)


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.