EBFE
20.06.2009, 21:06
Ich möchte hier eine Word-List Beschreibungssprache samt Interpreter vorstellen ;)
WLML kann dazu benutzt werden, „Worteigenschaften“ zu beschreiben und sich Anhand der Beschreibung komplette Wörterbücher generieren zu lassen.Einsatz: überall da wo man über BF-Methoden nur wenige Versuche pro Sekunde hat und mit intelligenten Listen viel Zeit sparen kann.
Möglichkeiten: im Prinzip "unbegrenzt" (zumindest falls ich kein Feature vergessenen habe ;) ) - sollten aber auf jedenfall viel weiter als jegliche BF-Tool/Wordlistgenerator Masken gehen.
Syntax: relativ einfach gestrickt.
Es werden Variablen/Zeichenlisten/Konstanten definiert, miteinander verknüpft und letzendlich als
Password definiert.
Wobei Variablen nur der "schönheitshalber" als Platzhalter vorhanden sind und sowieso vor der Generierung aufgelöst werden (man kann direkt das Passwort definieren, nur die Übersicht leiden darunter). Kann man auch mit Funktionen in "normalen" Progrmamiersprachen vergleichen - da kann man auch alles in die Main-Funktion reinschreiben, nur wird es irgendwann unübersichtlich.
Weiteres sind nur Auszüge aus dem Manual ;)
Syntax: Auszug aus dem Manual(siehe selbiges für eine bessere Formatierung):
Datentypen
: Konstanten und Zeichenlisten
’ich bin eine konstante’
"ich bin eine Zeichenliste"
’hi’
"abcdefg" der Unterschied: Konstanten werden komplett ausgewählt, von den Zeichenlisten jedoch immer nur ein Zeichen genommen. Eine Zeichenliste ist damit nur eine verkürzte Schreibweise für eine ODER Verknüpfung mehrerer Konstanten:
"abc"
äquivalent:
’a’|’b’|’c’Escapesequenzen: für Konstanten (werden zwischen ' definiert) \'
für Zeichenlisten: \"
Bsp:
"ab\"c"
'Max\'s password'
Operationen
: UND,ODER,ZUWEISUNG
UND: + . & and
ODER: | or
Zuweisung: = :=Variablen
: werden mit define eingeleitet und können Ausdrücke zugewiesen bekommen:
define word1="abc"
define word2=’hi’|’hey’
define myword=word1+word2 Variablennamen beginnen immer mit einem Buchstaben und können Buchstaben, Ziffern, ’_’ oder ’-’ beinhalten.
main
: als von vielen Sprachen bekannte ’Main’ fungiert die Password Zuweisung
define word1=’hi’|’hey
password=word1
oder
PASS=’hallo’+"123" Eigenschaften
: werden zwischen ’[’ und ’]’ aufgelistet.
[min..max ,mixedcase, lowercase, uppercase]
min..max: wiederhole Abschnitt mindestens
’min’ und höchstens ’max’ Male
lowercase: konvertiere alles in Kleinbuchstaben
uppercase: gegenteil von lowercase
mixedcase: es sollen alle
Groß/Kleinschreibungmöglichkeiten
durchprobiert werden. Beispiele:
"abc"[2..3] : wiederhole a oder b oder c zwei bis drei mal
"abc"[1..2,mixedcase]: wiederhole a oder b oder c ein bis 2 male
und probiere Groß/Kleinschreibung durch
(’pass’+"1234567890"[2..2]): ’pass’ und zwei Ziffern: pass12,pass13 Klammern
: ’[ ]’,’< >’,’{ }’, ’( )’
[ ] : hier werden Optionen aufgezählt
( ) : Gruppierungsklammern. Bsp:
("abc"|"def")+(’hi’|’hey’)
< > : Uniqueklammern. Elemente, die hier drin
stehen, dürfen sich nicht wiederholen.
Dies gilt allerdings immer für das
’erste Level’ der Anweisungen. Daher sollte
man im Zweifelsfall Gruppierungsklammern nutzen.
Bsp:
<"12345"[5..5]> (5 Ziffern von 1 bis 5, wobei nur komplett
unterschiedliche Sequnezen erlaubt sind)
{ } eine Liste mit Elementen (durch Kommata getrennt), aus
denen alle möglichen Kombinationen gebildet werden
Bsp:
{’hello’,word2,word3}
Include
: Über include String kann man weitere Quelltextdateien einbinen:
include("stdinc.wlml")
include "stdinc.wlml"
include ’stdinc.wlml’
include "/incs/myinc.wlml"Listen einbinden
: Über file String kann man bestehende Wörterbücher einbinden:
define word=file ’wordlist.txt’
oder
define word=file "wordlist.txt"
define zusatz=’special’
password=word+zusatz Aus dem Wörterbuch wird dann jeweils ein Wort eingelesen und für die Generierung herangezogen. Äquivalente Darstellung - Wörter aus dem Wörterbuch im Quellcode direkt aufzuschreiben.
define word=’word1’ | ’word2’ | ’word3’ | ... Achtung: die Wörterbücher werden komplett in den Speicher eingelesen (20GB große Listen gehen also schon mal nicht).
Kommentare
: Kommentare werden entweder über # oder // eingeleitet und gelten immer bis zum Zeilenende:
#include("ich wurde auskommentiert")
define hello="abc" #|’hi
define hi=’hi’|’hey’|’moin’ //begrüßung
Beispiele:
HelloWorld:
define hello='Hello'
define world='World'
define end="?!."
password=hello+world+end
alternativ
password='HelloWorld'+"?!."
alternativ
password='HelloWorld'+('?'|'!'|'.')
Ausgabe:
HelloWorld?
HelloWorld!
HelloWorld.
Vergessenes Passwort: Passwort von einem RAR Archiv war z.B irgendwas mit ’FreE-hAck’, allerdings ist inzwischen unklar, ob der Bindestrich wirklich vorhanden war und natürlich weiß man die genaue Groß/Kleinschreibung nicht mehr.
#Zip Passwort mit FH:
#Muster: FrEe-hAcK oder fReEHaCk
#(zufällige groß/kleinschreibung, optionaler bindestrich)
include (’stdinc.wlml’)
define free=’free’
define bind=’-’[0..1]
define hack=’hack’
password=(free+bind+hack)[mixedcase]
Ausgabe:
freehack
freehacK
freehaCk
freehaCK
freehAck
...Oder:
passwort besteht aus 7 Zeichen, man weiß, es sind Buchstaben a,b,c,d,e,f,g,h
allerdings gibt es keine wiederholungen im Passwort (also keine "aabcd"/"abbbcd" usw Wörter).
In einem einfachen BF-Tool wären das 8^7 = 2 097 152 Passwörter
in WLML kann man es genau beschreiben:
#passwort hat länge 7 und besteht aus 8 unterschiedlichen zeichen
#allerdings ohne Widerholungen
define zeichen="abcdefgh"
password=<zeichen[7..7]>
#alternativ (viel schneller, aber syntaktisch nicht so gut lesbar)
#password=<{"ah","bh","ch","dh","eh","fh","gh"}>
und hat somit nur noch ~40 000 Wörter in der Liste. Bei einem TC Volume, bei dem man nur 5 P/s hat, sind es 2 Std BF statt 5 Tage ;)
lange Passwörtersequenzen:
#in einem sehr langen passwort wurde in der Mitte die Ziffersequenz vergessen
#vermutung: 4-5 Ziffern, die sich nicht widerholen
#bei einfachem BF würde man 110 000 Kombos durchprobieren,
#gegenüber 35000 (wenn man die "Ziffern wiederholen sich nicht" Bedingung
#miteinbringt).
include ('stdinc.wlml')
define const='ich bin ein sehr sehr langes passwort'
define varpart=<digits[4..5]>
define const2='ich bin das Ende eines langen Passworts'
password=const+varpart+const2Bestehende Wordlisten nutzen geht auch:
#nimm ein Wort aus der Wordlist und füge eine Ziffer hinzu
include (’stdinc.wlml’)
define word=file ’wordlist.txt’
define end="1234"
password=word+endallerdings werden Wordlisten komplett in den Speicher eingelesen - man kann also keine 20GB Listen nutzen (die ich sowieso für
unsinnige halte ;) )
Vordefiniertes: stdinc.wlml bietet Variablen A-Z, a-z und digits (Zeichen A bis Z in groß/klein und Ziffern 1 bis 9)
Ansprechbar über
include "stdinc.wlml"
define myword=A-Z[1..4]
password=myword+'ichbinfest'
Konsole: der Interpreter läuft im Konsolenmodus und bietet mehrere Befehle an (einfach HELP oder ? eingeben). Wichtigste:
compile"datei.wlml" - kompiliert die Datei und liefert eventuell Fehlermeldungen
test - generiert testweise mehrere Passwörter, so dass man sehen kann, ob diese richtig aufgebaut werden
genlist "wordlist.txt" - generiert eine komplette Liste und speichert sie unter dem angegebenen Namen.
Starten der Konsole: Linuxer&Co brauchen noch SWI-Prolog (z.B http://sewiki.iai.uni-bonn.de/service/knowhow/installlatestswiprologasdeb/start)
In der Prolog-Console "consult(cmd)." eingeben.
Windowsuser können start.bat nutzen oder SWI-Prolog installieren und manuell starten "consult(cmd)."
Fehlermeldungen: ich habe zwar versucht, möglichst viele Fehler abzudecken und detailierte Meldungen auszugeben, allerdings sollte man es nicht mit einer VB/VC# Compiler verwechseln ;). Notfalls wird eben die Zeile ausgegeben, ab der der Interpreter nicht weiter kommt.
Manual: liegt im HTML und im PDF Format.
Plattformen: Windows, Mac, Linux
ToDo:
- der Befehl "test" im Interpreter soll noch eine geschätzte Anzahl an Wörtern ausgeben.
Begründete Kritik, Feedback und Anregungen willkommen :)
PS:Source für das komplette Projekt liegt natürlich bei.
Update: Manual um Escapesequenzen erweitert, paar WLML Beispiele hinzugefügt
Update2: Nun können bestehende Wordlisten eingebunden werden (und damit z.B modifiziert).
Manual+Beispielcodes updated
Update3: Manual komplett neu geschrieben, mehrere Optimierungen und einige Sprachfeatures hinzugefügt. Installationsskripte für Linux/Windows beigelegt. Interpreter lässt sich nun mit Quellcodedateien verknüpfen (Doppelklickausführung).
Manual (in verschiedenen Foramten ;)) ) sowie der Interpreter:
Edit: da die ebfe.de.vu Domain abused wurde, sollte erstmal die Mirroralternative genutzt werden.
http://ebfe.de.vu/wlml.zip
http://ebfe.de.vu/manual.pdf
http://ebfe.de.vu/manual.dvi (http://ebfe.de.vu/manual.div)
http://ebfe.de.vu/manual.ps
mirror:
http://ebfe00.eb.funpic.de/
WLML kann dazu benutzt werden, „Worteigenschaften“ zu beschreiben und sich Anhand der Beschreibung komplette Wörterbücher generieren zu lassen.Einsatz: überall da wo man über BF-Methoden nur wenige Versuche pro Sekunde hat und mit intelligenten Listen viel Zeit sparen kann.
Möglichkeiten: im Prinzip "unbegrenzt" (zumindest falls ich kein Feature vergessenen habe ;) ) - sollten aber auf jedenfall viel weiter als jegliche BF-Tool/Wordlistgenerator Masken gehen.
Syntax: relativ einfach gestrickt.
Es werden Variablen/Zeichenlisten/Konstanten definiert, miteinander verknüpft und letzendlich als
Password definiert.
Wobei Variablen nur der "schönheitshalber" als Platzhalter vorhanden sind und sowieso vor der Generierung aufgelöst werden (man kann direkt das Passwort definieren, nur die Übersicht leiden darunter). Kann man auch mit Funktionen in "normalen" Progrmamiersprachen vergleichen - da kann man auch alles in die Main-Funktion reinschreiben, nur wird es irgendwann unübersichtlich.
Weiteres sind nur Auszüge aus dem Manual ;)
Syntax: Auszug aus dem Manual(siehe selbiges für eine bessere Formatierung):
Datentypen
: Konstanten und Zeichenlisten
’ich bin eine konstante’
"ich bin eine Zeichenliste"
’hi’
"abcdefg" der Unterschied: Konstanten werden komplett ausgewählt, von den Zeichenlisten jedoch immer nur ein Zeichen genommen. Eine Zeichenliste ist damit nur eine verkürzte Schreibweise für eine ODER Verknüpfung mehrerer Konstanten:
"abc"
äquivalent:
’a’|’b’|’c’Escapesequenzen: für Konstanten (werden zwischen ' definiert) \'
für Zeichenlisten: \"
Bsp:
"ab\"c"
'Max\'s password'
Operationen
: UND,ODER,ZUWEISUNG
UND: + . & and
ODER: | or
Zuweisung: = :=Variablen
: werden mit define eingeleitet und können Ausdrücke zugewiesen bekommen:
define word1="abc"
define word2=’hi’|’hey’
define myword=word1+word2 Variablennamen beginnen immer mit einem Buchstaben und können Buchstaben, Ziffern, ’_’ oder ’-’ beinhalten.
main
: als von vielen Sprachen bekannte ’Main’ fungiert die Password Zuweisung
define word1=’hi’|’hey
password=word1
oder
PASS=’hallo’+"123" Eigenschaften
: werden zwischen ’[’ und ’]’ aufgelistet.
[min..max ,mixedcase, lowercase, uppercase]
min..max: wiederhole Abschnitt mindestens
’min’ und höchstens ’max’ Male
lowercase: konvertiere alles in Kleinbuchstaben
uppercase: gegenteil von lowercase
mixedcase: es sollen alle
Groß/Kleinschreibungmöglichkeiten
durchprobiert werden. Beispiele:
"abc"[2..3] : wiederhole a oder b oder c zwei bis drei mal
"abc"[1..2,mixedcase]: wiederhole a oder b oder c ein bis 2 male
und probiere Groß/Kleinschreibung durch
(’pass’+"1234567890"[2..2]): ’pass’ und zwei Ziffern: pass12,pass13 Klammern
: ’[ ]’,’< >’,’{ }’, ’( )’
[ ] : hier werden Optionen aufgezählt
( ) : Gruppierungsklammern. Bsp:
("abc"|"def")+(’hi’|’hey’)
< > : Uniqueklammern. Elemente, die hier drin
stehen, dürfen sich nicht wiederholen.
Dies gilt allerdings immer für das
’erste Level’ der Anweisungen. Daher sollte
man im Zweifelsfall Gruppierungsklammern nutzen.
Bsp:
<"12345"[5..5]> (5 Ziffern von 1 bis 5, wobei nur komplett
unterschiedliche Sequnezen erlaubt sind)
{ } eine Liste mit Elementen (durch Kommata getrennt), aus
denen alle möglichen Kombinationen gebildet werden
Bsp:
{’hello’,word2,word3}
Include
: Über include String kann man weitere Quelltextdateien einbinen:
include("stdinc.wlml")
include "stdinc.wlml"
include ’stdinc.wlml’
include "/incs/myinc.wlml"Listen einbinden
: Über file String kann man bestehende Wörterbücher einbinden:
define word=file ’wordlist.txt’
oder
define word=file "wordlist.txt"
define zusatz=’special’
password=word+zusatz Aus dem Wörterbuch wird dann jeweils ein Wort eingelesen und für die Generierung herangezogen. Äquivalente Darstellung - Wörter aus dem Wörterbuch im Quellcode direkt aufzuschreiben.
define word=’word1’ | ’word2’ | ’word3’ | ... Achtung: die Wörterbücher werden komplett in den Speicher eingelesen (20GB große Listen gehen also schon mal nicht).
Kommentare
: Kommentare werden entweder über # oder // eingeleitet und gelten immer bis zum Zeilenende:
#include("ich wurde auskommentiert")
define hello="abc" #|’hi
define hi=’hi’|’hey’|’moin’ //begrüßung
Beispiele:
HelloWorld:
define hello='Hello'
define world='World'
define end="?!."
password=hello+world+end
alternativ
password='HelloWorld'+"?!."
alternativ
password='HelloWorld'+('?'|'!'|'.')
Ausgabe:
HelloWorld?
HelloWorld!
HelloWorld.
Vergessenes Passwort: Passwort von einem RAR Archiv war z.B irgendwas mit ’FreE-hAck’, allerdings ist inzwischen unklar, ob der Bindestrich wirklich vorhanden war und natürlich weiß man die genaue Groß/Kleinschreibung nicht mehr.
#Zip Passwort mit FH:
#Muster: FrEe-hAcK oder fReEHaCk
#(zufällige groß/kleinschreibung, optionaler bindestrich)
include (’stdinc.wlml’)
define free=’free’
define bind=’-’[0..1]
define hack=’hack’
password=(free+bind+hack)[mixedcase]
Ausgabe:
freehack
freehacK
freehaCk
freehaCK
freehAck
...Oder:
passwort besteht aus 7 Zeichen, man weiß, es sind Buchstaben a,b,c,d,e,f,g,h
allerdings gibt es keine wiederholungen im Passwort (also keine "aabcd"/"abbbcd" usw Wörter).
In einem einfachen BF-Tool wären das 8^7 = 2 097 152 Passwörter
in WLML kann man es genau beschreiben:
#passwort hat länge 7 und besteht aus 8 unterschiedlichen zeichen
#allerdings ohne Widerholungen
define zeichen="abcdefgh"
password=<zeichen[7..7]>
#alternativ (viel schneller, aber syntaktisch nicht so gut lesbar)
#password=<{"ah","bh","ch","dh","eh","fh","gh"}>
und hat somit nur noch ~40 000 Wörter in der Liste. Bei einem TC Volume, bei dem man nur 5 P/s hat, sind es 2 Std BF statt 5 Tage ;)
lange Passwörtersequenzen:
#in einem sehr langen passwort wurde in der Mitte die Ziffersequenz vergessen
#vermutung: 4-5 Ziffern, die sich nicht widerholen
#bei einfachem BF würde man 110 000 Kombos durchprobieren,
#gegenüber 35000 (wenn man die "Ziffern wiederholen sich nicht" Bedingung
#miteinbringt).
include ('stdinc.wlml')
define const='ich bin ein sehr sehr langes passwort'
define varpart=<digits[4..5]>
define const2='ich bin das Ende eines langen Passworts'
password=const+varpart+const2Bestehende Wordlisten nutzen geht auch:
#nimm ein Wort aus der Wordlist und füge eine Ziffer hinzu
include (’stdinc.wlml’)
define word=file ’wordlist.txt’
define end="1234"
password=word+endallerdings werden Wordlisten komplett in den Speicher eingelesen - man kann also keine 20GB Listen nutzen (die ich sowieso für
unsinnige halte ;) )
Vordefiniertes: stdinc.wlml bietet Variablen A-Z, a-z und digits (Zeichen A bis Z in groß/klein und Ziffern 1 bis 9)
Ansprechbar über
include "stdinc.wlml"
define myword=A-Z[1..4]
password=myword+'ichbinfest'
Konsole: der Interpreter läuft im Konsolenmodus und bietet mehrere Befehle an (einfach HELP oder ? eingeben). Wichtigste:
compile"datei.wlml" - kompiliert die Datei und liefert eventuell Fehlermeldungen
test - generiert testweise mehrere Passwörter, so dass man sehen kann, ob diese richtig aufgebaut werden
genlist "wordlist.txt" - generiert eine komplette Liste und speichert sie unter dem angegebenen Namen.
Starten der Konsole: Linuxer&Co brauchen noch SWI-Prolog (z.B http://sewiki.iai.uni-bonn.de/service/knowhow/installlatestswiprologasdeb/start)
In der Prolog-Console "consult(cmd)." eingeben.
Windowsuser können start.bat nutzen oder SWI-Prolog installieren und manuell starten "consult(cmd)."
Fehlermeldungen: ich habe zwar versucht, möglichst viele Fehler abzudecken und detailierte Meldungen auszugeben, allerdings sollte man es nicht mit einer VB/VC# Compiler verwechseln ;). Notfalls wird eben die Zeile ausgegeben, ab der der Interpreter nicht weiter kommt.
Manual: liegt im HTML und im PDF Format.
Plattformen: Windows, Mac, Linux
ToDo:
- der Befehl "test" im Interpreter soll noch eine geschätzte Anzahl an Wörtern ausgeben.
Begründete Kritik, Feedback und Anregungen willkommen :)
PS:Source für das komplette Projekt liegt natürlich bei.
Update: Manual um Escapesequenzen erweitert, paar WLML Beispiele hinzugefügt
Update2: Nun können bestehende Wordlisten eingebunden werden (und damit z.B modifiziert).
Manual+Beispielcodes updated
Update3: Manual komplett neu geschrieben, mehrere Optimierungen und einige Sprachfeatures hinzugefügt. Installationsskripte für Linux/Windows beigelegt. Interpreter lässt sich nun mit Quellcodedateien verknüpfen (Doppelklickausführung).
Manual (in verschiedenen Foramten ;)) ) sowie der Interpreter:
Edit: da die ebfe.de.vu Domain abused wurde, sollte erstmal die Mirroralternative genutzt werden.
http://ebfe.de.vu/wlml.zip
http://ebfe.de.vu/manual.pdf
http://ebfe.de.vu/manual.dvi (http://ebfe.de.vu/manual.div)
http://ebfe.de.vu/manual.ps
mirror:
http://ebfe00.eb.funpic.de/