Brute Force

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Brute Force

Message par Dr. Dri »

J'ai bien l'intention de passer régulièrement sur le forum et pour mon retour je propose un petit code sympa.

Il est 4h et j'attends la fin de l'exécution d'un programme que j'aimerai bien pouvoir fermer et relancer là où il en est quand je rallumerai ma machine. Le programme tourne depuis déjà 3h32, je pense qu'il va continuer pendant mon sommeil.

Comme cette situation a commencé à m'ennuyer rapidement j'ai décidé en parralèle d'installer PB et de coder quelque chose qui pourrait être interrompu puis repris plus tard. Et j'ai choisi pour ça le thème de la force brutte, qui implique souvent des temps d'exécution énormes (par exemple de l'ordre de la semaine).

J'ai donc fait une fonction qui cherche toutes les combinaisons possibles selon quelques règles. Il faut spécifier la taille de la clé et les caractères susceptibles d'appartenir à la clé. Enfin on peut partir d'une clé (complète ou partielle) sans que ça ne pose de problème à la fonction (justement c'est le but). Même s'il faut spécifier une taille, la fonction est tout à fait adaptée à la recherche de clé de taille variable.

La fonction n'est pas optimisée et ne vérifie pas les erreurs possibles. D'ailleurs il vaut mieux vérifier les éventuelles erreurs avant de lancer le traitement qui lui n'est pas censé mener à une erreur.

Code : Tout sélectionner

Procedure.s BruteForceNext(Key.s, Size.l, Charset.s)
  Protected Partial.l, Pos.l
  
  If Len(Key) < Size
    Partial = #True
  ElseIf Len(Key) > Size Or Len(Charset) <= 1
    Key = #NULL$
  EndIf
  
;   If Key And Not Partial
;     While Right(Key, 1) = Right(Charset, 1)
;       Key = Left(Key, Len(Key)-1)
;     Wend
;   EndIf
  
  If Key And Not Partial
    rKey.s = Right(Key, 1)
    rSet.s = Right(Charset, 1)
    While rKey = rSet
      Key = Left(Key, Len(Key)-1)
      rKey.s = Right(Key, 1)
    Wend
  EndIf
  
  If Key And Not Partial
    Pos = FindString(Charset, Right(Key, 1), 1) + 1
    Key = Left(Key, Len(Key)-1) + Mid(Charset, Pos, 1)
  EndIf
  
  If Key Or Partial
    While Len(Key) < Size
      Key + Left(Charset, 1)
    Wend
  EndIf
  
  ProcedureReturn Key
EndProcedure
Il y a un bloc de code commenté, il correspond au bloc du dessous sauf qu'il fait retourner une mauvaise à la fonction pour une raison que j'ignore. Je n'ai pas encore testé sous windows donc c'est pour le moment un bug de PB à vérifier.

Un premier exemple d'utilisation :
Une recherche pure et simple de toutes les combinaisons

Code : Tout sélectionner

Key.s = ""

Repeat
  Key = BruteForceNext(Key, 3, "abc")
  Debug Key
Until Not Key
Un second exemple :
Une recherche qui se stoppe après les dix premiers et qui reprend ensuite

Code : Tout sélectionner

Key.s = ""
Cpt.l = 0

Repeat
  Key = BruteForceNext(Key, 3, "abc")
  Cpt + 1
  Debug Key
Until Cpt = 10

Debug "---"

Repeat
  Key = BruteForceNext(Key, 3, "abc")
  Debug Key
Until Not Key
Un dernier exemple qui cherche une clé sans en connaître la taille

Code : Tout sélectionner

;amusez vous à changer les constantes pour trouver les deux clés
#min = 2
#max = 5
#charset$ = "abc"

;Une clé entre #min et #max caractères
MD5.s = "406DDA4551329127687A3534E3DE7882" ;clé trouvable
;MD5.s = "7A2CCCE9642FE8539673002DD6660BA2" ;clé introuvable
;MD5.s = "3F469E9EED880B7436CFF29A3C11325B" ;clé introuvable

;Algo de recherche
For i = #min To #max
  
  Key.s = ""
  
  Repeat
    Key = BruteForceNext(Key, i, #charset$)
    
    If UCase( MD5Fingerprint(@Key, i) ) = MD5
      Break 2
    EndIf
  Until Not Key
  
Next i

If Key
  Debug "La clé été trouvée : " + Key
Else
  Debug "La clé n'a pas été trouvée"
EndIf
[edit]
le md5 est en majuscule sous linux et en minuscule sous windows, j'ai modifié la source pour le prendre en compte.

le bloc commenté ne bug pas sous windows, quelqu'un a la dernière beta sous linux pour vérifier si ca fonctionne ?

Dri :D
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Tiens Dri, tu sais pas ce qu'il est devenu LeWorgle?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Ollivier a écrit :Tiens Dri, tu sais pas ce qu'il est devenu LeWorgle?
ce nom me dit quelquechose mais j'arrive pas à mettre le doigt dessus

Dri :?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ben oui Dr Dri, on discutait ensemble en 2002, sur le forum de DB. J'en connais plusieurs ici: moi c'était Skritch. Je ne sais pas si tu te souviens. Il y avait LeWorgle aussi et je passe tout ceux qui ont 'migré' sans changer de pseudos. J'avais posté 2, 3 procédures, notamment le dégradé multiple. Et j'aimais bien ce gars : seulement, j'ai du m'absenter maintes fois plusieurs mois durant, alors je l'ai plus revu...

Sinon, à quoi peut servir ton appli ci-dessus concrètement? Je vois bien que c'est défonce-tout mais est-ce bien utile d'avoir un défonce-tout sous la main ?!? C'est quand tu perds un mot de passe ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Ca peut servir a faire le mal si on glisse du côté obscur :P

Ca peut aussi illustrer une recherche de toute les combinaisons sans avoir recours à la récursivité. La fonction est capable de trouver la combinaison suivante rien qu'en se basant sur celle actuelle, ca permet donc de tester les combinaisons en plusieurs fois sans avoir besoin de repartir du début.

Là j'utilise des chaînes mais ca peut se généraliser à n'importe quel type, avec un tableau, une liste etc. On peut aussi partir de cette fonction pour voir comment l'optimiser, y'a un tas de choses faisable pour vraiment la booster à mort!

Enfin l'utilisation saine du crack, c'est quand même d'essayer de cracker ses propres programmes. Avec un brute force on peut estimer le temps que prendrait le crack de son appli par exemple.

Au final on poste des sources innofensives sur le forum et chacun en fait ce qu'il veut, sachant qu'il n'y a pas besoin de grand chose pour faire un programme malveillant (un truc qui s'amuse à supprimer des fichiers par exemple)

Dri
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

tu croie que c'est possible d'utilisé cette fonction mais pour des fichiers zip et rar ?


@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Bien sûr!
Si tu as une routine pour décompresser du zip (ou un fichier dll, ou un programme en ligne de commande) tu peux utiliser la fonction pour tester les clés une par une et qui lance la décompression. Tu laisses tourner jusqu'à ce que tu n'ai pas de retour d'erreur et le tour est joué. Si le programme est éteint tu peux enregistré la dernière clé testée dans un fichier pref ou autre selon affinités.

Dri
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

ouai ok merci on verra sa plus tard :D deja j'essaierais de faire un programme pour dezipper apres on verra :wink: .


@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

venom a écrit :tu croie que c'est possible d'utilisé cette fonction mais pour des fichiers zip et rar ?


@++
Winrar (et Winzip aussi sûrement) est utilisable en ligne de commande. J'avais fait il y a quelques années un cracker de mot de passe (que je n'avais pas mis sur le forum, de peur que ce soit mal vu, ce que j'aurais compris).
Le principe était proche de la routine de Dri, sauf qu'on lancait la commande pour désarchiver avec un RunProgram(), et il fallait ensuite vérifier si les fichiers avaient été créés. En effet, si on ne faisait pas cette vérification, l'algo continuait, et le test avec le mot de passe suivant "écrasait" le dossier de destination, avec les fichiers...

Ca marchait assez rapidement avec les archives de test que j'avais créées moi-même... mais je n'ai jamais réussi à désarchiver le fichier qui m'avait poussé à écrire une telle application (avec un mot de passe de plus de 9 caractères, j'ai jamais eu la patience d'attendre les résultats).
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

bon grace a la lib de gnozal j'arrive a dézipper avec mots de passe :wink: c'est deja pas mal :D .

mais je n'arrive pas encore a extraire grace a une liste de numero :? .
je sais jute dezipper en maittant le bon passe .

exemple:
crée un zip avec un mot de passe et essayer de le dezipper

Code : Tout sélectionner

MyZIP.s = OpenFileRequester("ouvrir votre zip", "", "Fichiers Zip|*.zip", 0)
MyZIPOutPut.s = SaveFileRequester("enregistrer votre extraction", "", "Fichiers |*.*", 0)
PureZIP_SetArchivePassword("1234");<------- le mot de passe a metre
PureZIP_ExtractFiles(MyZIP, "*.*", MyZIPOutPut, #True)
.
voila



@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre