A:link { TEXT-DECORATION: underline } A:visited { TEXT-DECORATION: underline } A:active { COLOR: red; TEXT-DECORATION: underline } A:hover { COLOR: #8080ff; TEXT-DECORATION: underline }

Troviamoci un seriale valido per LeapFTP 2.7.2

Data

by Spider

 

07/2001

UIC's Home Page

Published by Quequero

 E qui...

Qualche mio eventuale commento sul tutorial :)))

...che cosa scrivo?

....

Home page: http://bigspider.cjb.net
E-mail: spider_xx87@hotmail.com
Server IRC: irc.azzurra.it
Canali:  #crack-it  #asm
Nickname: ^Spider^

....

Difficoltà

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

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


Troviamo un seriale valido per LeapFTP 2.7.2
Written by Spider

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 usati

Tools usati:
- SoftICE qualunque versione
- Un editor esadecimale

URL o FTP del programma


http://www.leapware.com/download.html

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:



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

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

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

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

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

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

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

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

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

* Jump at Address:
|:00487942(U)
|
:00487934  lea eax, dword ptr [ebp-04]
:00487937  call 00403C84
: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 sia 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 prog 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

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.


Home

<!-- DIV 728x90 IAM --> <div id="ad72890bottom" align="center"></div> <!-- START Digilander F --> <SCRIPT LANGUAGE="Javascript"> <!-- if ( typeof(bsl1_boot) != 'undefined' ) { setTimeout("bsl1_boot()",100); } var rs_DLR=1; var rs_DLRERR=0; //--> </SCRIPT> <SCRIPT LANGUAGE="Javascript" SRC="http://digilander.libero.it/_ad/digi_ad_13.js"> </SCRIPT> <!-- Begin Nielsen DCR SDK --> <script> if(window.location === window.parent.location){ // Static Queue Snippet ! function(t, n) { t[n] = t[n] || { nlsQ: function(e, o, c, r, s, i) { return s = t.document, r = s.createElement("script"), r.async = 1, r.src = ("http:" === t.location.protocol ? "http:" : "https:") + "//cdn-gl.imrworldwide.com/conf/" + e + ".js#name=" + o + "&ns=" + n, i = s.getElementsByTagName("script")[0], i.parentNode.insertBefore(r, i), t[n][o] = t[n][o] || { g: c || {}, ggPM: function(e, c, r, s, i) { (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i]) } }, t[n][o]}}} (window, "NOLBUNDLE"); // SDK Initialization var nSdkInstance = NOLBUNDLE.nlsQ("P1504C48C-9D0B-4ADE-B7CD-04AF56A52362", "nlsnInstance"); // Content Metadata var nielsenMetadata = { type: 'static', assetid: ( location.hostname + location.pathname + location.search ).replace( /([^\w]|_)+/g, '-' ).replace( /^-+|-+$/g, '' ) || 'homepage', section: 'LiberoCommunity_BRW' }; // Event 'staticstart' Call nSdkInstance.ggPM("staticstart", nielsenMetadata); } </script> <!-- End Nielsen DCR SDK --> <!-- Libero COMSCORE start - Version 1.53 --> <script type="text/javascript"> if ( rs_DLRERR == 1 ) { var libero_comscore_error = 404; } </script> <script type="text/javascript"> document.write(unescape("%3Cscript src='" + (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js'%3E%3C/script%3E")); </script> <script type="text/javascript"> if (rs_DLR) { document.write(unescape("%3Cscript id='libero_tracking_js_site' src='http://digistatic.libero.it/js/comscore_8_3_04/comscore_digilander.libero.it.js'%3E%3C/script%3E")); document.write(unescape("%3Cscript id='libero_tracking_js_site' src='http://digistatic.libero.it/js/comscore_8_3_04/comscore_engine.js'%3E%3C/script%3E")); } </script> <noscript> <img src="http://b.scorecardresearch.com/p?c1=2&amp;c2=13259779&amp;cj=1&amp;name=libero.others&amp;ns_site=libero" /> </noscript> <!-- Libero COMSCORE end --> <!-- IOL Analytics --> <script src="//i.plug.it/iplug/js/lib/iol/analytics/data/digilander-libero-it/tracking_digilander-libero-it.min.js"></script> <script src="//i.plug.it/iplug/js/lib/iol/analytics/engine/IOL.Analytics.Tracking.min.js"></script> <script type="text/javascript"> var iat = new IOL.Analytics.Tracking.Engine(); iat.send(); </script> <noscript><img src="//italiaonline01.wt-eu02.net/215973748390194/wt.pl?p=315,libero.web.share.digiland.siti.digilander&amp;cg1=libero&amp;cg2=web&amp;cg3=share&amp;cg4=digiland&amp;cg5=siti&amp;cg6=digilander&amp;cg7=libero.web.share.digiland.siti.digilander" height="1" width="1" alt=""></noscript> <!-- /IOL Analytics --> <!-- BEGIN Global site tag (gtag.js) - Google Analytics 4 --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-9K5Y6YYGV4"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-9K5Y6YYGV4'); </script> <!-- END Global site tag (gtag.js) - Google Analytics 4 --> <div id="adinterstitial"></div> </body> </html>