Привет, хацкер! В Инете есть куча готовых
wordlist’ов, но если тебе известны интересы
твоей жертвы (какие книжки читает, какое
кино смотрит и т.п.), то процесс ломки его
пароля можно ускорить. А если тебе ещё и
удалось достать часть его пароля (на
обрывке бумаги, методом прямого наблюдения
и т.п.) - моя прога окажет тебе неоценимую
услугу по улучшению wordlist’a. А уж прог,
которые помогут тебе его поюзать, в Инете
полно 😉
Итак, алгоритм стар как мир: берём книжку,
которую читает чел и прогоняем через эту
прогу. Прога генерит список
неповторяющихся слов. Если часть пароля
известна, третьим аргументом командной
строки (прога консольная) вводится маска,
иначе - генерится полный wordlist. Например,
если у чела пароль “хакер”, а ты засёк
только “ха” и то, что набрано 5 букв, то
командная строка будет выглядеть так:
wordlist.exe book.txt ха???
Вот исходник:
//-----
#pragma hdrstop
#pragma argsused
//-----
#include <classes.hpp>
#include <stdio.h>
#include <conio.h>
#include <string.h>
//-----
TStringList *wordlist = new TStringList();
FILE *fin, *fout;
char temp[255];
//-----
/* Функция сравнения строки с маской */
bool compare(AnsiString str1, AnsiString str2)
{
/* Если длина совпадает */
if(str1.Length()==str2.Length())
{
/* Приступаем к посимвольному сравнению */
for(int i=1; i<=str2.Length(); i++)
{
/* Если в маске не символ "любая буква" -
сравниваем */
if(str2[i]!='?')
/* Если хоть один символ не совпал - не
совпало слово полностью */
if(str1[i]!=str2[i]) return false;
}
/* Если дошли до этой строки - совпали все
символы */
return true;
}
/* Если дошли до этой строки - не совпала
длина слова и маски */
return false;
}
//-----
void main(int argc, char* argv[])
{
/* Имя файла - первый аргумент командной
строки */
if( (fin = fopen(argv[1], "rt")) == NULL)
{
printf("File not found !\n");
exit(EXIT_FAILURE);
}
else
{
/* Читаем файл пословно (разделитель - пробел)
*/
while( (fscanf(fin, "%s", &temp)) != EOF)
{
AnsiString word = temp;
bool notready=true;
int index = 0;
while(notready)
{
/* Если находим в слове один из символов
"().,:;!?_
то удаляем его и просматриваем слово с
начала.
Это необходимо для удаления "приаттаченных"
к слову
символов, иначе слово в конце предложения с
точкой,
например, будет воспринято как новое слово
и
добавлено в wordlist.
*/
if(word.IsDelimiter("\"().,:;!?_", index))
{
word.Delete(index, 1);
index = 0;
}
else
{
if(word.Length() == index) notready = false;
index++;
}
}
/* Если слова нет в словаре */
if(wordlist->IndexOf(word) == (-1))
{
if(argc > 2) /* Если задана маска */
{
/* и слово совпало с маской - добавляем его */
if(compare(word, argv[2])) wordlist->Add(word);
}
else /* иначе просто добавляем его (полный wordlist)
*/
wordlist->Add(word);
/* Индикатор генерации wordlist'a */
clrscr();
gotoxy(10, 8); printf("Press any key to stop wordlist generation.");
gotoxy(10, 10); printf("Wordlist contains %d unique words.",
wordlist->Count);
gotoxy(10, 11); printf("Last added word: %s", word.c_str());
/* Нажатие любой кнопки - выход с записью
того, что уже накопали 🙂 */
if(kbhit()) break;
}
}
/* Запись готового wordlist'a. */
if( (fout = fopen("wordlist.txt", "wt")) == NULL)
{
printf("Unable to create output file !\n");
exit(EXIT_FAILURE);
}
else
{
int index = 0;
while(index < wordlist->Count)
{
fputs((wordlist->Strings[index] + "\n").c_str(), fout);
index++;
}
}
}
}
//-----
Часто пароль бывает на транслите, поэтому
готовый wordlist можно пропустить через всем
известную прогу "Штирлиц" (кстати, в
нём поддерживается несколько разных
кодировок транслита).
Есть ограничение: кодировка входного
файла должна быть DOS (из-за того, что
используются “старые” функции стандарта
ANSI C), но “Штирлиц” тебе и тут поможет.
P.S. Кстати, если ты любитель отгадывать
кроссворды или писать стихи, то эта прога
также тебе поможет в этом весёлом деле 🙂