ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

14.01.2009, 00:37
|
|
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
Провел на форуме: 12702287
Репутация:
4738
|
|
2procedure
Вообщем я уже порядком запарился в вордлистами (сортировать, удалять повторы, склеивать и т.д.) а посути нужна всего одна хорошая утилитка!
Вообщем суть в следующем:
Имеем 1 файл (больший и основной) упорядоченного словаря (длина, символ, ну вообщем по второму варианту в твоей проге), без повторов слов (строк).
Есть втрой файл-словарь с новыми паролями, надо сделать их слияние в 1 файл (основной). Естественно он должен получится тоже без повторов и упорядоченным.
Кроме того должна быть допустима работа с большими словарями (500Мб-2,5Гб.) ну это скорее всего больше относится к 1 файлу, апгрейдим мы словарь обычно меньшими по объёму словарями. Вообщем алгоритм я попробовал реализовать на PHP, суть его будет понятна из кода и основан он на вставке данных в нужное место файла, тоже самое можно сделать и на C++ или на другом компелируемом языке, скорость работы существенно возрастёт.
Ну вообщем сам скрипт:
PHP код:
<?
// Скрипт для слияния файлов словарей
//Слияние происходит следующим образом:
//Строки (слова) из файла $f_into добавляются в соответсвующие позиции файла $f_out, повторы исключаются
//Скрипт использует только исходные файлы (не создаёт дополнительных)
//и настраеваемый буфер памяти $len_buffer (может работать с большими файлами и при маленьком кол. оперативы.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$f_into="pass.txt"; // имя внедряемого файла словаря (не обязательно сортирован)
$f_out="D:\all_pass.txt"; // имя выходного файла словаря (должен быть отсортирован)
$f_in=fopen($f_into,"r"); // открвываем файл внедряемого словаря
if (!$f_in) echo "Не найден внедряемый файл словаря.!<br>";
$f_ou=fopen($f_out,"r+"); // открвываем выходной файл словаря
if (!$f_ou) echo "Не найден выходной файл словаря!<br>";
$s1=""; // предыдущее к вставляемому слово в выходном файле
$s2=fgets($f_ou); // последующие слово после вставляемого
$s2=substr($s2, 0, strlen($s2)-2); // отрезаем два байта перевод строки и возврат каретки
$len_buffer=100000; // длинна буфера памяти в байтах
while (!feof($f_in)) // пока не достигнут конец внедряемого файла делаем
{
$s=fgets($f_in); // вставляемое слово
$s=substr($s, 0, strlen($s)-2); // режем лишнее
$fsize=filesize($f_out); // получаем начальный размер выходного файла словаря
while (!feof($f_ou)) // пока не достигнут конец выходного файла делаем
{
$s1=$s2;
$s2=fgets($f_ou);
$s2=substr($s2, 0, strlen($s2)-2);
$h=strcmp("$s1","$s"); //сравниваем всавляемое слово с предыдущим
$l=strcmp("$s","$s2"); //сравниваем всавляемое слово с последующим
if ($s1===$s) break; //если слово есть в словаре, то заканчиваем поиск мества вставки
if ($h<=-1 and $l<=-1) break; //если место вставки найдено, то заканчиваем поиск (кстати можно применить метод деления пополам)
};
if ($s1!=$s and $s!="") // если слова нет в словаре, то добавляем
{
fseek($f_ou,-strlen($s2)-2,SEEK_CUR); // смещаем указатель на начало последующего слова за $s
$tek_pos=ftell($f_ou);
//echo "[".$h."][".$s1."]<[".$s."]<br>";
//echo "[".$l."][".$s."]<[".$s2."]<br>";
echo "Текущая позиция:".$tek_pos."<br>";
echo "Проверка:".$s1."__".$s."__".$s2."<br>Длинна вставляемого слова: ".strlen($s)."<br>";
$n=floor(($fsize-$tek_pos)/$len_buffer); //вычисляем необходимое количество циклов смещения блоков
$new_tek_pos=$n*$len_buffer-2; //вычисляем позицию 1-го копируемого блока данных относительно текущего указателя
//echo "Смещение:".$new_tek_pos."<br>";
fseek($f_ou,$new_tek_pos,SEEK_CUR); //устанавливаем указатель в начало 1 блока
for ($i=$n; $i-->=0;)
{
//echo "Позиция начала копируемого блока до чтения: ".ftell($f_ou)."<br>";
$data=fread($f_ou,$len_buffer); //читаем 1 блок данных
$dseek=strlen($data); // длинна прочитанных данных.
//echo "Позиция начала копируемого блока после чтения: ".ftell($f_ou)."<br>";
//echo "Длинна прочитанных данных.:".$dseek."<br>";
fseek($f_ou,-$dseek+strlen($s)+2,SEEK_CUR); // устанавливаем указатель в начало блока со смещением на запись
//echo "Позиция начала копируемого блока перед записью: ".ftell($f_ou)."<br>";
fwrite($f_ou,$data); //пишем в файл блок со смещением.
fseek($f_ou,-strlen($data),SEEK_CUR); // устанавливаем указатель в начало блока со смещением на запись
//echo "Позиция начала копируемого блока после записи: ".ftell($f_ou)."<br>";
fseek($f_ou,-$len_buffer-strlen($s)-2,SEEK_CUR);
//echo "Число циклов сдвигов: ".$i."<br>";
}
fseek($f_ou,-strlen($s),SEEK_CUR);
echo "Позиция для вставки строки: ".ftell($f_ou)."<br>---------------------------------------<br>";
fwrite($f_ou,$s."\r\n");
fclose($f_ou); // фиксируем изменения на физическом диске
$f_ou=fopen($f_out,"r+"); // открвываем выходной файл словаря снова
}
}
fclose($f_ou); // закрываем файлы
fclose($f_in);
?>
Словари для теста:
all_pass.txt - начальный.
Код:
!
!!!
!!!!
!!!!!
!!!!!!
!!!!!!!!!!
!!!@@@###
!!!RONY!!!
!!xxx!!
!"?123qwe
!$)&!(*(
!%$#
!(*)
!041470
!2344321
!2345
!2345q
!247spyz
!@#$
!@#$%
!@#$%QWE
!@#$%QWER
!@#$%^
!@#$%^&*()_+
!@#$%q
!@#qwe
добавляемый pass.txt
Код:
!!!!!2
!!!!!5
!!yyy!!
!!!!1
Должно получится на выходе:
all_pass.txt
Код:
!
!!!
!!!!
!!!!!
!!!!!!
!!!!!!!!!!
!!!!!2
!!!!!5
!!!!1
!!!@@@###
!!!RONY!!!
!!xxx!!
!!yyy!!
!"?123qwe
!$)&!(*(
!%$#
!(*)
!041470
!2344321
!2345
!2345q
!247spyz
!@#$
!@#$%
!@#$%QWE
!@#$%QWER
!@#$%^
!@#$%^&*()_+
!@#$%q
!@#qwe
Прошу затестить на Ваших больших словарях (обратите внимание на требования к файлу all_pass.txt)
P.S. Сильно не бейте за код  Чтоб ускорить работу скрипта с большими файлами, старайтесь ставить размер буфера максимально возможным, при котором нет ошибки нехватки памяти...
P.P.S. 2Procedure, если перепишеш на С++ это дело буду очень признателен  (появился всё же  )
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|