___           ___           ___           ___           ___           ___     
     /\  \         /\__\         /\  \         /\__\         /\  \         /\  \    
     \:\  \       /:/  /        /::\  \       /::|  |       /::\  \       /::\  \   
      \:\  \     /:/__/        /:/\:\  \     /:|:|  |      /:/\:\  \     /:/\ \  \  
      /::\  \   /::\  \ ___   /:/  \:\  \   /:/|:|__|__   /::\~\:\  \   _\:\~\ \  \ 
     /:/\:\__\ /:/\:\  /\__\ /:/__/ \:\__\ /:/ |::::\__\ /:/\:\ \:\__\ /\ \:\ \ \__\
    /:/  \/__/ \/__\:\/:/  / \:\  \ /:/  / \/__/~~/:/  / \/__\:\/:/  / \:\ \:\ \/__/
   /:/  /           \::/  /   \:\  /:/  /        /:/  /       \::/  /   \:\ \:\__\  
   \/__/            /:/  /     \:\/:/  /        /:/  /        /:/  /     \:\/:/  /  
                   /:/  /       \::/  /        /:/  /        /:/  /       \::/  /   
                   \/__/         \/__/         \/__/         \/__/         \/__/    
				   .openmod.org


VB CRackme + Keygen - Sphinxor crackme




-|- A. Introduction


Au menu aujourd'hui, un crackme en pure VB : Sphinxor crackme.

L'interet de ce crackme relativement facile est que l'on ne va pas degainer ollydebug
mais un vieux copain a lui, 'smartcheck'  the VB debugger de chez numega.

Rapide, pratique, vous verrez qu'il se revele diaboliquement efficace pour ce type de 
"protection".




-|- B. Sphinxor Crackme

----------------------------------------------------------------------------------------

crackme author : Sphinxor Crackme
type : VB + Name/Serial
level : 1

----------------------------------------------------------------------------------------

Comme a l'habitude, on analyse toujours avec PEiD l'executable, pour etre a peut pret sure
qu'il ne soit pas packé ou crypté auparavant.

PEiD est clair : Microsoft Visual Basic 5.0 / 6.0 

Donc pas d'inquietude apparement.

Nous allons utilisé Smartcheck, qui est un debugger VB qui date un pe maintenant, mais qui reste 
extrement efficace pour ce genre de crackme. 



Reversing :
-----------

Pour le parametrage de votre smartcheck, je vous conseil de lire le tutoral sur les crackmes ABEX. Je
ne vais donc pas revenir dessus.

une fois lancé dans smartcheck, j'y entre mon nom : 'thomas' et un serial bidon :'123456789'

"NOP THAT'S NOT IT." "TRY AGAIN."

voila a quoi ressemble ma vu sous smartcheck

Command1_Click
8344 Text1.Text
8375 Text2.Text
8391 Len(String:"thomas") returns LONG:6
8392 Mid(VARIANT:ByRef String:"thomas", long:1, VARIANT:Integer:1)
8396 Asc(String:"t") returns Integer:116
8405 Mid(VARIANT:ByRef String:"thomas", long:2, VARIANT:Integer:1)
8409 Asc(String:"h") returns Integer:104
8418 Mid(VARIANT:ByRef String:"thomas", long:3, VARIANT:Integer:1)
8422 Asc(String:"o") returns Integer:111
8431 Mid(VARIANT:ByRef String:"thomas", long:4, VARIANT:Integer:1)
8435 Asc(String:"m") returns Integer:109
8444 Mid(VARIANT:ByRef String:"thomas", long:5, VARIANT:Integer:1)
8448 Asc(String:"a") returns Integer:97
8457 Mid(VARIANT:ByRef String:"thomas", long:6, VARIANT:Integer:1)
8461 Asc(String:"s") returns Integer:115
8486 Len(String:"652") returns LONG:3
8487 Mid(VARIANT:ByRef String:"652", long:1, VARIANT:Integer:1)
8491 Asc(String:"6") returns Integer:54
8494 Chr(Integer:80)
8524 Mid(VARIANT:ByRef String:"652P", long:2, VARIANT:Integer:1)
8528 Asc(String:"5") returns Integer:53
8531 Chr(Integer:79)
8555 Mid(VARIANT:ByRef String:"652PO", long:3, VARIANT:Integer:1)
8559 Asc(String:"2") returns Integer:50
8562 Chr(Integer:76)
8606 Len(String:"±aß9-~...") returns LONG:29
8607 Mid(VARIANT:ByRef String:"±šß‹—?...", long:1, VARIANT:Integer:1)
8611 Asc(String:"±") returns Integer:177
...


Aucun CMP n'indique clairement le bon serial, de notre mauvais. On pourrait croire que la tache s'en trouve
compliqué mais pas du tout. IL suffit d'analyser la routine de generation du serial.


le crackme compte le nombre de caractere composant le nom : 
8391 Len(String:"thomas") returns LONG:6

Ensuite pour chaque lettre composant le nom il lui retourne sa valeur en decimal :
8392 Mid(VARIANT:ByRef String:"thomas", long:1, VARIANT:Integer:1)
8396 Asc(String:"t") returns Integer:116

t= 116
h= 104
o= 111
m= 109
a= 97
s= 115

Ensuite il additionne l'ensemble de ces valeurs decimals, indique le nombre de caracteres que cette valeur contient
8486 Len(String:"652") returns LONG:3

116 + 104 + 111 + 109 + 97 + 115 = 652  = 3 caracteres


La routine prend maintenant chaqu'un des caracteres de 652 et les converti a nouveau en decimal :

8491 Asc(String:"6") returns Integer:54

6 = 54
5 = 53
2 = 50

Et pour terminé, il ajoute 26 (qui semble etre une valeur fixe) et converti en Caractere : 
pou 54 = Chr(Integer:80) =  P  Qu'il ajoute a 652

Ce qui donne 652POL pour thomas. On test ça tout de suite .. et Bingo.

Bon , continuons sur du VB et faisons le KEYGEN de se crackme en VB.


----------------------------------------------------------------
Private Sub Command1_Click()
LONGUE = Len(Text1.Text)
If LONGUE < 0 Then

Text2.Text = "Le nom doit être supérieur à 0 caracteres"

Else

For i = 1 To LONGUE

ASCII = Asc(Mid$(Text1.Text, i, 1))

CODE = CODE + ASCII

Text2.Text = CODE

ASCII2 = Asc(Mid$(Text2.Text, 1))
ASCII3 = Asc(Mid$(Text2.Text, 2))
ASCII4 = Asc(Mid$(Text2.Text, 3))

CODES2 = Chr(Mid$(ASCII2, 1) + 26)
CODES3 = Chr(Mid$(ASCII3, 1) + 26)
CODES4 = Chr(Mid$(ASCII4, 1) + 26)

Text3.Text = Text2.Text + CODES2 + CODES3 + CODES4

Next i
End If
End Sub
-----------------------------------------------------------------

certe il est un peu merdique, mais il fonctionne !!:))



-|- C. Thx

A tout le chan #old-school sur irc.worldnet.net, Misto, Kyler, Goda, Azerty.. 

retrouvez sur http://thomas.openmod.org l'ensemble de mes tutos et ezines.

a+
thomas