ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Расшифровка хешей
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 14.01.2009, 00:37
-=lebed=-
Флудер
Регистрация: 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($s20strlen($s2)-2); // отрезаем два байта перевод строки и возврат каретки
    
$len_buffer=100000// длинна буфера памяти в байтах 
while (!feof($f_in)) // пока не достигнут конец внедряемого файла делаем 
    
{
    
$s=fgets($f_in); // вставляемое слово
    
$s=substr($s0strlen($s)-2); // режем лишнее
    
$fsize=filesize($f_out); // получаем начальный размер выходного файла словаря
    
while (!feof($f_ou)) // пока не достигнут конец выходного файла делаем 
        
{
        
$s1=$s2;
        
$s2=fgets($f_ou);
        
$s2=substr($s20strlen($s2)-2);
        
$h=strcmp("$s1","$s"); //сравниваем всавляемое слово с предыдущим
        
$l=strcmp("$s","$s2"); //сравниваем всавляемое слово с последующим
        
if ($s1===$s) break; //если слово есть в словаре, то заканчиваем поиск мества вставки 
        
if ($h<=-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, если перепишеш на С++ это дело буду очень признателен (появился всё же )
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со словарями ProTeuS Болталка 11 10.03.2010 11:26
нужна работа! zl0byte О Работе 2 27.12.2008 13:15
Юмор: Кто сказал что у админов халявная работа? silveran Болталка 7 21.07.2007 02:37
Работа в сотрудничестве msobolev О Работе 0 03.02.2007 22:25



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ