Программное средство для аудита паролей в информационных системах

 

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ








ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА

Тема дипломного проекта

ПРОГРАММНОЕ СРЕДСТВО ДЛЯ АУДИТА ПАРОЛЕЙ В ИНФОРМАЦИОННЫХ СИСТЕМАХ

Специальность 090106 - Информационная безопасность телекоммуникационных систем



Исполнитель ВКР И.Ю. Котельников

Руководитель ВКР

начальник сектора №53

ПФ ФГУП»НТЦ «Атлас»

В.В.Маркин




Пенза 2013г.

РЕФЕРАТ


Цель работы - разработка программного средства для анализа значений хэш-функций с целью формальной оценки стойкости пароля.

Программное средство предназначено для проверки значений хэш-функций на наличие «слабых» паролей.

В процессе разработки были изучены основные методы аудита паролей и рассмотрены существующие средства для аудита паролей. Были выделены особенности каждого из существующих средств аудита паролей и определены недостатки этих средств. Были изучены способы хранения хэшей в информационных системах семейства Windows и Linux, а также методы защиты этих систем от извлечения хэшей. Были разработаны необходимые методы аудита для конкретных типов ОС, в зависимости от хэш-функций используемых в них.

В результате были разработаны алгоритмы для методов аудита паролей и написано программное средство для аудита паролей в информационных системах. Для разработанного программного средства был разработан графический интерфейс.


ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ


В настоящей выпускной квалификационной работе применяются следующие термины с соответствующими определениями, обозначения и сокращения.

Хэш (или хэш-код) - строка бит, являющаяся выходным результатом хэш-функции [1].

Хэш-функция - функция, отображающая строки бит в строки бит фиксированной длины и удовлетворяющая следующим свойствам:

по данному значению функции сложно вычислить исходные данные, отображенные в это значение;

для заданных исходных данных трудно найти другие исходные данные, отображаемые с тем же результатом;

трудно найти какую-либо пару исходных данных с одинаковым значением хэш-функции [1].

PAM-partitioned access method;

АИП-аутентифицирующая информация пользователя;

АПМДЗ-аппаратно-программные методы доверенной загрузки (средства доверенной загрузки);

ОС-операционная система;

ПЭВМ-персональная электронно-вычислительная машина;

СЗИ-средства защиты информации;

СКЗД-средства криптографической защиты данных.


ВВЕДЕНИЕ


Пароли традиционно являются наиболее распространенным и доступным средством аутентификации. Для пользователей это один из самых удобных вариантов, который, к тому же, не требует наличия какого-либо дополнительного оборудования или специальных навыков. Но аутентификацию далеко не всегда можно назвать удачным выбором. Как и многие технические решения, она страдает от человеческого фактора - многие люди не могут запоминать стойкие пароли, поскольку это объективно сложно. Поэтому они используют простые, нестойкие пароли. Такие пароли легко взломать, получив доступ к хэшу от этого пароля. Актуальным становится проверка паролей на наличие «слабых» паролей. Такая проверка выполняется с помощью специальных программно-аппаратных средств, позволяющих выявить «слабые» пароли по значениям хэшей от этих паролей.

Темой данного дипломного проекта является написание такого программного средства. Данное программное средство предназначено для аудита паролей в информационных системах. Под информационной системой понимается любая система, в которой присутствует система аутентификации по паролю, и в которой хранятся хзши от этих паролей. Программное средство выполняет автоматическое извлечение хэшей из информационной системы и автоматически выбирает необходимые методы аудита паролей для данной системы. Сегодня существует много готовых программных продуктов, но большинство из них либо платные, либо сложны в использовании, либо не поддерживают необходимые информационные системы.

Программное средство используется для контроля локальных рабочих мест пользователей с целью проверки выполнения ими политики выбираемых паролей, а также поиска паролей, которые соответствуют политики, но все равно являются «слабыми» паролями. Для удобства использования программное средство имеет графический интерфейс, что упрощает процесс аудита паролей. Для опытных пользователей предусмотрены расширенные настройки программного средства, позволяющие более эффективно проводить аудит паролей при наличии соответствующих данных (словари, «радужные таблицы»).


1. Обзор и сравнительный анализ существующих методов и средств аудита паролей по значениям известных хэш-функций от паролей


.1 Проблема слабых паролей


Компаниия Trustwave, провела исследование посвященное проблеме использования слабых паролей. В нем говорится, что вследствие применения ненадежных паролей происходит 80% инцидентов в сфере информационной безопасности [2].

Исследование Trustwave, проводившееся в 18 странах мира, акцентирует внимание на продолжающемся росте кибер атак, а также увеличению количества злоумышленников в сфере информационной безопасности. В ходе исследования было обнаружено, что 76% случаев нарушений произошло из-за уязвимости системы безопасности отделов, ответственных за системную поддержку и развитие компании. Большая часть исследования посвящена проблеме использования слабых паролей. По мнению специалистов Trustwave, до 80% инцидентов происходит вследствие слабых паролей. Слабые пароли продолжают оставаться основным уязвимым местом, которое используют злоумышленниками при атаках, как на крупные, так и на небольшие компании. В России ситуация во многом схожая. Распространенными паролями, как у администраторов информационных систем, так и у рядовых сотрудников компаний являются простые, легко подбираемые пароли. Длина пароля часто не превышает 8 символов и лишь единицы акцентируют свое внимание на создании более сложных комбинаций. Самыми распространенными паролями такого типа можно назвать: 1234567, 12345678, 12345 и 54321. Очень часто пользователи выбирают рядовые словарные пароли, наподобие password или welcome или же совпадающие с логином пользователя. Еще одним, крайне уязвимым местом организации информационной безопасности является применение сотрудником единого пароля для разных ресурсов. Использование пароля для регистрации в социальных сетях, электронной почты очень часто является идентичным для входа в информационную сеть компании, что делает ее уязвимой для внешних угроз. Реальность данной угрозы подтверждает недавняя утечка информации произошедшая в компании RSA, произошедшая из за одинаковых паролей на разных ресурсах. По факту, использование слабых и стандартных паролей облегчает работу взломщиков для проникновения в информационные системы организаций. Порой преступникам не требуется использование сложных, продуманных методов для взлома. Очень важно подчеркнуть, что компании должны быть бдительны, когда дело касается защиты критически важной, конфиденциальной информации от доступа к ним злоумышленников и очень бережны по отношению к персональной информацией своих клиентов. Сегодня необходимо внедрять превентивные технологии контроля и управления доступом для решения проблемы слабых паролей.

Согласно исследованию известной консалтинговой компании Deloitte Touche [3], проводимый ими аудит информационной безопасности на крупных предприятиях показывает, что с проблемой использования слабых паролей сталкивались в течение последних 12 месяцев 14% компаний. В 9% случаев были использованы пароли по умолчанию, а еще в 7% случаев - простые, как правило, известные злоумышленникам пароли.

Суммируя данные этого исследования, можно говорить о том, что 30% всех предприятий ежегодно сталкиваются с проблемами использования слабых паролей. Из них 16% - это грубые пренебрежения элементарными правилами безопасности и культурой работы с паролями.

По данным исследования Брюса Шнайдера [4] 3,8% пользователей использую простые односложные пароли, легко подбираемые по словарю. Еще 12% также используют в составлении паролей простые слова, но с добавление одного специального символа в конце. 28% используют в паролях только буквы нижнего регистра и цифры, что значительно ускоряет их взлом простым перебором.

Приведенные цифры лишь демонстрируют существующие риски, связанные со слабой парольной защитой. Реальный масштаб угрозы для каждого конкретного случая может сильно разнится.


1.2 Метод предварительного анализа


Метод предварительного анализа включает в себя следующие алгоритмы поиска паролей:

- использование для подбора паролей уже найденные пароли на целевой системе;

подбор паролей по найденным на целевой системе текстовым строкам, в том числе именам (логинам) пользователей;

подбор паролей, представляющих собой комбинации соседних клавиш на клавиатуре, например, «12345», «qwerty», «qazwsxedc», «qweasd» и т.п.;

подбор паролей по распространенным клавиатурным комбинациям, например, «ssssss», «abcdef», «qwerty123456» и т.п.

Основными достоинствами рассматриваемого метода являются:

быстрый поиск простейших паролей;

нахождение длинных буквенно-цифровых паролей, представляющих собой комбинации соседних клавиш, например, «q1w2e3r4t5y6u7i8o9p0», которые с помощью других рассмотренных ниже методов аудита восстановить в разумные сроки проблематично.

Основными недостатками рассматриваемого метода являются:

требуются высокоинтеллектуальные алгоритмы для составления наибольшего числа возможных вариантов паролей, представляющих собой комбинации соседних клавиш на клавиатуре или распространенные клавиатурные комбинации;

невозможно заранее просчитать хэши для всех перебираемых паролей, например, невозможно заранее знать имена (логины) субъектов доступа и/или раскладку клавиатуры.


1.3 Метод полного перебора


Метод полного перебора (brute force) предполагает последовательный перебор всех возможных паролей, которые могут быть составлены из символов заданного набора с заданной глубиной (длиной пароля).

Основными параметрами данного метода являются длина пароля (глубина перебора) и ширина пароля (символьный набор). Причем наборы могут быть разными: только цифры, только буквы латиницы в нижнем регистре, только прописные буквы кириллицы и т.д. Глубина перебора задается двумя атрибутами: минимальная и максимальная длина пароля.

В большинстве случаев метод полного перебора применяется при анализе хэшей на небольшую глубину широким символьным набором или на большую глубину узким символьным набором.

Основными достоинствами рассматриваемого метода являются:

простейший алгоритм поиска паролей;

возможность проведения распределенного поиска паролей (распределение всего перебираемого диапазона паролей между несколькими вычислительными машинами).

Основными недостатками рассматриваемого метода являются:

низкая скорость поиска паролей;

в большинстве случаев мощностей одного компьютера для перебора паролей в разумные сроки часто бывает недостаточно, требуются высокопроизводительные вычислительные комплексы;

вследствие большого количества вариантов перебираемых паролей невозможно заранее просчитать их хэши из-за огромного размера базы данных хэшей.

Рассматриваемый метод может быть эффективен только, когда известны основные параметры метода (словарь и длина пароля). При этом при увеличении глубины перебора и количества символов в переборе число перебираемых паролей возрастает лавинообразно - соответственно из-за возрастания времени их полного перебора снижается эффективность данного метода.


1.4 Метод поиска по маске


Метод поиска по маске предполагает последовательный перебор всех возможных паролей, которые могут быть составлены по заданной маске из символов заданного набора с заданной глубиной (длиной пароля).

Маска пароля задается на основании полученной информации о пароле: где, и какие символы используются в исходном тексте пароля.

Основными параметрами данного метода являются маска пароля, длина пароля (глубина перебора) и ширина пароля (символьный набор).

Основными достоинствами рассматриваемого метода являются:

достаточно быстрый поиск паролей;

нахождение длинных буквенно-цифровых паролей, представляющих собой комбинации вида «admin?????» или «???pass???», которые с помощью других рассмотренных методов аудита восстановить в разумные сроки проблематично.

Основными недостатками рассматриваемого метода являются:

для формирования маски необходима информация о пароле;

требуются высокоинтеллектуальные алгоритмы поиска паролей по маске;

невозможно заранее просчитать хэши для всех перебираемых паролей, так как невозможно заранее сформировать маску пароля по причине отсутствия информации о пароле.

Рассматриваемый метод может быть эффективен только, когда известны основные параметры метода (маска, словарь и длина пароля). При этом при увеличении глубины перебора и количества символов в переборе число перебираемых паролей возрастает лавинообразно - соответственно из-за возрастания времени их полного перебора снижается эффективность данного метода.


1.5 Метод простого поиска по словарям


Метод простого поиска по словарям предполагает последовательный перебор всех возможных паролей из словаря (словарей).

Словарь представляет собой текстовый файл, содержащий исходные тексты паролей в большинстве случаев в формате «одна строка - один пароль». Как правило, используется один общий словарь, содержащий наиболее популярные слова и ряд дополнительных словарей разделенных по тематике.

Основными достоинствами рассматриваемого метода являются:

достаточно быстрый поиск паролей;

простейший алгоритм поиска паролей;

могут быть заранее просчитаны хэши по заданным алгоритмам хэширования для всех перебираемых паролей из словаря.

Основными недостатками рассматриваемого метода являются:

требуются словари с большим объемом фраз различной тематики (города, имена, термины и т.п.), в которых содержаться часто употребляемые слова и части слов на разных языках;

целевой пароль должен быть осмысленным словом (например, «administrator», «computer», «Попугай», «Федя» и т.п.).

Данный метод аудита теоретически позволяет восстановить пароли любой длины и любой сложности при условии, что основу пароля должен составлять осмысленный текст.

атака пароль хэш словарь

1.6 Метод комбинированного поиска по словарям


Метод комбинированного поиска по словарям предполагает последовательный перебор всех возможных паролей, составленных из двух и более словарей.

В большинстве случаев данный метод реализуется следующим образом. Создаются два (или более) набора словарей, затем указывается очередность формирования парольных слов (например, первая часть пароля - «Набор словарей 1», правая часть - «Набор словарей 2»). После задания правил формирования паролей из двух и более словарей осуществляется перебор всех возможных вариантов паролей, полученных объединением слов (фраз) из указанных наборов. Кроме того, считается эффективным комбинировать качественный словарь большого объема с самим собой.

Основными достоинствами рассматриваемого метода являются:

быстрый поиск длинных паролей типа «ilovemercedes», «finalfantasy», «masterblaster» и т.п., представляющих собой конкатенацию двух и более словарных слов;

могут быть заранее просчитаны хэши по заданным алгоритмам хэширования для всех возможных паролей, составленных из двух и более словарей.

Основными недостатками рассматриваемого метода являются:

требуются словари с большим объемом данных различной тематики (города, имена, термины и т.п.), в которых содержаться часто употребляемые слова и части слов на разных языках;

целевой пароль должен быть осмысленным словосочетанием, фразой (например, «ИванПетрович», «ПопугайФедя», «iamhacker», «crackmehehe» и т.п.).

Данный метод аудита теоретически позволяет восстановить пароли любой длины и любой сложности при условии наличия качественных словарей.

1.7 Метод гибридного поиска по словарям


Метод гибридного поиска по словарям предполагает последовательный перебор всех возможных модифицированных паролей из словаря (словарей). Модификация исходного текста пароля осуществляется на основе правил и таблиц замен символов.

Правила модификации могут быть следующими: заменить в пароле одни символы другими (похожими), например, «P@$$w0rd», напечатать одно и то же слово много раз, например, «1234512345», поочередно использовать разные регистры символов, например, «CrIsTiNa» и т.д.

Таблицы замены символов позволяют подменять символы в паролях, формируя вместо слова «привет» пароль «privet» или «ghbdtn». Например, пароль «fktrcfylh2008» восстановить другими методами аудита практически невозможно, но при использовании таких таблиц аудит на него займет несколько минут, т.к. последовательность «fktrcfylh2008» это пароль «александр2008», набранный в английской раскладке клавиатуры.

Основными достоинствами рассматриваемого метода являются:

модификация исходного текста паролей на основе правил и таблиц замен символов позволяет осуществлять быстрый поиск «сложных» паролей типа «P@$$w0rd», «m@st3r», «h4cky0u», «forum+forum», «-lancer-», «h1a2c3k4e5r», «f.o.r.u.m.», «Mr.Johnson», «12345123451234512345», «CrIsTiNa» и т.д., которые другими методами аудита восстановить проблематично;

модификация на основе таблиц замены символов особенно эффективна там, где клавиатура компьютера имеет две раскладки (английскую и локализированную);

могут быть заранее просчитаны хэши по заданным алгоритмам хэширования для всех перебираемых паролей из словарей после их модифицирования согласно установленным правилам.

Основными недостатками рассматриваемого метода являются:

необходимо постоянное обновление (добавление) правил и таблиц замен символов, используемых при модификации исходного текста паролей;

требуются высокоинтеллектуальные алгоритмы модификации паролей;

требуются словари с большим объемом данных различной тематики (города, имена, термины и т.п.), в которых содержаться часто употребляемые слова и части слов на разных языках.

Метод комбинированного поиска по словарям теоретически позволяет восстановить осмысленные пароли любой длины и любой сложности при условии наличия большого количества популярных правил модификации исходного текста пароля и таблиц замен символов (для разных раскладок клавиатуры).


1.8 Метод поиска по «радужным таблицам»


Так как хэш-функции являются однонаправленными, не существует обратных функций, которые могли бы восстановить пароли из хэшей. При этом стоит отметить, что одному хэшу, вполне вероятно, может соответствовать множество различных буквенно-цифровых последовательностей. Поэтому в данном случае восстановление хэша - это поиск коллизии, а не исходного пароля.

Вследствие того, что время полного перебора всех возможных значений исходного пароля, сгенерированного на большом словаре символов, стремится к бесконечности, были предложены сортированные таблицы хэшей и соответствующих им паролей, в результате чего получилась система, которая с помощью быстрого бинарного поиска по таблице может получать обратное преобразование хэша в пароль для любого существующего алгоритма хэширования. Но так как таблицы всех возможных паролей занимают на дисках слишком много места, был использован оригинальный формат таблиц: хэши собираются в цепочки по несколько тысяч комбинаций. Каждая следующая комбинация получается из предыдущей очередным применением той же функции хэширования. В таблицы записывается только начало и конец каждой такой цепочки.

Для поиска по таким таблицам к заданному хэшу применяется точно такая же функция хэширования несколько тысяч раз (в зависимости от используемой длины цепочек), и на очередной итерации получается хэш, который является концом одной из цепочек в этих таблицах. После этого эта цепочка заново прогоняется от начального до заданного хэша и находится комбинация ему предшествующая, - это и есть искомый пароль.

Такие таблицы получили наименование Rainbow Tables («Радужные таблицы»). С одной стороны, они имеют объем в тысячи раз меньше обычных таблиц, содержащих все возможные пароли, с другой - позволяют найти за несколько минут результат любого алгоритма хэширования, если искомый пароль был просчитан заранее в этих таблицах.

Современные «радужные таблицы» генерируются с использованием технологии «time-memory tradeoff» (выбор оптимального соотношения «время-память»). Это компромиссный подход к решению ряда задач в информатике, при котором требуемый объем памяти может быть снижен за счет более медленного выполнения программы (или, наоборот, время вычислений может быть снижено за счет увеличения объема используемой памяти).

Основными достоинствами рассматриваемого метода являются:

в настоящее время является одним из самых быстрых методов поиска паролей (время поиска ограниченно только возможностями системы по загрузке больших «радужных таблиц» в память компьютера);

позволяет осуществлять поиск паролей любой сложности при наличии соответствующих заранее сгенерированных «радужных таблиц» (такие параметры целевого хэша как алгоритм хэширования, набор символов, длина пароля должны соответствовать параметрам «радужных таблиц»).

Основными недостатками рассматриваемого метода являются:

для хранения «радужных таблиц», сгенерированных на большом наборе символов с длинным паролем, требуются значительные объемы памяти;

из-за особенностей формирования «радужных таблиц» для достижения максимальной вероятности успешной попытки подбора пароля должны быть сгенерированы с одинаковыми параметрами (алгоритм хэширования, набор символов, длина пароля) несколько «радужных таблиц» (при этом 8 таблиц это почти 100 процентная вероятность успеха);

на большом наборе символов с длинным паролем требуется значительное количество времени на генерацию «радужных таблиц»;

наиболее важным ограничением данного метода является механизм замешивания в хэш уникального значения - использование алгоритма с дополнительными параметрами. В этом случае заранее рассчитанные таблицы хэшей становятся бесполезными. Механизм замешивания используется в следующих алгоритмах хэширования: MD5(UNIX), SHA-256(UNIX), SHA-512(UNIX).

Поиск по «радужным таблицам» теоретически позволяет восстановить пароли любой длины и любой сложности при условии наличия соответствующих заранее сгенерированных «радужных таблиц» для алгоритмов хэширования, в которых не используется механизм замешивания случайного числа.


1.9 Существующие средства аудита паролей


Существует множество средств для аудита паролей по значениям известных хэш-функций от паролей. Рассмотрим особенности наиболее известных из них:

а) John the Ripper:

) обладает одной из самых высоких скоростей перебора паролей;

) поддерживает большое количество алгоритмов хэширования;

) распространяется как бесплатная (официально не поддерживает NTLM-хэши) и платная версии;

) отсутствует графический интерфейс;

) программа реализует лишь методы полного перебора и поиска по словарю;

) отсутствуют методы автоматического извлечения хэшей из системы;

б) Password Pro:

) обладает высокой скоростью подбора паролей;

) имеет графический интерфейс;

) поддерживает большое количество алгоритмов хэширования;

) распространяется как бесплатная (доступен аудит только одного хэша) и платная версии;

) отсутствуют методы автоматического извлечения хэшей из системы;

в) L0pht Crack+:

) присутствуют встроенные методы автоматического извлечения хэшей из системы;

) поддерживает только NTLM/LM алгоритмы хэширования;

) программа реализует не все методы аудита паролей;

г) Rainbow Crack:

) программа поддерживает метод «радужных» таблиц, который позволяет проводить аудит с гигантской скоростью;

) поддерживает большое количество алгоритмов хэширования;

) существует возможность добавления в качестве dll-библиотеки своей реализации любого алгоритма хэширования;

) большая часть «радужных» таблиц с большой глубиной пароля и символьным набором не доступна бесплатно;

) отсутствуют методы автоматического извлечения хэшей из системы.

Эти программы наиболее распространены в настоящее время, но каждая имеет свои достоинства и недостатки. Это не позволяет использовать их в качестве готового программного средства для аудита паролей по значениям известных хэш-функций от паролей, соответствующего все требованиям технического задания. Поэтому актуальной задачей становится написание собственного программного средства, соответствующего техническому заданию, имеющего ряд достоинств и не имеющего недостатков, присущих выше рассмотренным программам.


2. Порядок проведения аудита для конкретных типов ОС


.1 Аутентификация с использованием заранее вычисленного хэша от пароля


Авторизация субъекта доступа в системе может быть выполнена только при наличии АИП. АИП в общем случае состоит из имени (логина) и пароля субъекта доступа.

Общий порядок создания учетной записи следующий: вводится имя (логин) субъекта доступа, затем пароль субъекта, далее текст пароля хэшируется с помощью функции одностороннего преобразования, получаемый в итоге хэш пароля (свертка) сохраняется в специальном хранилище системы. В дальнейшем, при попытке входа, система запрашивает пароль субъекта доступа, хэширует его и полученный хэш сравнивает с эталонным хэшем, сохраненным ранее. Таким образом, исходный текст пароля в отличие от текста имени (логина) в системе не хранится.

В большинстве случаев доступ к хранилищу сверток паролей ограничивается на системном уровне, что легко обходится при загрузке инструментальной ОС с внешнего носителя.

Необходимо отметить, что доступ к АИП может осложняться наличием в целевой системе установленных:

СЗИ, усиливающих механизмы аутентификации;

АПМДЗ, блокирующих загрузку инструментальной среды с внешних носителей;

СКЗД, зашифровывающих файлы, разделы или полностью диски системы.


2.2 Получение хэшей из ОС семейства Linux


Файл «/etc/passwd» всегда открыт на чтение для всех субъектов доступа, зарегистрированных в ОС, и используется многими штатными утилитами из состава ОС для получения сведений об АИП. При этом информация об учетных записях субъектов доступа, содержащаяся в файле «/etc/passwd», является общедоступной.

Для защиты от несанкционированного доступа к сведениям изложенным в файле «/etc/passwd» в ОС Linux был добавлен специальный механизм скрытия (затенения) паролей субъектов доступа. Для реализации указанного механизма в ОС Linux стал использоваться специальный файл «/etc/shadow», доступ к которому контролируется с помощью штатных средств контроля доступа. Только процессы с правами суперпользователя root могут читать и писать в файл «/etc/shadow» напрямую. Для всех других субъектов доступа обращения к АИП возможны только с помощью функций специальной библиотеки PAM.

В «скрытый» файл «/etc/shadow» из файла «/etc/passwd» были перенесены свертки паролей для всех зарегистрированных учетных записей, и добавлена дополнительная информация о паролях субъектов доступа (срок действия, дата смены пароля и т.п.). При этом в файле «/etc/passwd» в поле password для каждого субъекта доступа свертка пароля заменяется символом «x», означающий, что свертка пароля находятся в специальном файле «/etc/shadow».

Однако файл «/etc/shadow» на целевой ОС легко доступен для чтения и редактирования при загрузке системы с помощью внешней ОС.

Алгоритм получения АИП из ОС семейства Linux следующий:

а) извлечение свертки пароля.

Для извлечения свертки пароля необходимо выполнить поиск файла «/etc/passwd» и считать для каждой учётной записи значение поля password. Если считанное значение соответствует символу «х», то необходимо выполнить поиск файла «/etc/shadow» и далее из него для каждой учётной записи считать значение поля password;

б) идентификация схемы преобразования.

В случае если данные из поля password считывались из файла «/etc/passwd», то свертка пароля была получена с помощью традиционной схемы на базе DES. Эта схема устарела и сейчас практически нигде не используется.

Для идентификации других схем преобразования исходного текста пароля в свертку необходимо проанализировать формат данных, считанных из файла «/etc/shadow».

Если данные начинаются с символа «$», то в зависимости от следующих двух символов после знака «$» схема преобразования идентифицируется следующим образом:

) если 1 - схема на базе MD5;

) если 5 - схема на базе SHA2 (SHA-256);

) если 6 - схема на базе SHA2 (SHA-512).


2.3 Получение хэшей из ОС семейства Windows


Алгоритм получения исходного текста пароля субъекта доступа в ОС Windows начиная с версии NT следующий:

а) снятие дополнительного контура защиты (в случае активации в ОС Windows механизма защиты свертки пароля на основе системного ключа boot_key):

) извлечение системного ключа boot_key.

Ключ boot_key разбит на 4 части и располагается в скрытой области данных (атрибут «class») следующих ключей реестра ОС Windows: JD, Skew1, GBG, Data ветки HKLM/System/<ControlSet001>/Control/Lsa.

Весь раздел реестра HKLM/System располагается в системном файле System по адресу «%SystemRoot%/system».

Фрагменты ключа boot_key хранятся в скрытой области данных в строковом представлении шестнадцатеричных чисел, причем по принципу big-endian (т.е. старший байт записан по младшему адресу);

) формирование расширенного системного ключа ext_boot_key с использованием ключа boot_key.

Ключ ext_boot_key есть результат расшифровывания фрагмента данных, расположенного по адресу [0x80:0xA0] F-блока (параметр F реестра ОС Windows по адресу HKLM/SAM/SAM/Domains/Account/users/<RID>), по алгоритму RC4 с использованием ключа rc4_key. Ключ rc4_key - это хэш на массив данных, рассчитанный с помощью алгоритма MD5:


rc4_key = MD5(F[0x70:0x80] + aqwerty + boot_key + anum)


где aqwerty, anum - строковые константы (ASCII);

) формирование ключей хранения LM и NT последовательностей соответственно rc4_key_lm и rc4_key_nt с использованием ключа ext_boot_key для дополнительного контура защиты.

Ключ rc4_key_lm - это ключ хранения LM последовательности, представляющий собой хэш на массив данных, рассчитанный с помощью алгоритма MD5:


rc4_key_lm = MD5(ext_boot_key[0x0:0x10] + RID + almpassword),


где: - ext_boot_key[0x0:0x10] - первая половина расширенного системного ключа (ext_boot_key);

RID - значение RID субъекта доступа (наименование ключа <RID> реестра ОС Windows по адресу HKLM/SAM/SAM/Domains/Account/users/) в виде 4х байт (дополненное нулями);

almpassword - строковая константа (ASCII).

Ключ rc4_key_nt - это ключ хранения NT последовательности, представляющий собой хэш на массив данных, рассчитанный с помощью алгоритма MD5:


rc4_key_nt = MD5(ext_boot_key[0x0:0x10] + RID + antpassword)


где: - ext_boot_key[0x0:0x10] - первая половина расширенного системного ключа (ext_boot_key);

RID - значение RID субъекта доступа в виде 4х байт (дополненное нулями);

antpassword - строковая константа (ASCII);

) расшифрование LM и NT последовательностей по алгоритму RC4 с использованием ключей rc4_key_lm и rc4_key_nt - снятие дополнительного контура защиты.

С помощью алгоритма RC4 выполняется расшифрование LM последовательности, считанной из V-блока реестра ОС Windows, с использованием ключа rc4_key_lm:


DES_LMpass = RC4(rc4_key_lm, RC4_DES_LMpass)


где: - RC4_DES_LMpass - зашифрованная двумя контурами LM последовательность;

DES_LMpass - зашифрованная основным контуром LM последовательность.

С помощью алгоритма RC4 выполняется расшифрование NT последовательности, считанной из V-блока реестра ОС Windows, с использованием ключа rc4_key_nt:


DES_NTpass = RC4(rc4_key_nt, RC4_DES_NTpass),


где: - RC4_DES_NTpass - зашифрованная двумя контурами NT последовательность;

DES_NTpass - зашифрованная основным контуром NT последовательность;

б) снятие основного контура защиты:

) формирование ключей хранения des_key_1 и des_key_2 для основного контура защиты (алгоритм DES) на основе данных RID субъектов доступа.

Ключи хранения des_key_1 и des_key_2 формируются независимо от типа последовательности (LM или NT) на основе четырех байтов RID субъекта с использованием перестановок и побитовых операций. При этом ключ des_key_1 необходим для расшифровывания первой половины LM или NT последовательности, а ключ des_key_2 для расшифровывания второй половины LM или NT последовательности. Размер каждой половины равен 8 байтам;

) расшифрование LM и NT последовательностей по алгоритму RC4 с использованием ключей хранения des_key_1 и des_key_2 - снятие основного контура защиты.

Перед выполнением расшифровывания необходимо выполнить разбиение LM или NT последовательности на две равные половины по 8 байтов:


DES_LMpass_1 = DES_LMpass[0x0:0x7],_LMpass_2 = DES_LMpass[0x8:0xF],_NTpass_1 = DES_NTpass[0x0:0x7],_NTpass_2 = DES_NTpass[0x8:0xF].


С помощью алгоритма DES выполняется расшифрование первой и второй половины LM или NT последовательности, с использованием ключа des_key_1 и des_key_2:

LMpass_1 = DES(DES_LMpass_1, des_key_1),_2 = DES(DES_LMpass_2, des_key_2),_1 = DES(DES_NTpass_1, des_key_1),_2 = DES(DES_NTpass_2, des_key_2).


где: - DES_LMpass_1, DES_LMpass_2 и DES_NTpass_1, DES_NTpass_2 - первая и вторая половины соответственно LM и NT последовательности, зашифрованные на основном контуре защиты. При этом если версия целевой ОС Windows 2000 и выше, то используется LM и NT последовательность после снятия дополнительного контура защиты, если версия целевой ОС младше ОС Windows 2000, то LM и NT последовательность считывается непосредственно из V-блока реестра ОС Windows;

LMpass_1, LMpass_2, NTpass_1, NTpass_2 - первая и вторая половины расшифрованной соответственно LM и NT последовательности;

des_key_1, des_key_2 - ключ хранения для первой и второй половины LM или NT последовательности.

Результат объединения двух расшифрованных половинок LM или NT последовательности есть «чистая» свертка пароля:

для LM последовательности - LanMan(DES);

для NT последовательности - MD4-хэш.


2.4 Определение необходимых методов аудита для конкретных типов ОС


Необходимо отметить, что способ получения свертки пароля (хэша) и соответственно аудит этих паролей различен в зависимости от типа и версии ОС целевой системы. Вследствие чего, для каждого варианта целевой системы предлагается отдельный порядок проведения аудита паролей, представляющий собой комбинацию отдельных методов аудита паролей, вызываемых в определенной последовательности с соответствующими параметрами.

При составлении комбинаций отдельных методов аудита паролей учитывалось общее время проведения оценки стойкости (надежности/ненадежности) паролей, которое может понадобиться при проведении аудита паролей субъектов доступа.

Для минимизации времени проведения аудита паролей субъектов доступа предлагается:

а) частично или совсем не использовать следующие методы аудита:

) метод полного перебора (т.к. требуется много процессорного времени);

) метод поиска по маске (т.к. отсутствуют предварительные сведения о пароле);

) метод поиска по «радужным таблицам», сгенерированным на больших символьных наборах (т.к. с помощью этого метода аудита, теоретически могут быть распознаны все пароли возможные в наборе символов, на базе которых была сгенерирована таблица, в том числе и «надежные» пароли);

б) формировать комбинации отдельных методов аудита паролей из следующего перечня методов:

) метод предварительного анализа (поиск простейших часто используемых паролей);

) поиск по «радужным таблицам», сгенерированным на цифровом символьном наборе (поиск пароля, представляющего собой, например, номер телефона);

) метод гибридного поиска по словарям (расширенный поиск простых паролей - с одним корнем);

) метод комбинированного поиска (поиск составных паролей - с двумя корнями);

) метод полного перебора на небольшом символьном наборе с малой глубиной перебора.

Исходя из вышесказанного оптимально использовать следующие варианта порядка проведения аудита паролей в зависимости от типа и версии ОС:

а) для устаревших ОС семейства Windows (до версии Vista).

Вследствие особенностей получения хэша по схеме LM (пароль с максимальной длиной 14 символов делится на две половинки, после чего каждая половинка отдельно хэшируется) предлагается сначала выполнить поиск частей парольной фразы отдельно по двум половинкам хэша. После чего перебором на известном алфавите и порядке символов выполнить поиск исходного текста пароля уже с учетом регистра.

Для проведения оценки стойкости пароля предлагается последовательно использовать следующие методы аудита:

) метод предварительного анализа;

) поиск по «радужным таблицам», сгенерированным предварительно для схемы LM (алгоритм DES) на символьном наборе, состоящем только из цифр [0123456789], на глубину до 7 символов;

) метод простого поиска по словарю;

б) для остальных ОС семейства Windows, использующих получение хэша по схеме NTLM.

Для проведения оценки стойкости пароля предлагается последовательно использовать следующие методы аудита:

) метод предварительного анализа;

) метод комбинированного поиска по словарям;

) метод простого поиска по словарям;

) метод гибридного поиска по словарям;

) метод полного перебора на символьном наборе, состоящем только из цифр [0123456789], на глубину до 10 символов;

в) для ОС семейства Linux, в которых для свертки паролей субъектов доступа могут быть использованы алгоритмы хеширования (MD5, SHA-256, SHA-512) с дополнительными параметрами, для проведения оценки стойкости пароля предлагается последовательно использовать следующие методы аудита:

) метод предварительного анализа (для алгоритмов хэширования MD5, SHA-256, SHA-512);

) метод простого поиска по словарю (для алгоритмов хэширования MD5, SHA-256, SHA-512);

) метод гибридного поиска по словарю (для алгоритмов хэширования MD5);

) метод комбинированного поиска по словарю (для алгоритмов хэширования MD5, SHA-256).


3. Разработка алгоритмов для методов аудита паролей


Общий алгоритм аудита паролей следующий:

а) формирование очередной комбинации, представляющей собой вариант пароля, в зависимости от метода аудита пароля:

) для метода предварительного анализа.

Первым этапом в качестве варианта пароля берется пустой пароль.

Далее в качестве варианта пароля берутся логины пользователей, найденные в информационной системе, а также измененные варианты от этих логинов (логины во всех возможных регистрах, два логина подряд соединенные символом) в зависимости от типа информационной системы.

Затем в качестве варианта пароля берутся распространенные клавиатурные комбинации и комбинации из соседних клавиш клавиатуры. Все эти комбинации записаны в общий файл-словарь для метода предварительного анализа;

) для метода полного перебора.

Общее количество вариантов пароля - множество вариантов размещения с повторением из символьного набора по длине пароля. Вариант пароля представляет собой один элемент из этого множества;

) для метода поиска по маске.

Общее количество вариантов пароля - множество вариантов размещения с повторением из символьного набора по длине пароля. Вариант пароля представляет собой конкатенацию маски с одним из элементов этого множества в нужной последовательности;

) для метода простого поиска по словарю.

Общее количество вариантов пароля - множество строк в файле-словаре. Вариант пароля представляет собой один элемент из этого множества;

) для метода комбинированного поиска по словарям.

Общее количество вариантов пароля множество вариантов конкатенации строки из первого файла-словаря со строкой из второго файла-словаря. Вариант пароля представляет собой один элемент из этого множества;

) для метода гибридного поиска по словарю.

Вариант пароля представляет собой один элемент из множества строк в файле-словаре, взятый во всех возможных регистрах.

Под очередной комбинацией понимается последовательный перебор всех возможных вариантов пароля;

б) вычисление нужной хэш-функции от варианта пароля.

Если в информационной системе используется алгоритм хэширования с дополнительными параметрами, то для каждого логина вычисляется свой хэш и сравнивается с соответствующим логину хэшем.

Если в информационной системе не используется алгоритм хэширования с дополнительными параметрами, то вычисляется общий хэш и сравнивается последовательно со всеми хэшами;

в) сравнение вычисленной хэш-функции с «эталонной».

Если при сравнении вычисленная хэш-функция будет равна «эталонной» хэш-функции, то текущий вариант пароля выводится как найденный для данного логина.


4. Разработка графического интерфейса для программного средства


Программное средство реализовано на аппаратной платформе Intel IBM PC с использованием библиотеки qt4 под ОС Linux Ubuntu 10.04.

Для удобства работы пользователя с программным средством был разработан графический интерфейс. Графический интерфейс главного окна программного средства представлен на рисунке 4.1.


Рисунок 4.1 - Графический интерфейс главного окна программного средства


Главное окно содержит:

а) список запланированных задач.

Графический интерфейс списка запланированных задач представлен на рисунке 4.2.


Рисунок 4.2 - Графический интерфейс списка запланированных задач


Содержит список запланированных задач и статус их выполнения.

Под задачей понимается один из методов аудита паролей, описанных в пунктах 1.2-1.8, с конкретными значениями (символьный набор, файл словаря, глубина пароля и т.д.), который будет использоваться для текущего аудита паролей;

б) верхняя панель управления.

Графический интерфейс верхней панели управления представлен на рисунке 4.3.


Рисунок 4.3 - Графический интерфейс верхней панели управления


Верхняя панель содержит:

1) кнопка «Добавить задачу».

Данная кнопка позволяет вызвать окно для добавления новой задачи, в котором пользователь может выбрать конкретный метод аудита паролей, указать конкретные значения для выбранного метода и добавить выбранный метод в список запланированных задач. Графический интерфейс окна для добавления новой задачи представлен на рисунке 4.4.


Рисунок 4.4 - Графический интерфейс окна для добавления новой задачи


На вкладках данного окна расположена все методы аудита, перечисленные в пунктах 1.2-1.8, с необходимыми для каждого метода параметрами;

) кнопка «Удалить задачу».

Данная кнопка позволяет удалить из списка запланированных задач выделенную задачу/задачи;

) кнопка «Начать аудит».

Данная кнопка позволяет начать аудит паролей по всем задачам из списка запланированных задач;

) кнопка «Отменить аудит».

Данная кнопка позволяет отменить аудит паролей. Те задачи из списка запланированных задач, которые не успели завершиться, получат статус «Отменено»;

в) список найденных хэшей в информационной системе.

Графический интерфейс списка найденных хэшей в информационной системе представлен на рисунке 4.5.

Рисунок 4.5 - Графический интерфейс списка найденных хэшей в информационной системе


Содержит все логины и хэши, найденные в информационной системе. По ходу выполнения аудита паролей в этот список будут добавляться и найденные пароли;

г) нижняя панель управления.

Графический интерфейс нижней панели управления представлен на рисунке 4.6.


Рисунок 4.6 - Графический интерфейс нижней панели управления


Нижняя панель управления содержит:

) текстовое поле.

Предназначено для ручного ввода каталога, содержащего информационную систему (например, «/media/802C94C42C94B71E»);

) кнопка «Обзор».

Данная кнопка позволяет вызвать диалоговое окно для выбора каталога, который содержит информационную систему. Выбранный каталог заносится в текстовое поле из предыдущего пункта. Графический интерфейс диалогового окна для выбора каталога реализован стандартными методами операционной системы, поэтому графический интерфейс будет различен для разных операционных систем. На операционной системе Linux Ubuntu 10.04 (Lucid) вид данного окна представлен на рисунке 4.7;

Рисунок 4.7 - Диалоговое окно для выбора каталога на ОС Linux Ubuntu 10.04 (Lucid)


) кнопка «Определить информационную систему».

Данная кнопка позволяет найти информационную систему по каталогу, указанному в текстовом поле, и автоматически извлечь из этой системы все логины и хэши. Извлеченные данные заносятся в список найденных логинов и хэшей;

д) строка состояния.

Графический интерфейс строки состояния представлен на рисунке 4.8.


Рисунок 4.8 - Графический интерфейс строки состояния


В строке состояния показываются системные сообщения, ошибки, возникшие при определении информационной системы, и другие незапланированные сбои.

5. Разработка руководства по применению программного средства для аудита паролей


Для правильного функционирования программного средства должно выполняться следующее условие: запуск программного средства должен производиться от имени пользователя, который имеет как минимум право чтения файлов на каталог, в котором находится информационная система, а также на каталог с пользовательскими словарями и «радужными таблицами» (если пользователь будет использовать свои словари или «радужные таблицы»).

Разработанное руководство содержит алгоритм использования программного средства и возможные ошибки, которые могут возникнуть при работе.

Алгоритм работы с программным средством:

а) запуск программного средства.

Запустить файл «diplom» из папки с программным средством;

б) определение информационной системы.

Указать в текстовом поле каталог с информационной системой либо вручную, либо с помощью кнопки «Обзор».

Определить информационную систему с помощью кнопки «Определить информационную систему».

Если информационная система определилась успешно, в статусной строке появится ее тип и тип функции хэширования. Если появилось сообщение «Информационная система не найдена», значит, в данном каталоге нет информационных систем, поддерживаемых программным средством (необходимо выбрать другой каталог и повторить алгоритм с пункта б).

Проверить список найденных логинов и хэшей. Если он пуст, значит, данная информационная система не содержит учетных записей (необходимо выбрать другой каталог и повторить алгоритм с пункта б);

в) редактирование (по необходимости) списка запланированных задач.

В списке запланированных задач содержатся задачи, предусмотренные программным средством для данной информационной системы по умолчанию. Перед началом аудита, если требуется, можно удалить ненужные задачи, либо добавить задачи, которые не содержатся в списке задач по умолчанию.

Чтобы удалить ненужную задачу необходимо выделить ее левой клавишей мышки и нажмите кнопку «Удалить задачу».

Чтобы добавить задачу необходимо нажать кнопку «Добавить задачу». В появившемся диалоговом окне в верхней вкладке выбрать метод аудита и необходимые для него параметры, и нажать кнопку «Добавить» (при добавлении задачи необходимо, чтобы все поля диалогового окна были заполнены, символьный набор не содержал одинаковых символов, а минимальная длина пароля должна быть меньше, чем максимальная). Добавленная задача появится в списке запланированных задач;

г) запуск аудита паролей.

Для того чтобы кнопка «Начать аудит» была активна необходимо, чтобы список запланированных задач и список найденных логинов и хэшей содержали как минимум одну запись. Для начала аудита необходимо нажать кнопку «Начать аудит»;

д) контроль над выполнением аудита паролей.

В списке запланированных задач в столбце «Статус» указывается стадия выполнения задачи:

) статус «В процессе» означает, что задача выполняется в текущий момент;

) статус «Отменено» означает, что данная задача не была выполнена, так как аудит паролей был остановлен пользователем;

) статус «Завершено» означает, что данная задача успешно выполнена;

) статус «Файл словаря не найден» означает, что файл со словарем, который был указан при добавлении задачи, не существует;

) статус «Не хватает прав доступа» означает, что пользователь, от имени которого запущено программное средство, не имеет прав на чтение файла словаря;

) статус «Ошибка» означает, что произошла незапланированная ошибка;

е) анализ результатов выполнения аудита паролей.

По результатам выполнения аудита паролей делается вывод о надежности пароля. Если по итогам всех проверок пароль не был найден, то такой пароль оценивается как «надежный». Если по итогам всех проверок пароль был найден, то такой пароль оценивается как «ненадежный».


6. Оценка затрат на обеспечение информационной безопасности предприятия, использующего программное средство для аудита паролей


.1 Расчет затрат на разработку программного средства


Затраты на разработку программных средств представляют собой стоимостную оценку использованных в процессе разработки материалов, покупных комплектующих и полуфабрикатов, расходов на приобретение специального оборудования, оплату труда разработчиков, затраты по работам, выполненным сторонними организациями и др.

Затраты на разработку программных средств (Зпс) могут быть рассчитаны по следующей формуле:


Зпс = М + Пок + Зо + Зд + Осн + Рпр + Рн руб.


где: - М - стоимость сырья и материалов;

Пок - стоимость покупных комплектующих;

Зо - основная заработная плата разработчиков ПС;

Зд - дополнительная заработная плата разработчиков ПС;

Осн - отчисления на социальные нужды;

Рп - прочие прямые расходы;

Рн - накладные расходы.

Программные средства, как правило, не имеют материально-вещественной формы выражения и сырье и основные материалы при их разработке не используются. В незначительных количествах могут использоваться лишь вспомогательные материалы в виде бумаги и других канцелярских изделий.

Стоимость используемых для разработки программного средства материалов (М) в общем виде может быть рассчитана по формуле:


М = S Qi x Цi х КТ,i руб.


где: - n - количество видов используемых материалов;

i - наименование соответствующего вида используемых материалов;

Qi - расход на разработку материалов i-го наименования в соответствующих единицах измерения;

Цi - цена приобретения единицы материала i-го наименования;

КТ,i - коэффициент, учитывающий транспортно-заготовительные расходы при приобретении материалов i-го наименования (оплата услуг транспорта, комиссионных посредникам и др.).

КТ,i равно 1,12.

Расчет стоимости используемых материалов представлен в таблице 6.1.


Таблица 6.1 - Расчет стоимости используемых материалов

Наименование материалаЕд. изм.Цена за единицу, руб.Расход на разработкуКоэффициент, КТСумма, руб.Бумага для принтера А4пачка17011,12190,4Папка для бумагшт.2031,1267,2Всего257,6

В расходы по расчету стоимости покупных комплектующих следует включать стоимость необходимых для разработки, отладки и сдачи заказчику покупных изделий, таких как, информационные носители (CD-RW,DVD-RW диски), сервисных программ, систем и языков программирования и т.д.

Стоимость покупных комплектующих может в общем виде быть рассчитана по формуле:


Пок = S Ni х Цi х КТ,i руб.,

где: - i - наименование покупных изделий;

n - количество видов покупных комплектующих;

Ni - расход на разработку покупных комплектующих i-го наименования;

Цi - цена приобретения единицы покупных комплектующих i-го наименования.

Расчет стоимости покупных комплектующих для разработки программного средства представлен в таблице 6.2.


Таблица 6.2 - Расчет стоимости покупных комплектующих

Наименование покупных комплектующихЦена за единицу, руб.Расход на разработкуКоэффициент, КТСумма, руб.CD-RW1511,1216,8DVD-RW3531,12117,6Всего134,4

В состав основной заработной платы включаются выплаты за фактически выполненную работу в соответствии с окладами, тарифными ставками и расценками всему персоналу, принимающему участие в разработке данного программного средства: научных работников, инженерно-технических работников, лаборантов и служащих исследовательских и проектных подразделений и др.

В общем виде основная заработная плата разработчиков программных изделии может быть рассчитана по формуле:


З0 = S Тi х руб


где: - i - наименование категории разработчиков;

n - количество категорий разработчиков;

Тi - трудоемкость проектных работ, выполненных разработчиком i-ой категории;

li часовая тарифная ставка разработчика i-ой категории.

В разработке программного средства в условиях дипломного проектирования принимают участие разработчики двух категорий: консультант (руководитель дипломного проекта) и инженер-программист (дипломник).

Необходимо определить удельный вес трудоемкости проектных работ выполняемых разработчиками различных категорий по каждому из этапов разработки программного средства и в целом по разработке исходя из существующих нормативов и опыта проектирования (см. таблицу 6.3).


Таблица 6.3 - Перечнь этапов разработки и удельные веса в процентах трудоемкости

Наименование этаповУдельный вес трудоемкости этапа в процентах по категориям разработчиковКонсультантИнженер-программист%Час.%Час.Предпроектный анализ задач и формирование требований пользователя: постановка производственных задач.5811600Разработка концепции создания программного средства.295800Продолжение таблицы 6.3Наименование этаповУдельный вес трудоемкости этапа в процентах по категориям разработчиковКонсультантИнженер-программист%Час.%Час.Разработка и согласование технического задания на создание программного средства132600Разработка математического обеспечения (моделей, методов, алгоритмов)00515Разработка структур данных001030Разработка и отладка программного средства0053159Тестирование программы001957Оформление проектной и эксплуатационной документации001339Всего100200100300Для определения абсолютных значений трудоемкости каждого этапа необходимо принять суммарную трудоемкость работ инженера-программиста, равной 300 часам, а аналогичный показатель для консультанта, равный 200 часам.

Часовая тарифная ставка разработчиков может быть определена следующим образом:


руб./час


где: - - месячный оклад разработчика i-ой категории, руб.;

Fмес - месячный фонд времени работы разработчика в часах.

Для данных расчетов: равно 168 час, месячный оклад консультанта равен 12500 руб., месячный оклад инженера-программиста равен 6000 руб.

Тогда часовые ставки программиста и консультанта равны, соответственно, 74,4 и 35,7.

Расчет основной заработной платы представлен в таблице 6.4.


Таблица 6.4 - Расчет основной заработной платы разработчиков

Наименование этапаКонсультантИнженер-программистСумма, руб.Время, час.Сумма, руб.Время, час.Сумма, руб.Предпроектный анализ задач и формирование требований пользователя: постановка производственных задач.1168630,4008630,4Разработка концепции создания программного средства.584315,2004315,2Разработка и согласование технического задания на создание программного средства261934,4001934,4Разработка математического обеспечения0015535,5535,5Наименование этапаКонсультантИнженер-программистСумма, руб.Время, час.Сумма, руб.Время, час.Сумма, руб.Разработка структур данных003010711071Разработка и отладка программного средства001595676,35676,3Тестирование программы00572034,92034,9Оформление проектной и эксплуатационной документации00391392,31392,3Всего200148803001071025590

В состав дополнительной заработной платы разработчиков включаются все виды выплат, надбавок и доплат из фонда заработной платы за проработанное и не проработанное время (надбавки за профессиональное мастерство, доплаты за условия труда, работу в ночные смены, выплаты отпускных, вознаграждения за выслугу лет и др.).

Дополнительная заработная плата рассчитывается по формуле:


ЗД = Зо х КД руб.,


где: - Зо - основная заработная плата разработчиков;

КД - коэффициент дополнительной заработной платы.

Приняв коэффициент дополнительной заработной платы, равным 20%, получим значение дополнительной заработной платы ЗД равным 5118 руб.

Расчет отчислений на социальные нужды. Отчисления на социальные нужды рассчитывается по формуле:


Осн = (Зо + ЗД) х Ксн руб.


где Ксн - коэффициент отчислений на социальные нужды, равный в настоящее время 30 процентам.

Отчисления на социальные нужды Осн равны 9212,4 руб.

В прочие прямые расходы включаются затраты, непосредственно связанные с разработкой данного программного средства (аренда или прокат оборудования, вычислительной техники, транспорта, приобретение научно-технической литературы, участие в семинарах и т.д.) по их фактической стоимости.

К прочим прямым расходам, понесенным разработчиком, следует отнести:

затраты на приобретение специальной литературы, а именно книги «QT 4 - программирование GUI на C++» стоимостью 250 руб.;

затраты на оплату данных, скачанных в Интернете, равные 150 руб.

Всего прочие прямые расходы составили 400 руб.

В состав накладных расходов включаются затраты, которые не вошли в состав предыдущих расходов и не могут быть рассчитаны прямым путем. К ним относятся амортизация, ремонт и содержание (отопление, освещение, силовая энергия, водоснабжение и т.д.) зданий и других основных производственных фондов общего назначения, содержание аппарата управления проектной организации, почтово-телеграфные расходы и канцелярские расходы, налоги и сборы, включаемые в себестоимость (дорожный, налог на имущество и др.) и другие общехозяйственные расходы.

Они рассчитываются по формуле:


Рн = Зо х Кн руб.


где Кн - коэффициент накладных расходов.

При Кн равным 5 % сумма накладных расходов Рн равна 1279,5 руб.

Все расчеты затрат на разработку представлены в таблице 6.5.


Таблица 6.5 - Затраты на разработку программного средства

Наименование статьи расходовСумма, руб.Материалы257,6Покупные комплектующие134,4Основная заработная плата разработчиков данного программного средства25590Дополнительная заработная плата разработчиков данного программного средства5118Отчисления на социальные нужды9212,4Прочие прямые расходы400Накладные расходы1279,5Всего41991,9

.2 Оценка ущерба, возникающего вследствие атаки на защищаемый объект


Затраты на обеспечение информационной безопасности не должны превышать стоимость защищаемого объекта или величину ущерба, который может возникнуть вследствие атаки на защищаемый объект. Основная проблема - это посчитать стоимость такого ущерба. Можно привести следующую упрощенную модель оценки ущерба.

Исходные данные:

расчет выполняется по одному отделу;

время простоя вследствие атаки, tП равно 2 час;

время восстановления после атаки, tВ равно 2 час;

время повторного ввода потерянной информации, tВИ равно 2 час;

зарплата обслуживающего персонала (администраторов и т.д.), ZО равно 150 рублей/час;

зарплата сотрудников атакованного узла или сегмента, ZС равно 130 рублей/час;

число обслуживающего персонала (администраторов и т.д.), NО равно 2;

число сотрудников атакованного узла или сегмента, NС равно 30;

объем продаж атакованного узла или сегмента, O равно 13000000 рублей;

стоимость замены оборудования или запасных частей, ПЗЧ равно 0 рублей;

число атакованных узлов или сегментов, I равно 1;

число атак в год, n равно 1.

Стоимость потерь от снижения производительности сотрудников атакованного узла или сегмента ПП будет равна:


ПП = NC х ZC х tП = 30 х 130 х 2 = 7800 руб.


Стоимость восстановления узла ППВ будет равна:


ППВ = NO х ZO х tВ = 2 х 150 х 2 = 600 руб.


Стоимость повторного ввода информации ПВИ будет равна:


ПВИ = NC х ZC х tВИ = 30 х 130 х 2 = 7800 руб.


Стоимость восстановления работоспособности атакованного узла ПВ будет равна:


ПВ = ПВИ + ППВ + ПЗЧ = 7800 + 600 + 0 = 8400 руб.


Упущенная выгода от простоя атакованного узла U будет равна:

= ПП + ПВ + V = 7800 + 8400 + 37500 = 53700 руб.,


Таким образом, общий ущерб от атаки на узел У составит:


У = U х I х n = 53700 х 1 х 1 = 53700 руб.


6.3 Подсчет возврата инвестиций


Предприятие будет нести расходы на "что-либо", в т.ч. и систему защиты, только в том случае, когда они не будут превышать доходы от внедрения этого "чего-либо". Поэтому необходимо подсчитать доходы и расходы от внедрения системы защиты. Такую задачу решает механизм подсчета возврата инвестиций (ROI). В данном случае упрощенно ROI можно подсчитать как сумма ущерба от успешно реализованной атаки на узел или сегмент поделенная на затраты на разработку программного средства для защиты. При выборе в качестве узла комнаты из отдела ,ROI равно 1,28 (расчет для этого узла приведен в предыдущем пункте). Таким образом уже после первой успешной атаки затраты на разработку программного средства полностью окупаются.


6.4 Расчет совокупной стоимости владения


В качестве примера использования методики ТСО для обоснования инвестиций на ИБ рассматривается проект создания системы проверки и контроля информационных систем на наличие слабых паролей.

Для этого сначала условно определяются две возможные степени готовности системы проверки и контроля информационных систем, а именно: базовую и высокую.

Базовая. Информационные системы используют встроенные средства для контроля информационных систем на наличие слабых паролей. Основная цель уровня - организация минимального уровня контроля информационных систем при небольших затратах.

Высокая. Информационные системы используют разработанное программное средство для контроля информационных систем на наличие слабых паролей.

Проект по созданию корпоративной системы защиты информации от вирусов предполагает определенное развитие и переход от некоторого базового уровня к более высокому уровню. В таблице 6.6 приведены характеристики процесса развития системы проверки и контроля информационных систем на наличие слабых паролей.


Таблица 6.6 - Характеристики процесса развития системы проверки и контроля информационных систем

ПроцессЗадачаБазовый уровеньВысокий уровеньКонтроль информационных системКакие средства используются для контроля?Базовые средства, либо вообще не используютсяИспользуется разработанное программное средствоКонтроль информационных системКакие пароли относятся к категории «слабые»?Небольшой список паролей, которые не удовлетворяют стандартной политикеЗаданные администратором критерии пароляКонтроль информационных системКакой процент рабочих мест использует разработанное программное средство?0%100%Продолжение таблицы 6.6ПроцессЗадачаБазовый уровеньВысокий уровеньКонтроль информационных системКак устраняются «слабые» пароли?Пользователь самостоятельно устанавливает новый парольАдминистратор устанавливает случайный пароль пользователю, соответствующий действующей политике

В таблице 6.7 представлен список статей и возможный уровень снижения расходов при развитии процесса контроля информационных систем.

Таблица 6.7 - Список статей и возможный уровень снижения расходов

Статья затратКонтроль информационных системУстановка ПО1%Расходы на операции ИС3%Планирование и управление процессами5%Обучение персонала5%Количество незапланированных простоев80%

В таблице 6.8 представлен уровень снижения расходов при переходе на более высокий уровень.


Таблица 6.8 - Уровень снижения расходов

Расходы на ИТБазовый уровень, руб.Высокий уровень, руб.Совокупная стоимость владения (ТСО)20987002088990Расходы на HW/SW15000001515000Продолжение таблицы 6.8Расходы на ИТБазовый уровень, руб.Высокий уровень, руб.Расходы на операции ИС450000463500Административные расходы7000073500Расходы на операции конечных пользователей2500026250Расходы на простои5370010740

Расходы на аппаратные средства и программное обеспечение. Эта категория модели ТСО включает серверы, компьютеры клиентов (настольные и мобильные компьютеры), периферийные устройства и сетевые компоненты. Расходы на аппаратно-программные средства ИС также входят в эту категорию.

Расходы на операции ИС. Прямые затраты на содержание персонала, стоимость работ и аутсорсинг, произведенные компанией в целом, бизнес-подразделениями или ИС службой для осуществления технической поддержки и операций по поддержанию инфраструктуры для пользователей распределенных вычислений.

Административные расходы. Прямые затраты на персонал, обеспечение деятельности и расходы внутренних/внешних поставщиков (вендоров) на поддержку ИС операций, включающих управление, финансирование, приобретение и обучение ИС.

Расходы на операции конечных пользователей. Это затраты на самоподдержку конечных пользователей, а также на поддержку пользователей друг друга в противовес официальной ИС поддержке. Затраты включают: самостоятельную поддержку, официальное обучение конечных пользователей, нерегулярное (неофициальное) обучение, самостоятельные прикладные разработки, поддержку локальной файловой системы.

Расходы на простои. Данная категория учитывает ежегодные потери производительности конечных пользователей от запланированных и незапланированных отключений сетевых ресурсов, включая клиентские компьютеры, совместно используемые серверы, принтеры, прикладные программы, коммуникационные ресурсы и ПО для связи. Для анализа фактической стоимости простоев, которые связаны с перебоями в работе сети и которые оказывают влияние на производительность, исходные данные получают из обзора по конечным пользователям. Рассматриваются только те простои, которые ведут к потере производительности.

Полученные данные говорят о снижении ТСО на 9710 рублей в год, позволяя обосновать инвестиции в размере 41991,9 рублей. При этом период окупаемости составит не более 5 лет.


7. Организация рабочего места пользователя ПЭВМ при разработке программного средства для аудита паролей


.1 Обеспечение охраны труда


Институт охраны труда является одним из важнейших институтов трудового права, так как входящие в него нормы призваны обеспечить здоровые и безопасные условия труда работников и предупреждать несчастные случаи на производстве и профессиональные заболевания.

В настоящее время в связи с внедрением новых технологических процессов возникают проблемы в области охраны труда и здоровья работников с учетом повышения ответственности за ущерб, причиненный жизни и здоровью работников.

Охрана труда действительно нужна, и вот несколько причин этому. Первая из ряда причин - протекционная. Зашита рабочих от вредных факторов условий труда, ликвидация узких моментов, связанных с деятельность рабочих в рамках опасных производственных факторов приводит к сокращению травматизма на предприятии и уменьшению случаев заболеваний, связанных с трудовой деятельностью. При благоприятном развитии событий увеличится производительность труда. Второй причиной является социальная. Охрана труда является одной из форм проявления лояльности руководства к работникам. При проведении различных тренингов и занятий, призывающих повысить грамотность работников на рабочих местах, у них возникает стойкая уверенность в том, что работодатель не хочет пускать на самотек работу предприятия. Лояльность работников повышается и, как следствие, производительность их труда увеличивается.

В России законодательно разрешено иметь на каждом предприятии комитеты (комиссии) по охране труда, состоящие из представителей работодателя и трудового коллектива. Однако реально на большинстве предприятий вопросам охраны труда не уделяется должного внимания, и борьба трудящихся за свои права протекает в настоящее время чрезвычайно вяло и во многих случаях неэффективно.


7.2 Анализ опасных и вредных факторов на рабочем месте пользователя


Трудовая деятельность при разработке программного средства для аудита паролей заключается в длительной работе с ПЭВМ и большим количеством информации. Для работы выделено отдельное рабочее место. Согласно [8] данный вид трудовой деятельности относится к форме интеллектуального (умственного) труда.

Согласно [5], опасные и вредные производственные факторы, характерные для данной трудовой деятельности, следующие:

а) повышенное значение напряжения в электрической цепи, замыкание которой может произойти через тело человека и повышенный уровень статического электричества.

Действие электрического тока на живую ткань носит разносторонний и своеобразный характер [7]. Проходя через организм человека электроток производит термическое, электролитическое, механическое и биологическое воздействия.

Термическое действие тока проявляется ожогами отдельных участков тела, нагревом до высокой температуры органов, расположенных на пути тока, вызывая в них значительные функциональные расстройства. Электролитическое действие тока выражается в разложении органической жидкости, в том числе крови, в нарушении ее физико-химического состава. Механическое действие тока приводит к расслоению, разрыву тканей организма в результате электродинамического эффекта, а также мгновенного взрывоподобного образования пара из тканевой жидкости и крови. Биологическое действие тока проявляется раздражением и возбуждением живых тканей организма, а также нарушением внутренних биологических процессы.

Исход поражения человека электротоком зависит от многих факторов: силы тока и времени его прохождения через организм, характеристики тока (переменный или постоянный), пути тока в теле человека, при переменном токе - от частоты колебаний.

На сопротивление организма воздействию электрического тока оказывает влияние физическое и психическое состояние человека. Неблагоприятный микроклимат (повышенная температура, влажность) увеличивает опасность поражения током, т.к. влага (пот) понижает сопротивление кожных покровов.

б) отсутствие или недостаток естественного света, недостаточная освещенность рабочей зоны, повышенная яркость света, пониженная контрастность, прямая и отраженная блесткость, повышенная пульсация светового потока.

Освещение воздействует на организм человека и выполнение производственных заданий. Правильное освещение уменьшает количество несчастных случаев и повышает производительность труда на 15% [8]. Неправильное освещение может быть причиной таких заболеваний, как близорукость, спазм, аккомодация, зрительное утомление, и других болезней, понижает умственную и физическую работоспособность, увеличивает число ошибок в производственных процессах, аварий и несчастных случаев.

Освещение, отвечающее техническим и санитарно-гигиеническим нормам, называется рациональным. Создание такого освещения на производстве является важной и актуальной задачей;

в) умственное перенапряжение.

Продолжительная умственная работа приводит к падению условных сосудистых рефлексов и образованию парадоксальных реакций [8]. При напряженной умственной работе происходят изменения функций дыхательной системы.

Напряженный умственный труд вызывает отклонение от нормы тонуса гладких мышц внутренних органов, кровеносных сосудов, в особенности сосудов мозга и сердца. С другой стороны, огромное количество импульсов, идущих от периферии и внутренних органов, влияет на ход умственной работы.

Интенсивная работа, как физическая, так и умственная, может привести к утомлению и переутомлению;

г) монотонность труда.

Монотомия - одно из отрицательных последствий труда, которое выражается в преждевременной усталости и нервном истощении [8]. В основе этого явления лежит преобладание процесса торможения в корковой деятельности, развивающееся при действии однообразных повторных раздражителей, что снижает возбудимость анализаторов, рассеивает внимание, уменьшает скорость реакции, и, как следствие, быстро наступает утомление;

д) повышенный уровень электромагнитных излучений, повышенная напряженность электрического поля и повышенная напряженность магнитного поля.

Электромагнитные волны лишь частично поглощаются тканями биологического объекта, поэтому биологический эффект зависит от физических параметров ЭМП радиочастот: длины волны (частоты колебаний), интенсивности и режима излучения (непрерывный, прерывистый, импульсно-модулированный), продолжительности и характера облучения организма (постоянное, интермиттирующее), а также от площади облучаемой поверхности и анатомического строения органа или ткани [8]. Степень поглощения энергии тканями зависит от их способности к ее отражению на границах раздела, определяемой содержанием воды в тканях и другими их особенностями. При воздействии ЭМП на биологический объект происходит преобразование электромагнитной энергии внешнего поля в тепловую, что сопровождается повышением температуры тела или локальным избирательным нагревом тканей, органов, клеток, особенно с плохой терморегуляцией. Тепловой эффект зависит от интенсивности облучения.

Поражение глаз в виде помутнения хрусталика - катаракты - является одним из наиболее характерных специфических последствий воздействия ЭМП в условиях производства. Помимо этого следует иметь в виду и возможность неблагоприятного воздействия ЭМП-облучения на сетчатку и другие анатомические образования зрительного анализатора.


7.3 Мероприятия по обеспечению безопасных условий труда на рабочем месте пользователя


Мероприятия разрабатывались согласно требованиям, описанным в [6]. Были разработаны следующие мероприятия по обеспечению безопасных условий труда на рабочем месте пользователя:

а) организация рабочего места пользователя:

) использование рабочего стола с габаритами: высота 760 мм, ширина рабочей поверхности 1000 мм, глубина рабочей поверхности 800 мм, высота пространства для ног 700 мм, ширина пространства для ног 600мм;

) расположение клавиатуры на расстоянии 200 мм от края стола;

) использование сиденья с закругленным передним краем, с регулировкой наклона от 5 до 10 градусов и высоты от 400 до 550 мм, с подлокотниками;

) использование подставки для ног шириной 300 мм, глубиной 400 мм;

б) соответствие ПЭВМ установленным требованиям:

) контроль за следующими гигиеническими параметрами: уровень электромагнитных полей (ЭМП), акустического шума, концентрации вредных веществ в воздухе, визуальные показатели видеотерминала;

) соответствие значений допустимого уровня звукового давления и уровня звука значениям, приведенным в таблице 7.1;


Таблица 7.1 - Допустимые значения уровней звукового давления в октавных полосах частот и уровня звука, создаваемого ПЭВМ

Уровни звукового давления в октавных полосах со среднегеометрическими частотамиУровни звука в дБА31,5 Гц63 Гц125 Гц250 Гц500 Гц1000 Гц2000 Гц4000 Гц8000 Гц86 дБ71 дБ61 дБ54 дБ49 дБ45 дБ42 дБ40 дБ38 дБ50

) соответствие временных допустимых уровней звуковых полей значениям, приведенным в таблице 7.2;


Таблица 7.2 - Временные допустимые уровни ЭМП, создаваемых ПЭВМ

Наименование параметровВДУ ЭМПНапряженность электрического поляв диапазоне частот 5 Гц - 2 кГц25 В/мв диапазоне частот 2 кГц - 400 кГц2,5 В/мПлотность магнитного потокав диапазоне частот 5 Гц - 2 кГц250 нТлв диапазоне частот 2 кГц - 400 кГц25 нТлЭлектростатический потенциал экрана видеомонитора500 В

) использование конструкции монитора, которая позволяет осуществлять поворот в горизонтальной и фронтальной плоскости с фиксацией в заданном положении;

в) использование искусственного освещения:

) использование искусственного освещения, соответствующего следующим требованиям: освещенность на поверхности стола в зоне размещения рабочего документа в интервале от 300 до 500 лк, освещенность поверхности экрана не более 300 лк, яркость бликов на экране монитора не выше 40 кд/м2, яркость потолка не выше 200 кд/м2, показатель ослепленности не более 20, коэффициент пульсации не более 5%;

) использование в качестве источников света люминисцентных ламп типа ЛБ в количестве 4 штук;

) производить чистку стекол, оконных рам и светильников не реже двух раз в год;

г) уменьшение уровня электромагнитных полей на рабочем месте и вероятности поражения электрическим током:

) использование защитного заземления;

) использование экранирования для соответствия временных допустимых уровней ЭМП значениям, приведенным в таблице 7.3;


Таблица 7.3 - Временные допустимые уровни ЭМП, создаваемых ПЭВМ на рабочих местах

Наименование параметровВДУНапряженность электрического поляв диапазоне частот 5 Гц - 2 кГц25 В/мв диапазоне частот 2 кГц - 400 кГц2,5 В/мПлотность магнитного потокав диапазоне частот 5 Гц - 2 кГц250 нТлв диапазоне частот 2 кГц - 400 кГц25 нТлНапряженность электростатического поля15 кВ/м

д) использование монитора с нормированными параметрами:

) соответствие визуальных параметров монитора значениям, приведенным в таблице 7.4;


Таблица 7.4 - Визуальные параметры ВДТ, контролируемые на рабочих местах

ПараметрыДопустимые значенияЯркость белого поляНе менее 35 кд/м2Неравномерность яркости рабочего поляНе более ± 20 %Контрастность (для монохромного режима)Не менее 3 : 1Временная нестабильность изображения (мелькание)Не должна фиксироватьсяПродолжение таблицы 7.4ПараметрыДопустимые значенияПространственная нестабильность изображения (дрожание)Не более 2 × 10-4L, где L - проектное расстояние наблюдения, мм

) соответствие блесткости не более 200 кд/м2, яркости бликов на мониторе не более 40 кд/м2;

е) Мероприятия для предотвращения утомления: перерывы на отдых в интервале от 5 до 10 минут каждый час.


7.4 Оценка напряженности трудового процесса


Оценка проводилась в соответствии с [9].

Показатели напряженности трудового процесса:

а) интеллектуальные нагрузки:

) содержание работы - решение сложных задач с выбором по известным алгоритмам (работа по серии инструкций). По данному пункту трудовой процесс относится к классу вредный 1 степени;

) восприятие сигналов (информации) и их оценка - восприятие сигналов с последующим сопоставлением фактических значений параметров с их номинальными значениями. Заключительная оценка фактических значений параметров. По данному пункту трудовой процесс относится к классу вредный 1 степени;

) распределение функций по степени сложности задания - обработка, выполнение задания и его проверка. По данному пункту трудовой процесс относится к классу допустимый;

) характер выполняемой работы - работа по установленному графику с возможной его коррекцией по ходу деятельности. По данному пункту трудовой процесс относится к классу допустимый;

б) сенсорные нагрузки:

) длительность сосредоточенного наблюдения (% времени смены) - около 60%. По данному пункту трудовой процесс относится к классу вредный 1 степени;

) плотность сигналов (световых, звуковых) и сообщений в среднем за 1 час работы - около 100. По данному пункту трудовой процесс относится к классу допустимый;

) число производственных объектов одновременного наблюдения - 3. По данному пункту трудовой процесс относится к классу оптимальный;

) размер объекта различения (при расстоянии от глаз работающего до объекта различения не более 0,5 м) в мм при длительности сосредоточенного наблюдения (% времени смены) - 1,1 мм (более 50 %); 0,3 мм (до 50 %). По данному пункту трудовой процесс относится к классу допустимый;

) работа с оптическими приборами (микроскопы, лупы и т.п.) при длительности сосредоточенного наблюдения (% времени смены) - 0%. По данному пункту трудовой процесс относится к классу оптимальный;

) наблюдение за экранами видеотерминалов (часов в смену): при буквенно-цифровом типе отображения информации, при графическом типе отображения информации - около 5 часов. По данному пункту трудовой процесс относится к классу вредный 1 степени;

) нагрузка на слуховой анализатор (при производственной необходимости восприятия речи или дифференцированных сигналов) - разборчивость сигналов 80%, помехи не препятствуют слышимости речи на расстоянии до 3,5 метров. По данному пункту трудовой процесс относится к классу допустимый;

) нагрузка на голосовой аппарат (суммарное количество часов, наговариваемое в неделю) - около 10. По данному пункту трудовой процесс относится к классу оптимальный;

в) эмоциональные нагрузки:

) степень ответственности за результат собственной деятельности. Значимость ошибки - несет ответственность за функциональное качество основной работы. Влечет за собой дополнительные усилия со стороны работника. По данному пункту трудовой процесс относится к классу вредный 1 степени;

) степень риска для собственной жизни - исключена. По данному пункту трудовой процесс относится к классу оптимальный;

) степень ответственности за безопасность других лиц - исключена. По данному пункту трудовой процесс относится к классу оптимальный;

) количество конфликтных ситуаций, обусловленных профессиональной деятельностью, за смену - отсутствуют. По данному пункту трудовой процесс относится к классу оптимальный;

г) монотонность нагрузок:

) число элементов (приемов), необходимых для реализации простого задания или в многократно повторяющихся операциях - более 10. По данному пункту трудовой процесс относится к классу оптимальный;

) продолжительность (в секундах) выполнения простых заданий или повторяющихся операция - более 100. По данному пункту трудовой процесс относится к классу оптимальный;

) время активных действий (в % к продолжительности смены). В остальное время наблюдение за ходом производственного процесса - около 25 процентов. По данному пункту трудовой процесс относится к классу оптимальный;

) монотонность производственной обстановки (время пассивного наблюдения за ходом техпроцесса в % от времени смены) - около 70 %. По данному пункту трудовой процесс относится к классу оптимальный;

д) режим работы:

) фактическая продолжительность рабочего дня - 8 часов. По данному пункту трудовой процесс относится к классу допустимый;

) сменность работы - односменная работа (без ночной смены). По данному пункту трудовой процесс относится к классу оптимальный;

) наличие регламентированных перерывов и их продолжительность - около 15% от рабочей смены. По данному пункту трудовой процесс относится к классу оптимальный.

Общая оценка трудовой деятельности по напряженности трудового процесса - допустимый (2 класс).


7.5 Пожарная безопасность


Важное значение в противопожарном отношении имеет правильная эксплуатация электрических сетей и приборов [8]. Электрическая сеть в эксплуатационном отношении должна отвечать противопожарным требованиям. К поражающим факторам пожаров относят задымление, затрудняющее ориентирование и сильный морально-психологический эффект.

Перед началом работы на ПЭВМ проводится вводный инструктаж по пожарной безопасности. Все работники организаций допускаются к работе только после прохождения противопожарного инструктажа, а при изменении специфики работы проходят дополнительное обучение по предупреждению и тушению возможных пожаров в порядке, установленном руководителем.

Для тушения пожара предполагается использовать углекислотный огнетушитель ОУ-5, предназначенный для тушения небольших очагов горения всех видов материалов, а также электроустановок, находящихся под напряжением до 1000 В.


Вывод


Были рассмотрены и изучены вопросы по БЖД для организации рабочего места при разработке программного средства для аудита паролей. Рассмотрены мероприятия по обеспечению безопасных условий труда на рабочем месте пользователя, включающие организацию рабочего места пользователя, контроль за техническими характеристиками ПЭВМ и монитора, организацию искусственного освещения, использование защитного заземления и защитных экранов. В результате рабочее место пользователя соответствует всем нормативным документам.

8. Технология оценки быстродействия критических участков программы


Требования к производительности программного обеспечения очень разные, но вероятно не секрет, что многие приложения имеют очень жесткие требования по скорости выполнения. В общем случае для всех приложений, кроме простейших, работает правило: чем выше производительность, тем более полезным и популярным будет приложение.

Разрабатываемое программное средство состоит из большого количества различных методов и функций, многие из которых вызываются лишь один раз и не требуют больших вычислительных ресурсов (например, метод определения информационной системы на носителе данных, метод извлечения списка хэшей из информационной системы и т.п.). Поэтому возникает проблема в выборе тех функций и методов, оптимизация которых реально позволит увеличить общую скорость выполнения программного средства. Одним из методов, позволяющих выявить «узкие» места программного средства для дальнейшей оптимизации, является профилирование.

При разработке программного средства в качестве среды разработки использовался Qt Creator, а также профилировщик gprof, входящий в состав QtCreator и поэтому не требующий никаких дополнительных действий по установке.

Профилирование с помощью gprof состоит из нескольких шагов:

компилирование и сборка программы с включенной опцией профилирования;

исполнение программы для создания файла данных о профиле;

запуск gprof для анализа полученного файла данных о профиле.

Необходимо запустить программное средство с включенным профилированием, создать файл данных о профиле и открыть полученный файл данных утилитой gprof. Необходимо рассмотреть только те методы, которые тратят много вычислительных ресурсов. В качестве порога для определения таких методов можно взять величину в 1 процент от общего времени выполнения программы. В таблице 8.1 представлены все такие методы.


Таблица 8.1 - Результаты профилировщика

Процент общего времени выполнения метода от общего времени выполнения программного средства, %Общее время выполнения метода, с.Количество вызовов методаИмя метода42,9812,1917895638Hash::NTLM_hash(QByteArray const&)13,793,91493324402QByteArray::size() const8,692,46152113291operator==(QByteArray const&, QByteArray const&)8,22,33304226867QByteArray::constData() const4,651,3253688659QBasicAtomicInt::deref()4,071,1617895652QVector<QByteArray>::indexOf(QByteArray const&, int) const2,890,8253686999QByteArray::~QByteArray()2,430,6917895630Hash::check_hash(QByteArray const&)2,030,5736984311QByteArray::at(int) const2,010,571Hash::brute_force(QByteArray const&, unsigned char const&, unsigned char const&)1,990,5617895698QByteArray::QByteArray(QByteArray const&)1,180,3417895653QByteArray::detach()10,2817896498QBasicAtomicInt::ref()

Метод NTLM_hash(QByteArray const&) класса Hash - используется для вычисления NTLM-хэша от пароля. Этот метод наиболее критичен в данном примере и именно он должен занимать как можно большее количество вычислительных ресурсов и выполняться как можно меньше времени.

Метод size() класса QByteArray - стандартный метод класса QByteArray из библиотеки qt4, определяющий размер объекта QByteArray.

Метод operator==(QByteArray const&, QByteArray const&) класса QByteArray - стандартный метод класса QByteArray из библиотеки qt4, сравнивающий два объекта класса QByteArray.

Метод constData() класса QByteArray - стандартный метод класса QByteArray из библиотеки qt4, преобразующий содержимое объекта класса QByteArray к типу char*.

Метод deref() класса QBasicAtomicInt - напрямую не используется, а вызывается через другие классы. В стандартной документации не описан.

Метод indexOf(QByteArray const&, int) класса QVector - стандартный метод класса QVector из библиотеки qt4, используется для поиска по массиву хэшей.

Метод ~QByteArray() класса QByteArray - стандартный метод класса QByteArray из библиотеки qt4, используется для удаления объекта QByteArray.

Метод check_hash(QByteArray const&) класса Hash - используется для выбора алгоритма хэширования.

Метод at(int) класса QByteArray - стандартный метод класса QByteArray библиотеки qt4, используется для выделения одного символа по его номеру.

Метод brute_force(QByteArray const&, unsigned char const&, unsigned char const&) класса Hash - метод, осуществляющий полный перебор значений по заданным параметрам.

Метод QByteArray(QByteArray const&) класса QByteArray - стандартный метод класса QByteArray библиотеки qt4, используется для копирования объекта типа QByteArray.

Метод detach() класса QByteArray - напрямую не используется, а вызывается через другие классы. В стандартной документации не описан.

Метод ref() класса QBasicAtomicInt - напрямую не используется, а вызывается через другие классы. В стандартной документации не описан.

Большая часть вычислительных ресурсов при такой реализации тратится впустую. Для оптимизации уберем использование класса QByteArray, а также немного исправим реализацию хэш-функции.

Снова запускаем программу с профилированием с и выведем методы, выполняющиеся более 1 процента от общего времени выполнения программного средства. В таблице 8.2 представлены все такие методы.


Таблица 8.2 - Результаты профилировщика

Процент общего времени выполнения метода от общего времени выполнения программного средства, %Общее время выполнения метода, сКоличество вызовов методаИмя метода84,967,8517895650Hash::NTLM_hash(QByteArray const&)9,850,9117895620QVector<unsigned int>::indexOf(unsigned int const&, int) const2,710,2517895632Hash::check_hash(char*)2,380,221Hash::brute_force(char const*, unsigned char const&, unsigned char const&)

После оптимизации количество методов, выполняющихся более чем 1 процент от общего времени выполнения программного средства, равняется 4. Класс QVector необходим для поддержки поиска по большим массивам хэшей, поэтому убирать его нецелесообразно.

Метод NTLM_hash(QByteArray const&) класса Hash, который оценивался профилировщиком, стал выполняться 7,85 с против 12,19 с до оптимизации, тратя при этом 84,96% вычислительных ресурсов против 42,98%. Таким образом, вычислительные ресурсы стала использоваться более рационально и увеличилась скорость работы программного средства.

9. Ведомость соответствия


Ведомость соответствия ВКР требованиям задания на ВКР представлена в таблице 9.1.


Таблица 9.1 - Ведомость соответствия ВКР

Номер пункта заданияСодержание требованияГде отображено выполнение2Технические требования:- программное средство должно быть реализовано на аппаратной платформе x86-32;Раздел 4- программное средство должно реализовывать методы: предварительного анализа, полного перебора, поиска по маске, простого поиска по словарям, комбинированного поиска по словарям, гибридного поиска по словарям, поиска по rainbow tables (радужным таблицам);Раздел 1, раздел 2, раздел 3- в программном средстве должна быть реализована возможность установки пользователем настроек методов аудита;Раздел 2, раздел 3, раздел 4- в программном средстве должна быть предоставлена возможность использования хэш-функций: MD5(UNIX), SHA-256(UNIX), SHA-512(UNIX), LM-хэш, NTLM-хэш;Раздел 2, раздел 3- программное средство должно функционировать в операционных системах семейства Linux;Раздел 4Номер пункта заданияСодержание требованияГде отображено выполнение- программное средство должно быть разработано с использованием библиотеки qt4.Раздел 4Пояснительная записка:- обзор и сравнительный анализ существующих методов и средств аудита паролей по значениям известных хэш-функций от паролей;Раздел 1- порядок проведения аудита для конкретных типов ОС;Раздел 2- разработка алгоритмов для методов аудита паролей;Раздел 3- разработка графического интерфейса для программного средства;Раздел 4- разработка руководства по применению программного средства для аудита паролей;Раздел 5- оценка затрат на обеспечение информационной безопасности предприятия, использующего программное средство для аудита паролей;Раздел 6- организация рабочего места пользователя ПЭВМ при разработке программного средства для аудита паролей;Раздел 7Номер пункта заданияСодержание требованияГде отображено выполнение- технология оценки быстродействия критических участков программы.Раздел 83Графическая часть- сравнительная характеристика преимуществ и недостатков существующих методов аудита паролей по значениям известных хэш-функций от паролей - 1л., ф. А1 (плакат);ВВКР, документация прочая- зависимость эффективности различных методов аудита от вида «слабого» пароля - 1л., ф. А1 (плакат);ВВКР, документация прочая- особенности хранения паролей в операционных системах семейства Linux - 1л., ф. А1 (плакат);ВВКР, документация прочая- особенности хранения паролей в операционных системах семейства Windows - 1л., ф. А1 (плакат);ВВКР, документация прочая- устройство rainbow tables (радужных таблиц) - 1л., ф. А1 (плакат);ВВКР, документация прочая- алгоритм поиска по rainbow tables (радужным таблицам) - 1л., ф. А1 (плакат).ВВКР, документация прочая

ЗАКЛЮЧЕНИЕ


В ходе дипломного проектирования было написано программное средство для аудита пароля в информационных системах.

В качестве языка программирования был использован язык С++, а также библиотека qt4. В качестве аппаратной и программной платформ использованы соответственно IBM PC совместимый компьютер и операционная система Linux.

Были разработаны наборы методов аудита паролей для конкретных типов информационных систем.

В экономической части проведен расчет оценки затрат на обеспечение информационной безопасности предприятия, использующего программное средство для аудита паролей.

В части по теме безопасности жизнедеятельности рассмотрена организация рабочего места пользователя ПЭВМ при разработке программного средства для аудита паролей.

В технологической части описана технология оценки быстродействия критических участков программы.

Таким образом, все пункты технического задания на выпускную квалификационную работу выполнены полностью.


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


1. «ГОСТ Р 34.10-2001. Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи».

2. Trustwave 2012 Global Security Report. // Trustwave [Электронный ресурс]. Режим доступа: http://www.trustwave.com/global-security-report?utm_expid=5000628-0. (Дата обращения: 29.10.2012).

3. The shifting security paradigm. // Deloitte [Электронный ресурс]. Режим доступа: #"justify">4/ Bruce Schneier. MySpace Passwords Arent So Dumb. // Blog Bruce Schneier [Электронный ресурс]. Режим доступа: #"justify">5. «ГОСТ 12.0.003-74 Опасные и вредные производственные факторы».

. Санитарно-эпидемиологические правила и нормативы
СанПиН 2.2.2.2.4.1340-03 (с изменениями от 25 апреля 2007 г.), Минздрав России, Москва 2003 год.
7. Белов С.В. Безопасность жизнедеятельности - М.: Высш. шк., 2007 - 616c.

. Э.А. Арустамов. Безопасность жизнедеятельности - М.: Изд-во «Дашков и К°», 2006 - 476c.

9. «Р 2.2.2006-05 Руководство по гигиенической оценке факторов рабочей среды и трудового процесса. Критерии и классификация условий труда».


ПРИЛОЖЕНИЕ


Код программного средства

.pro


HEADERS = diplom.h \_task_window.h \.h= main.cpp \.cpp \_task_window.cpp \.cpp

+= crypto

+= -lcrypt


//QMAKE_CXXFLAGS_DEBUG += -pg

//QMAKE_LFLAGS_DEBUG += -pg

.cpp


#include <QApplication>

#include <QTextCodec>

#include <QtCrypto>


#include "diplom.h"

main(int argc, char * argv[])

{app(argc, argv);::Initializer init;::setCodecForTr(QTextCodec::codecForName("UTF-8"));::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));main_window;_window.show();

app.exec();

}

.h


#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>

#include "hash.h"

#include "add_task_window.h"

_BEGIN_NAMESPACEQFileDialog;QGroupBox;QLabel;QLineEdit;QPushButton;QSpinBox;QTableWidget;QTimer;_END_NAMESPACE

MainWindow : public QMainWindow

{_OBJECT

:

();

:

closeEvent(QCloseEvent *);

slots:

go();stop();show_add_task_window();hide_add_task_window();add_task();del_task();auto_task();find_system();change_path();show_progress();show_result();show_find_password(const QString &,const QString &);show_message(const QString &);:clear_parametrs();lock_button();unlock_button();clear_tables();

find_salt(const QString &);get_info_from_linux();get_info_from_windows();

add_task_linux_md5();add_task_linux_sha256();add_task_linux_sha512();add_task_windows_LM();add_task_windows_NTLM();

*thread_hash;

_task_window *window_add_task;

*main_window_Rect,

*add_task_window_Rect;

number_task;algorithm;

previous_current;

time_from_start;

*timer;word,word1,word2;path;

reg;

*table_task_status,

*table_hash_password;

*path_LineEdit;

*find_PushButton,

*change_path_PushButton;

*go_PushButton,

*stop_PushButton,

*add_task_PushButton,

*del_task_PushButton;

*status;

};


#endif

.cpp


#include <QtGui>


#include "diplom.h"

#include "hash.h"

{_linux_md5=3,_windows_LM=4,_windows_NTLM=5,_linux_sha256=6,_linux_sha512=7,

};

::MainWindow()

{.setMinimal(true);

_PushButton=new QPushButton(this);_PushButton->setText(tr("Начать аудит"));(go_PushButton,SIGNAL(clicked()),this,SLOT(go()));_PushButton->setEnabled(false);

_PushButton=new QPushButton(this);_PushButton->setText(tr("Отменить аудит"));(stop_PushButton,SIGNAL(clicked()),this,SLOT(stop()));_PushButton->setEnabled(false);

_task_PushButton=new QPushButton(this);_task_PushButton->setText(tr("Добавить задачу"));(add_task_PushButton,SIGNAL(clicked()),this,SLOT(show_add_task_window()));_task_PushButton->setEnabled(false);

_task_PushButton=new QPushButton(this);_task_PushButton->setText(tr("Удалить задачу"));(del_task_PushButton,SIGNAL(clicked()),this,SLOT(del_task()));_task_PushButton->setEnabled(false);

_task_status=new QTableWidget(this);*list=new QStringList();_task_status->setColumnCount(3);>insert(0,tr("Задача"));>insert(1,tr("Статус"));_task_status->setHorizontalHeaderLabels(*list);_task_status->setColumnHidden(2,true);_task_status->horizontalHeader()->resizeSection(1,200);_task_status->horizontalHeader()->setResizeMode(0,QHeaderView::Stretch);_task_status->horizontalHeader()->setResizeMode(1,QHeaderView::Fixed);

_hash_password=new QTableWidget(this);*list1=new QStringList();_hash_password->setColumnCount(4);->insert(0,tr("Логин"));->insert(1,tr("Хэш"));->insert(2,tr("Соль"));->insert(3,tr("Пароль"));_hash_password->setHorizontalHeaderLabels(*list1);_hash_password->setColumnHidden(2,true);_hash_password->horizontalHeader()->resizeSection(0,200);_hash_password->horizontalHeader()->resizeSection(2,200);_hash_password->horizontalHeader()->resizeSection(3,200);_hash_password->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);_hash_password->horizontalHeader()->setResizeMode(1,QHeaderView::Stretch);_hash_password->horizontalHeader()->setResizeMode(2,QHeaderView::Fixed);_hash_password->horizontalHeader()->setResizeMode(3,QHeaderView::Fixed);_hash_password->setTextElideMode(Qt::ElideMiddle);

_LineEdit=new QLineEdit(this);_LineEdit->setAlignment(Qt::AlignRight);_LineEdit->setText("/media/802C94C42C94B71E");

_path_PushButton=new QPushButton(this);_path_PushButton->setText(tr("Обзор"));(change_path_PushButton,SIGNAL(clicked()),this,SLOT(change_path()));

_PushButton=new QPushButton(this);

find_PushButton->setText(tr("Определить информационную систему"));

connect(find_PushButton,SIGNAL(clicked()),this,SLOT(find_system()));

=new QStatusBar(this);>setSizeGripEnabled(false);(status);

=new QTimer(this);>setInterval(1000);(timer,SIGNAL(timeout()),this,SLOT(show_progress()));

*add_task_Layout=new QHBoxLayout();_task_Layout->addWidget(add_task_PushButton);_task_Layout->addWidget(del_task_PushButton);_task_Layout->addWidget(go_PushButton);_task_Layout->addWidget(stop_PushButton);

*find_Layout=new QHBoxLayout();_Layout->addWidget(path_LineEdit);_Layout->addWidget(change_path_PushButton);_Layout->addWidget(find_PushButton);

*main_Layout=new QVBoxLayout();_Layout->addWidget(table_task_status);_Layout->addLayout(add_task_Layout);_Layout->addWidget(table_hash_password);_Layout->addLayout(find_Layout);

*main_Widget=new QWidget(this);_Widget->setLayout(main_Layout);

(main_Widget);(tr("Аудит паролей"));

//setMinimumWidth(1000);


// центрирование главного окна_window_Rect=new QRect();_task_window_Rect=new QRect();

*main_window_Rect=frameGeometry();_window_Rect->moveCenter(QDesktopWidget().availableGeometry().center());(main_window_Rect->topLeft());

// класс для работы с хэшами

thread_hash=new Hash();

connect(thread_hash,SIGNAL(complete()),this,SLOT(show_result()));(thread_hash,SIGNAL(find_hash(QString,QString)),this,SLOT(show_find_password(QString,QString)));(thread_hash,SIGNAL(message(QString)),this,SLOT(show_message(QString)));(thread_hash,SIGNAL(start_timer()),timer,SLOT(start()));


// класс для окна "Добавить задачу"

window_add_task=new add_task_window(this);(window_add_task,SIGNAL(ok()),this,SLOT(add_task()));(window_add_task,SIGNAL(cansel()),this,SLOT(hide_add_task_window()));

}

MainWindow::show_progress()

{_from_start++;>start();

copy_current=thread_hash->current;(copy_current>0)

{>showMessage(tr("Прошло ")+word.setNum(time_from_start,10)+tr(" c. ")+("Проверено ")+word1.setNum(copy_current,10)+tr(" шт. ")+("Скорость ")+word2.setNum(copy_current-previous_current,10)+tr(" шт/с."));_current=copy_current;

}

}

MainWindow::show_result()

{>stop();>showMessage(tr("Завершено за ")+word.setNum(time_from_start,10)+tr(" c. ")+("Проверено вариантов ")+word1.setNum(thread_hash->current,10)+tr(" шт."));_button();

}

MainWindow::show_find_password(const QString &password,const QString &hash)

{((algorithm==type_linux_md5) || (algorithm==type_linux_sha256) || (algorithm==type_linux_sha512) || (algorithm==type_windows_NTLM))

{(quint8 i=0;i<table_hash_password->rowCount();i++)(table_hash_password->item(i,1)->text()==hash)

{(password.isEmpty())

{*newItem=new QTableWidgetItem(tr("%1").arg(tr("Пароль не установлен")));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);

}

{*newItem=new QTableWidgetItem(tr("%1").arg(password));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);

}

}

}if (algorithm==type_windows_LM)

{

// если пароль не установлен(hash=="aad3b435b51404eeaad3b435b51404ee")

{(quint8 i=0;i<table_hash_password->rowCount();i++)(table_hash_password->item(i,1)->text()==hash)

{=tr("Пароль не установлен");


QTableWidgetItem *newItem=new QTableWidgetItem(tr("%1").arg(word));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);

};

}

{

// ищем по левым половинкам

for(quint8 i=0;i<table_hash_password->rowCount();i++)(table_hash_password->item(i,1)->text().left(16)==hash)

{password_from_table=table_hash_password->item(i,3)->text();hash_from_table=table_hash_password->item(i,1)->text();


// если правая еще не найдена

if (password_from_table.isEmpty())

{(hash_from_table.right(16)=="aad3b435b51404ee")=password;=password+"*******";

}

// если правая уже найдена=password_from_table.replace("*******",password);

*newItem=new QTableWidgetItem(tr("%1").arg(word));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);;

}


// ищем по правым половинкам(quint8 i=0;i<table_hash_password->rowCount();i++)(table_hash_password->item(i,1)->text().right(16)==hash)

{password_from_table=table_hash_password->item(i,3)->text();

(password_from_table.isEmpty())="*******"+password;=password_from_table.replace("*******",password);

*newItem=new QTableWidgetItem(tr("%1").arg(word));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);;

}

}

}

}

MainWindow::show_message(const QString &message)

{*newItem=new QTableWidgetItem(tr("%1").arg(message));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(number_task,1,newItem);

(message!=tr("В процессе"))_task++;

}MainWindow::go()

{(table_hash_password->rowCount()!=0)

{(table_task_status->rowCount()!=0)

{_tables();_parametrs();_hash->clear_parametrs();

i=0;

(i!=table_task_status->rowCount())

{_hash->tasks->append(table_task_status->item(i,2)->text());++;

}

=0;

(i!=table_hash_password->rowCount())

{_hash->before_hash_vector->append(table_hash_password->item(i,1)->text().toAscii().data());_hash->before_salt_vector->append(table_hash_password->item(i,2)->text().toAscii().data());_hash->login_vector->append(table_hash_password->item(i,0)->text().toAscii().data());++;

}_hash->type=algorithm;_hash->start(QThread::TimeCriticalPriority);

_button();

}

}

}

MainWindow::stop()

{_hash->stopped=true;_hash->wait();

}

MainWindow::closeEvent(QCloseEvent *event)

{_hash->stopped=true;_hash->wait();>accept();

}

MainWindow::clear_parametrs()

{_current=0;_from_start=0;_task=0;>showMessage("");

}

MainWindow::add_task()

{

task;table_task_status_task;.clear();_task_status_task.clear();yes_or_no=false;

(window_add_task->tab->currentIndex())

{0:

((!window_add_task->brute_force_alpha_LineEdit->text().isEmpty()) &&

(window_add_task->brute_force_min_length_SpinBox->value()<=window_add_task->brute_force_max_length_SpinBox->value()))

{.append("0");.append("arg1");.append(window_add_task->brute_force_alpha_LineEdit->text());.append("arg2");.append(word1.setNum(window_add_task->brute_force_min_length_SpinBox->value(),10));.append("arg3");.append(word1.setNum(window_add_task->brute_force_max_length_SpinBox->value(),10));.append("arg4");

_task_status_task.append(tr("Полный перебор на алфавите "));_task_status_task.append(window_add_task->brute_force_alpha_LineEdit->text());_task_status_task.append(tr(" с длиной пароля от "));_task_status_task.append(word1.setNum(window_add_task->brute_force_min_length_SpinBox->value(),10));_task_status_task.append(tr(" до "));_task_status_task.append(word1.setNum(window_add_task->brute_force_max_length_SpinBox->value(),10));_task_status_task.append(tr(" символов"));_or_no=true;

}

;

1:

((!window_add_task->brute_force_on_mask_alpha_LineEdit->text().isEmpty()) &&

(!window_add_task->brute_force_on_mask_mask_LineEdit->text().isEmpty()) &&

(window_add_task->brute_force_on_mask_min_on_left_length_SpinBox->value()<=window_add_task->brute_force_on_mask_max_on_left_length_SpinBox->value()) &&

(window_add_task->brute_force_on_mask_min_on_right_length_SpinBox->value()<=window_add_task->brute_force_on_mask_max_on_right_length_SpinBox->value()))

{.append("1");.append("arg1");.append(window_add_task->brute_force_on_mask_alpha_LineEdit->text());.append("arg2");.append(window_add_task->brute_force_on_mask_mask_LineEdit->text());.append("arg3");.append(word1.setNum(window_add_task->brute_force_on_mask_min_on_left_length_SpinBox->value(),10));.append("arg4");.append(word1.setNum(window_add_task->brute_force_on_mask_max_on_left_length_SpinBox->value(),10));.append("arg5");.append(word1.setNum(window_add_task->brute_force_on_mask_min_on_right_length_SpinBox->value(),10));.append("arg6");.append(word1.setNum(window_add_task->brute_force_on_mask_max_on_right_length_SpinBox->value(),10));.append("arg7");

_task_status_task.append(tr("Поиск по маске на алфавите "));_task_status_task.append(window_add_task->brute_force_on_mask_alpha_LineEdit->text());_task_status_task.append(tr(" с маской "));_task_status_task.append(window_add_task->brute_force_on_mask_mask_LineEdit->text());

table_task_status_task.append(tr(", количеством символов слева от маски от "));

table_task_status_task.append(word1.setNum(window_add_task->brute_force_on_mask_min_on_left_length_SpinBox->value(),10));_task_status_task.append(tr(" до "));_task_status_task.append(word1.setNum(window_add_task->brute_force_on_mask_max_on_left_length_SpinBox->value(),10));

table_task_status_task.append(tr(", количеством символов справа от маски от "));

table_task_status_task.append(word1.setNum(window_add_task->brute_force_on_mask_min_on_right_length_SpinBox->value(),10));_task_status_task.append(tr(" до "));_task_status_task.append(word1.setNum(window_add_task->brute_force_on_mask_max_on_right_length_SpinBox->value(),10));_or_no=true;

}

;

2:

(!window_add_task->brute_force_on_dictionary_filename_LineEdit->text().isEmpty())

{.append("2");.append("arg1");.append(window_add_task->brute_force_on_dictionary_filename_LineEdit->text());.append("arg2");

_task_status_task.append(tr("Поиск по словарю "));_task_status_task.append(window_add_task->brute_force_on_dictionary_filename_LineEdit->text());_task_status_task.append(tr(""));_or_no=true;

}

;3:

((!window_add_task->brute_force_on_dictionaries_filename1_LineEdit->text().isEmpty()) &&

(!window_add_task->brute_force_on_dictionaries_filename2_LineEdit->text().isEmpty()))

{.append("3");.append("arg1");.append(window_add_task->brute_force_on_dictionaries_filename1_LineEdit->text());.append("arg2");.append(window_add_task->brute_force_on_dictionaries_filename2_LineEdit->text());.append("arg3");

_task_status_task.append(tr("Комбинированный поиск по словарям "));_task_status_task.append(window_add_task->brute_force_on_dictionaries_filename1_LineEdit->text());_task_status_task.append(tr(" и "));_task_status_task.append(window_add_task->brute_force_on_dictionaries_filename2_LineEdit->text());

table_task_status_task.append(tr(" с конкатенацией исходных вариантов пароля"));

yes_or_no=true;

}

;4:(!window_add_task->brute_force_on_dictionary_gybrid_filename_LineEdit->text().isEmpty())

{.append("4");.append("arg1");.append(window_add_task->brute_force_on_dictionary_gybrid_filename_LineEdit->text());.append("arg2");

_task_status_task.append(tr("Гибридный поиск по словарю "));_task_status_task.append(window_add_task->brute_force_on_dictionary_gybrid_filename_LineEdit->text());_task_status_task.append(tr(""));_or_no=true;

}

;

5:

((!window_add_task->brute_force_on_dictionaries_gybrid_filename1_LineEdit->text().isEmpty()) &&

(!window_add_task->brute_force_on_dictionaries_gybrid_filename2_LineEdit->text().isEmpty()))

{.append("5");.append("arg1");.append(window_add_task->brute_force_on_dictionaries_gybrid_filename1_LineEdit->text());.append("arg2");.append(window_add_task->brute_force_on_dictionaries_gybrid_filename2_LineEdit->text());.append("arg3");

_task_status_task.append(tr("Гибридный поиск по словарям "));_task_status_task.append(window_add_task->brute_force_on_dictionaries_filename1_LineEdit->text());_task_status_task.append(tr(" и "));_task_status_task.append(window_add_task->brute_force_on_dictionaries_filename2_LineEdit->text());

table_task_status_task.append(tr(" с конкатенацией исходных вариантов пароля"));

yes_or_no=true;

}

;


}

(yes_or_no)

{_task_status->insertRow(table_task_status->rowCount());

*newItem=new QTableWidgetItem(tr("%1").arg(table_task_status_task));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem2);

_task_status->resizeRowsToContents();_add_task_window();

}

}

MainWindow::del_task()

{i=0;

(i<table_task_status->rowCount())

{(table_task_status->isItemSelected(table_task_status->item(i,0)))

{_task_status->removeRow(i);=0;;

}++;

}

}

MainWindow::lock_button()

{_PushButton->setEnabled(false);_task_PushButton->setEnabled(false);_task_PushButton->setEnabled(false);_path_PushButton->setEnabled(false);_PushButton->setEnabled(false);

_PushButton->setEnabled(true);

}

MainWindow::unlock_button()

{_PushButton->setEnabled(true);_task_PushButton->setEnabled(true);_task_PushButton->setEnabled(true);_path_PushButton->setEnabled(true);_PushButton->setEnabled(true);

_PushButton->setEnabled(false);

}

MainWindow::clear_tables()

{i=0;

(i!=table_task_status->rowCount())

{*newItem=new QTableWidgetItem(tr("%1").arg(""));>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(i,1,newItem);++;

}

=0;

(i!=table_hash_password->rowCount())

{*newItem=new QTableWidgetItem(tr("%1").arg(""));>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);++;

}

}

MainWindow::change_path()

{(!path_LineEdit->text().isEmpty())

{((path=QFileDialog::getExistingDirectory(this,tr("Открыть директорию")))!=NULL)_LineEdit->setText(path);

}

}

MainWindow::find_system()

{>showMessage("");=100;


// удаляем старые записи в таблицах(table_hash_password->rowCount())_hash_password->removeRow(0);(table_task_status->rowCount())_task_status->removeRow(0);

(!path_LineEdit->text().isEmpty())

{=path_LineEdit->text();

(QFile(path+"etc/passwd").exists())

{_info_from_linux();

// определяем алгоритм хэширования(table_hash_password->item(0,2)->text().left(2)=="$1")=type_linux_md5;if (table_hash_password->item(0,2)->text().left(2)=="$5")=type_linux_sha256;if (table_hash_password->item(0,2)->text().left(2)=="$6")=type_linux_sha512;

_task();


// забиваем пароли пустыми ячейками(quint8 i=0;i<table_hash_password->rowCount();i++)

{*newItem=new QTableWidgetItem(tr("%1").arg(""));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);

}_task_PushButton->setEnabled(true);_task_PushButton->setEnabled(true);_PushButton->setEnabled(true);

}if (QFile(path+"/WINDOWS/").exists())

{_info_from_windows();

_task();

(quint8 i=0;i<table_hash_password->rowCount();i++)

{*newItem=new QTableWidgetItem(tr("%1").arg(""));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(i,3,newItem);

}

_task_PushButton->setEnabled(true);_task_PushButton->setEnabled(true);_PushButton->setEnabled(true);

}>showMessage(tr("Информационная система не найдена"));

}


// выводим в статусную строку информацию о найденной информационной системе

if (algorithm==type_linux_md5)>showMessage(tr("Тип хэш-функции - md5(Unix)"));if (algorithm==type_linux_sha256)>showMessage(tr("Тип хэш-функции - sha256(Unix)"));if (algorithm==type_linux_sha512)>showMessage(tr("Тип хэш-функции - sha512(Unix)"));if (algorithm==type_windows_LM)>showMessage(tr("Тип хэш-функции - LM"));if (algorithm==type_windows_NTLM)>showMessage(tr("Тип хэш-функции - NTLM"));

}

MainWindow::get_info_from_linux()

{file(path+"etc/passwd");


// открываем файл /etc/passwd(!file.open(QIODevice::ReadOnly | QIODevice::Text))

{>showMessage(tr("Не хватает прав доступа для файла ")+path+tr("etc/passwd"));;

}

{buf[1024];lineLength_from_passwd;lineLength_from_shadow;


// считываем построчно из файла /etc/passwd((lineLength_from_passwd=file.readLine(buf,sizeof(buf)))!=-1)

{

// проверяем используется ли теневое хранение паролей

QString line_from_passwd=QByteArray(buf,lineLength_from_passwd).simplified();.setPattern(":.*:");_from_passwd.indexOf(reg);

hash_from_passwd=reg.capturedTexts().at(0);_from_passwd.remove(0,1);_from_passwd.chop(1);

login_from_passwd=line_from_passwd.left(line_from_passwd.indexOf(":"));


// если используется теневое хранение(hash_from_passwd=="x")

{

// открываем файл /etc/shadowfile1(path+"etc/shadow");

(!file1.open(QIODevice::ReadOnly | QIODevice::Text))>showMessage(tr("Не хватает прав доступа для файла ")+path+tr("etc/shadow"));

else

{

// считываем из файла /etc/shadow

while((lineLength_from_shadow=file1.readLine(buf,sizeof(buf)))!=-1)

{line_from_shadow=QByteArray(buf,lineLength_from_shadow).simplified();login_from_shadow=line_from_shadow.left(line_from_shadow.indexOf(":"));


// если имена совпали(login_from_passwd==login_from_shadow)

{.setPattern(":.*:");_from_shadow.indexOf(reg);

hash_from_shadow=reg.capturedTexts().at(0);_from_shadow.remove(0,1);_from_shadow.chop(1);


// если учетка не отключена и не заблокирована, пароль задан

if ((hash_from_shadow!="*") && (hash_from_shadow!="!") && (hash_from_shadow!="NP") && (hash_from_shadow!="LK") && (hash_from_shadow!="!!"))

{_hash_password->insertRow(table_hash_password->rowCount());

*newItem=new QTableWidgetItem(tr("%1").arg(login_from_shadow));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(hash_from_shadow));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(find_salt(hash_from_shadow)));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,2,newItem2);

}

;

}


}

.close();

}

}

// иначе если учетка не отключена

else if ((hash_from_passwd!="*") && (hash_from_passwd!="!") && (hash_from_passwd!="NP") && (hash_from_passwd!="LK") && (hash_from_passwd!="!!"))

{_hash_password->insertRow(table_hash_password->rowCount());

*newItem=new QTableWidgetItem(tr("%1").arg(login_from_passwd));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(hash_from_passwd));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(hash_from_passwd));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,2,newItem2);

}

}

.close();

}

}

MainWindow::get_info_from_windows()

{*script=new QProcess(this);program="/usr/bin/bkhive";arguments;

<<path+"/WINDOWS/system32/config/system"<<QDir::current().path()+"/test.txt";>start(program,arguments);>waitForFinished();

(script->exitStatus()==QProcess::NormalExit)

{.clear();>close();

="/usr/bin/samdump2";<<path+"/WINDOWS/system32/config/SAM"<<QDir::current().path()+"/test.txt";>start(program,arguments);>waitForFinished();(QDir::current().path()+"/test.txt").remove();

(script->exitStatus()==QProcess::NormalExit)

{::setCodecForCStrings(QTextCodec::codecForName("windows1251"));info_from_SAM=script->readAllStandardOutput().simplified();<QString> tags=info_from_SAM.split(':');tag;

use_LM=true;


// проверяем используются ли LM хэши(quint16 i=0;i<tags.count()-1;i+=6)

{((tags.at(i+2).isEmpty()) || (tags.at(i+2)=="aad3b435b51404eeaad3b435b51404ee"))

{_LM=false;;

}

}

(use_LM)=type_windows_LM;=type_windows_NTLM;


//use_LM=true; // убрать

//algorithm=type_windows_LM;

(quint16 i=0;i<tags.count()-1;i+=6)

{_hash_password->insertRow(table_hash_password->rowCount());

=tags.at(i);*newItem=new QTableWidgetItem(tr("%1").arg(tag));>setTextAlignment(Qt::AlignCenter);

//newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,0,newItem);

(use_LM)=tags.at(i+2);=tags.at(i+3);*newItem1=new QTableWidgetItem(tr("%1").arg(tag));->setTextAlignment(Qt::AlignCenter);

//newItem1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,1,newItem1);

(use_LM)=tags.at(i+3);=tags.at(i+2);

*newItem2=new QTableWidgetItem(tr("%1").arg(tag));->setTextAlignment(Qt::AlignCenter);

//newItem2->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_hash_password->setItem(table_hash_password->rowCount()-1,2,newItem2);

}

}>showMessage(tr("Ошибка при получении bootkey"));

}>showMessage(tr("Ошибка при получении хэшей"));

}

MainWindow::find_salt(const QString &hash)

{.setPattern("\\$.*\\$");.indexOf(reg);type_alg;_alg=reg.capturedTexts().at(0);

((type_alg=="$1$") || (type_alg=="$5$") || (type_alg=="$6$"))hash.left(hash.lastIndexOf("$")+1);"";

}

MainWindow::add_task_linux_md5()

{task;table_task_status_task;.clear();_task_status_task.clear();


/*

*/

*newItem=new QTableWidgetItem(tr("%1").arg(table_task_status_task));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem1);*newItem2=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem2);

_task_status->resizeRowsToContents();

}

MainWindow::add_task_linux_sha256()

{task;table_task_status_task;.clear();_task_status_task.clear();


/*

*/

*newItem=new QTableWidgetItem(tr("%1").arg(table_task_status_task));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem2);_task_status->resizeRowsToContents();

}

MainWindow::add_task_linux_sha512()

{task;table_task_status_task;.clear();_task_status_task.clear();


/*

*/

*newItem=new QTableWidgetItem(tr("%1").arg(table_task_status_task));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem2);

_task_status->resizeRowsToContents();

}MainWindow::add_task_windows_LM()

{task;table_task_status_task;.clear();_task_status_task.clear();


// предварительный анализ.append("6");

_task_status_task.append(tr("Предварительный анализ"));

_task_status->insertRow(table_task_status->rowCount());

*newItem=new QTableWidgetItem(tr("%1").arg(table_task_status_task));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem2);

_task_status->resizeRowsToContents();

}MainWindow::add_task_windows_NTLM()

{task;table_task_status_task;.clear();_task_status_task.clear();


// предварительный анализ.append("6");

_task_status_task.append(tr("Предварительный анализ"));

_task_status->insertRow(table_task_status->rowCount());

*newItem=new QTableWidgetItem(tr("%1").arg(table_task_status_task));>setTextAlignment(Qt::AlignCenter);>setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem);

*newItem1=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem1);

*newItem2=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem2);.clear();_task_status_task.clear();

// перебор на 0-9.append("0");.append("arg1");.append("0123456789");.append("arg2");.append(word1.setNum(1,10));.append("arg3");.append(word1.setNum(8,10));.append("arg4");

_task_status_task.append(tr("Полный перебор на алфавите "));_task_status_task.append("0123456789");_task_status_task.append(tr(" с длиной пароля от "));_task_status_task.append(word1.setNum(1,10));_task_status_task.append(tr(" до "));_task_status_task.append(word1.setNum(8,10));_task_status_task.append(tr(" символов"));

_task_status->insertRow(table_task_status->rowCount());

*newItem3=new QTableWidgetItem(tr("%1").arg(table_task_status_task));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,0,newItem3);

*newItem4=new QTableWidgetItem(tr("%1").arg(""));->setTextAlignment(Qt::AlignCenter);->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);_task_status->setItem(table_task_status->rowCount()-1,1,newItem4);*newItem5=new QTableWidgetItem(tr("%1").arg(task));_task_status->setItem(table_task_status->rowCount()-1,2,newItem5);

_task_status->resizeRowsToContents();

}

MainWindow::auto_task()

{(algorithm)

{type_linux_md5:

_task_linux_md5();

;

type_windows_LM:

_task_windows_LM();

;

type_windows_NTLM:

_task_windows_NTLM();;

type_linux_sha256:_task_linux_sha256();;

type_linux_sha512:

_task_linux_sha512();

;

}

}

MainWindow::show_add_task_window()

{_add_task->show();

}

MainWindow::hide_add_task_window()

{_add_task->hide();

}

_task_window.h


#ifndef ADD_TASK_WINDOW_H

#define ADD_TASK_WINDOW_H


#include <QDialog>

_BEGIN_NAMESPACEQGroupBox;QLabel;QLineEdit;QSpinBox;QTabWidget;_END_NAMESPACE

add_task_window : public QDialog

{_OBJECT

:

_task_window(QWidget *parent=0);

*tab;

*brute_force_GroupBox;*brute_force_alpha_LineEdit;*brute_force_min_length_SpinBox,

*brute_force_max_length_SpinBox;*brute_force_add_PushButton;*label1,*label3,*label4;

*brute_force_on_mask_GroupBox;*brute_force_on_mask_alpha_LineEdit,

*brute_force_on_mask_mask_LineEdit;*brute_force_on_mask_min_on_left_length_SpinBox,

*brute_force_on_mask_max_on_left_length_SpinBox,

*brute_force_on_mask_min_on_right_length_SpinBox,

*brute_force_on_mask_max_on_right_length_SpinBox;*brute_force_on_mask_add_PushButton;*label5,*label7,*label8,*label9,*label10,*label11;

*brute_force_on_dictionary_GroupBox;*brute_force_on_dictionary_filename_LineEdit;*brute_force_on_dictionary_filename_PushButton;*label12;

*brute_force_on_dictionaries_GroupBox;*brute_force_on_dictionaries_filename1_LineEdit,

*brute_force_on_dictionaries_filename2_LineEdit;*brute_force_on_dictionaries_filename1_PushButton,

*brute_force_on_dictionaries_filename2_PushButton;*label14,*label15;

*brute_force_on_dictionary_gybrid_GroupBox;*brute_force_on_dictionary_gybrid_filename_LineEdit;*brute_force_on_dictionary_gybrid_filename_PushButton;*label17;

*brute_force_on_dictionaries_gybrid_GroupBox;*brute_force_on_dictionaries_gybrid_filename1_LineEdit,

*brute_force_on_dictionaries_gybrid_filename2_LineEdit;*brute_force_on_dictionaries_gybrid_filename1_PushButton,

*brute_force_on_dictionaries_gybrid_filename2_PushButton;*label19,*label20;

:

ok();cansel();slots:

add_file_1();add_file_2();add_file_3();add_file_4();add_file_5();add_file_6();add_file();

:

*ok_PushButton,

*cansel_PushButton;


};


#endif


_task_window.cpp

#include <QtGui>

#include "add_task_window.h"

_task_window::add_task_window(QWidget *parent):QDialog(parent)

{_PushButton=new QPushButton(this);_PushButton->setText(tr("Добавить"));(ok_PushButton,SIGNAL(clicked()),this,SIGNAL(ok()));_PushButton=new QPushButton(this);_PushButton->setText(tr("Отменить"));(cansel_PushButton,SIGNAL(clicked()),this,SIGNAL(cansel()));

_force_GroupBox=new QGroupBox(this);

_force_alpha_LineEdit=new QLineEdit(this);_force_alpha_LineEdit->setAlignment(Qt::AlignRight);_force_alpha_LineEdit->setText("abcdefghijklmnopqrstuvwxyz0123456789");

_force_min_length_SpinBox=new QSpinBox(this);_force_min_length_SpinBox->setMinimum(1);

_force_max_length_SpinBox=new QSpinBox(this);_force_max_length_SpinBox->setMinimum(1);_force_max_length_SpinBox->setValue(5);

=new QLabel(this);->setText(tr("Алфавит"));

=new QLabel(this);->setText(tr("Минимальная длина пароля"));

=new QLabel(this);->setText(tr("Максимальная длина пароля"));

*brute_force_alpha_Layout=new QHBoxLayout();_force_alpha_Layout->addWidget(label1);_force_alpha_Layout->addWidget(brute_force_alpha_LineEdit);*brute_force_min_length_Layout=new QHBoxLayout();_force_min_length_Layout->addWidget(label3);_force_min_length_Layout->addStretch();_force_min_length_Layout->addWidget(brute_force_min_length_SpinBox);

*brute_force_max_length_Layout=new QHBoxLayout();_force_max_length_Layout->addWidget(label4);_force_max_length_Layout->addStretch();_force_max_length_Layout->addWidget(brute_force_max_length_SpinBox);

*brute_force_Layout=new QVBoxLayout();_force_Layout->addLayout(brute_force_alpha_Layout);_force_Layout->addLayout(brute_force_min_length_Layout);_force_Layout->addLayout(brute_force_max_length_Layout);_force_Layout->addStretch();

_force_GroupBox->setLayout(brute_force_Layout);

_force_on_mask_GroupBox=new QGroupBox(this);_force_on_mask_alpha_LineEdit=new QLineEdit(this);_force_on_mask_alpha_LineEdit->setAlignment(Qt::AlignRight);

_force_on_mask_mask_LineEdit=new QLineEdit(this);_force_on_mask_mask_LineEdit->setAlignment(Qt::AlignRight);

_force_on_mask_min_on_left_length_SpinBox=new QSpinBox(this);_force_on_mask_min_on_left_length_SpinBox->setMinimum(0);

_force_on_mask_max_on_left_length_SpinBox=new QSpinBox(this);_force_on_mask_max_on_left_length_SpinBox->setMinimum(0);

_force_on_mask_min_on_right_length_SpinBox=new QSpinBox(this);_force_on_mask_min_on_right_length_SpinBox->setMinimum(0);

_force_on_mask_max_on_right_length_SpinBox=new QSpinBox(this);_force_on_mask_max_on_right_length_SpinBox->setMinimum(0);

=new QLabel(this);->setText(tr("Алфавит"));

=new QLabel(this);->setText(tr("Маска"));

=new QLabel(this);->setText(tr("Минимальный набор символов слева"));

=new QLabel(this);->setText(tr("Максимальный набор символов слева"));=new QLabel(this);->setText(tr("Минимальный набор символов справа"));

=new QLabel(this);->setText(tr("Максимальный набор символов справа"));

*brute_force_on_mask_alpha_Layout=new QHBoxLayout();_force_on_mask_alpha_Layout->addWidget(label5);_force_on_mask_alpha_Layout->addWidget(brute_force_on_mask_alpha_LineEdit);*brute_force_on_mask_mask_Layout=new QHBoxLayout();_force_on_mask_mask_Layout->addWidget(label7);_force_on_mask_mask_Layout->addWidget(brute_force_on_mask_mask_LineEdit);

*brute_force_on_mask_min_on_left_length_Layout=new QHBoxLayout();_force_on_mask_min_on_left_length_Layout->addWidget(label8);_force_on_mask_min_on_left_length_Layout->addStretch();_force_on_mask_min_on_left_length_Layout->addWidget(brute_force_on_mask_min_on_left_length_SpinBox);

*brute_force_on_mask_max_on_left_length_Layout=new QHBoxLayout();_force_on_mask_max_on_left_length_Layout->addWidget(label9);_force_on_mask_max_on_left_length_Layout->addStretch();_force_on_mask_max_on_left_length_Layout->addWidget(brute_force_on_mask_max_on_left_length_SpinBox);*brute_force_on_mask_min_on_right_length_Layout=new QHBoxLayout();_force_on_mask_min_on_right_length_Layout->addWidget(label10);_force_on_mask_min_on_right_length_Layout->addStretch();_force_on_mask_min_on_right_length_Layout->addWidget(brute_force_on_mask_min_on_right_length_SpinBox);

*brute_force_on_mask_max_on_right_length_Layout=new QHBoxLayout();_force_on_mask_max_on_right_length_Layout->addWidget(label11);_force_on_mask_max_on_right_length_Layout->addStretch();_force_on_mask_max_on_right_length_Layout->addWidget(brute_force_on_mask_max_on_right_length_SpinBox);

*brute_force_on_mask_Layout=new QVBoxLayout();_force_on_mask_Layout->addLayout(brute_force_on_mask_alpha_Layout);_force_on_mask_Layout->addLayout(brute_force_on_mask_mask_Layout);_force_on_mask_Layout->addLayout(brute_force_on_mask_min_on_left_length_Layout);_force_on_mask_Layout->addLayout(brute_force_on_mask_max_on_left_length_Layout);_force_on_mask_Layout->addLayout(brute_force_on_mask_min_on_right_length_Layout);_force_on_mask_Layout->addLayout(brute_force_on_mask_max_on_right_length_Layout);_force_on_mask_Layout->addStretch();

_force_on_mask_GroupBox->setLayout(brute_force_on_mask_Layout);_force_on_dictionary_GroupBox=new QGroupBox(this);

_force_on_dictionary_filename_LineEdit=new QLineEdit(this);_force_on_dictionary_filename_LineEdit->setAlignment(Qt::AlignRight);

_force_on_dictionary_filename_PushButton=new QPushButton(this);_force_on_dictionary_filename_PushButton->setText(tr("Обзор"));(brute_force_on_dictionary_filename_PushButton,SIGNAL(clicked()),this,SLOT(add_file_1()));=new QLabel(this);->setText(tr("Файл словаря"));

*brute_force_on_dictionary_filename_Layout=new QHBoxLayout();_force_on_dictionary_filename_Layout->addWidget(label12);_force_on_dictionary_filename_Layout->addWidget(brute_force_on_dictionary_filename_LineEdit);_force_on_dictionary_filename_Layout->addWidget(brute_force_on_dictionary_filename_PushButton);

*brute_force_on_dictionary_Layout=new QVBoxLayout();_force_on_dictionary_Layout->addLayout(brute_force_on_dictionary_filename_Layout);_force_on_dictionary_Layout->addStretch();

_force_on_dictionary_GroupBox->setLayout(brute_force_on_dictionary_Layout);_force_on_dictionaries_GroupBox=new QGroupBox(this);_force_on_dictionaries_filename1_LineEdit=new QLineEdit(this);_force_on_dictionaries_filename1_LineEdit->setAlignment(Qt::AlignRight);

_force_on_dictionaries_filename2_LineEdit=new QLineEdit(this);_force_on_dictionaries_filename2_LineEdit->setAlignment(Qt::AlignRight);

_force_on_dictionaries_filename1_PushButton=new QPushButton(this);_force_on_dictionaries_filename1_PushButton->setText(tr("Обзор"));(brute_force_on_dictionaries_filename1_PushButton,SIGNAL(clicked()),this,SLOT(add_file_2()));

_force_on_dictionaries_filename2_PushButton=new QPushButton(this);_force_on_dictionaries_filename2_PushButton->setText(tr("Обзор"));(brute_force_on_dictionaries_filename2_PushButton,SIGNAL(clicked()),this,SLOT(add_file_3()));

=new QLabel(this);->setText(tr("Файл словаря"));

=new QLabel(this);->setText(tr("Файл словаря"));

*brute_force_on_dictionaries_filename1_Layout=new QHBoxLayout();_force_on_dictionaries_filename1_Layout->addWidget(label14);_force_on_dictionaries_filename1_Layout->addWidget(brute_force_on_dictionaries_filename1_LineEdit);_force_on_dictionaries_filename1_Layout->addWidget(brute_force_on_dictionaries_filename1_PushButton);

*brute_force_on_dictionaries_filename2_Layout=new QHBoxLayout();_force_on_dictionaries_filename2_Layout->addWidget(label15);_force_on_dictionaries_filename2_Layout->addWidget(brute_force_on_dictionaries_filename2_LineEdit);_force_on_dictionaries_filename2_Layout->addWidget(brute_force_on_dictionaries_filename2_PushButton);*brute_force_on_dictionaries_Layout=new QVBoxLayout();_force_on_dictionaries_Layout->addLayout(brute_force_on_dictionaries_filename1_Layout);_force_on_dictionaries_Layout->addLayout(brute_force_on_dictionaries_filename2_Layout);_force_on_dictionaries_Layout->addStretch();

_force_on_dictionaries_GroupBox->setLayout(brute_force_on_dictionaries_Layout);

_force_on_dictionary_gybrid_GroupBox=new QGroupBox(this);

_force_on_dictionary_gybrid_filename_LineEdit=new QLineEdit(this);_force_on_dictionary_gybrid_filename_LineEdit->setAlignment(Qt::AlignRight);

_force_on_dictionary_gybrid_filename_PushButton=new QPushButton(this);_force_on_dictionary_gybrid_filename_PushButton->setText(tr("Обзор"));(brute_force_on_dictionary_gybrid_filename_PushButton,SIGNAL(clicked()),this,SLOT(add_file_4()));

=new QLabel(this);->setText(tr("Файл словаря"));

*brute_force_on_dictionary_gybrid_filename_Layout=new QHBoxLayout();_force_on_dictionary_gybrid_filename_Layout->addWidget(label17);_force_on_dictionary_gybrid_filename_Layout->addWidget(brute_force_on_dictionary_gybrid_filename_LineEdit);_force_on_dictionary_gybrid_filename_Layout->addWidget(brute_force_on_dictionary_gybrid_filename_PushButton);

*brute_force_on_dictionary_gybrid_Layout=new QVBoxLayout();_force_on_dictionary_gybrid_Layout->addLayout(brute_force_on_dictionary_gybrid_filename_Layout);_force_on_dictionary_gybrid_Layout->addStretch();

_force_on_dictionary_gybrid_GroupBox->setLayout(brute_force_on_dictionary_gybrid_Layout);

_force_on_dictionaries_gybrid_GroupBox=new QGroupBox(this);

_force_on_dictionaries_gybrid_filename1_LineEdit=new QLineEdit(this);_force_on_dictionaries_gybrid_filename1_LineEdit->setAlignment(Qt::AlignRight);

_force_on_dictionaries_gybrid_filename2_LineEdit=new QLineEdit(this);_force_on_dictionaries_gybrid_filename2_LineEdit->setAlignment(Qt::AlignRight);

_force_on_dictionaries_gybrid_filename1_PushButton=new QPushButton(this);_force_on_dictionaries_gybrid_filename1_PushButton->setText(tr("Обзор"));(brute_force_on_dictionaries_gybrid_filename1_PushButton,SIGNAL(clicked()),this,SLOT(add_file_5()));_force_on_dictionaries_gybrid_filename2_PushButton=new QPushButton(this);_force_on_dictionaries_gybrid_filename2_PushButton->setText(tr("Обзор"));(brute_force_on_dictionaries_gybrid_filename2_PushButton,SIGNAL(clicked()),this,SLOT(add_file_6()));

=new QLabel(this);->setText(tr("Файл словаря"));

=new QLabel(this);->setText(tr("Файл словаря"));

*brute_force_on_dictionaries_gybrid_filename1_Layout=new QHBoxLayout();_force_on_dictionaries_gybrid_filename1_Layout->addWidget(label19);_force_on_dictionaries_gybrid_filename1_Layout->addWidget(brute_force_on_dictionaries_gybrid_filename1_LineEdit);_force_on_dictionaries_gybrid_filename1_Layout->addWidget(brute_force_on_dictionaries_gybrid_filename1_PushButton);

*brute_force_on_dictionaries_gybrid_filename2_Layout=new QHBoxLayout();_force_on_dictionaries_gybrid_filename2_Layout->addWidget(label20);_force_on_dictionaries_gybrid_filename2_Layout->addWidget(brute_force_on_dictionaries_gybrid_filename2_LineEdit);_force_on_dictionaries_gybrid_filename2_Layout->addWidget(brute_force_on_dictionaries_gybrid_filename2_PushButton);*brute_force_on_dictionaries_gybrid_Layout=new QVBoxLayout();_force_on_dictionaries_gybrid_Layout->addLayout(brute_force_on_dictionaries_gybrid_filename1_Layout);_force_on_dictionaries_gybrid_Layout->addLayout(brute_force_on_dictionaries_gybrid_filename2_Layout);_force_on_dictionaries_gybrid_Layout->addStretch();

_force_on_dictionaries_gybrid_GroupBox->setLayout(brute_force_on_dictionaries_gybrid_Layout);

=new QTabWidget(this);>insertTab(0,brute_force_GroupBox,tr("Полный перебор"));>insertTab(1,brute_force_on_mask_GroupBox,tr("Поиск по маске"));>insertTab(2,brute_force_on_dictionary_GroupBox,tr("Поиск по словарю"));>insertTab(3,brute_force_on_dictionaries_GroupBox,tr("Комбинированный поиск по словарям"));>insertTab(4,brute_force_on_dictionary_gybrid_GroupBox,tr("Гибридный поиск по словарю"));>insertTab(5,brute_force_on_dictionaries_gybrid_GroupBox,tr("Гибридный поиск по словарям"));

*bottom_Layout=new QHBoxLayout();_Layout->addStretch();_Layout->addWidget(ok_PushButton);_Layout->addWidget(cansel_PushButton);*main_Layout=new QVBoxLayout();_Layout->addWidget(tab);_Layout->addLayout(bottom_Layout);


// добавляем компоновку окну поиска(main_Layout);

//setFixedWidth(800);(tr("Добавить задачу"));

}

add_task_window::add_file_1()

{filename;

((filename=QFileDialog::getOpenFileName(this,tr("Открыть словарь")))!=NULL)_force_on_dictionary_filename_LineEdit->setText(filename);

}

add_task_window::add_file_2()

{filename;

((filename=QFileDialog::getOpenFileName(this,tr("Открыть словарь")))!=NULL)_force_on_dictionaries_filename1_LineEdit->setText(filename);

}

add_task_window::add_file_3()

{filename;

((filename=QFileDialog::getOpenFileName(this,tr("Открыть словарь")))!=NULL)_force_on_dictionaries_filename2_LineEdit->setText(filename);

}

add_task_window::add_file_4()

{filename;

((filename=QFileDialog::getOpenFileName(this,tr("Открыть словарь")))!=NULL)_force_on_dictionary_gybrid_filename_LineEdit->setText(filename);

}

add_task_window::add_file_5()

{filename;

((filename=QFileDialog::getOpenFileName(this,tr("Открыть словарь")))!=NULL)_force_on_dictionaries_gybrid_filename1_LineEdit->setText(filename);

}

add_task_window::add_file_6()

{filename;((filename=QFileDialog::getOpenFileName(this,tr("Открыть словарь")))!=NULL)_force_on_dictionaries_gybrid_filename2_LineEdit->setText(filename);

}

add_task_window::add_file()

{


}

.h


#ifndef HASH_H

#define HASH_H


#include <QThread>

#include <QtCrypto>

#include <math.h>

_BEGIN_NAMESPACEQCryptographicHash;_END_NAMESPACE

Hash : public QThread

{_OBJECT

:

();bool stopped;

quint64 current,total;

type;

<QByteArray> *before_hash_vector,

*before_salt_vector,

*login_vector;

<unsigned int> *NTLM1;<unsigned int> *NTLM2;<unsigned int> *NTLM3;<unsigned int> *NTLM4;

<QByteArray> *left_half_LM_password;<QByteArray> *right_half_LM_password;

count_hash;

*tasks;

::Cipher *algorithm_DES;

check_hash(const char *);variant_for_before_check(char *);variant_for_hybrid(char *);

* LM_hash(const char *);int* NTLM_hash(const char *);brute_force(const char *,const quint8 &,const quint8 &);brute_force_on_mask(const char *,const char *,const quint8 &,const quint8 &,const quint8 &,const quint8 &);brute_force_on_dictionary(const QString &);brute_force_on_dictionaries(const QString &,const QString &);brute_force_on_dictionary_gybrid(const QString &);brute_force_on_dictionaries_gybrid(const QString &,const QString &);before_check();

clear_parametrs();:complete();find_hash(const QString &,const QString &);message(const QString &);start_timer();comlete_task();

:

run();


};


#endif

.cpp


#include <QtCore>

#include <QtCrypto>

#include <unistd.h>

#include "hash.h"


// NTLM константы

#define INIT_A 0x67452301

#define INIT_B 0xefcdab89

#define INIT_C 0x98badcfe

#define INIT_D 0x10325476


#define SQRT_2 0x5a827999

#define SQRT_3 0x6ed9eba1

// LM константы

#define LINE "KGS!@#$%"


// DES константы

algorithm

{_linux_md5=3,_windows_LM=4,_windows_NTLM=5,_linux_sha256=6,_linux_sha512=7,

};

help

{_size=128,

};

::Hash()

{

// вектор хэшей_hash_vector=new QVector<QByteArray>();_hash_vector->clear();


// вектор солей_salt_vector=new QVector<QByteArray>();_salt_vector->clear();


// логины пользователей_vector=new QVector<QByteArray>();_vector->clear();


// задачи=new QStringList();>clear();


// NTLM=new QVector<unsigned int>();->clear();

=new QVector<unsigned int>();->clear();

=new QVector<unsigned int>();->clear();

=new QVector<unsigned int>();->clear();

// LM_half_LM_password=new QVector<QByteArray>();_half_LM_password->clear();

_half_LM_password=new QVector<QByteArray>();_half_LM_password->clear();


// алгоритм DES_DES=new QCA::Cipher(QString("des"),QCA::Cipher::ECB,QCA::Cipher::NoPadding,QCA::Encode,QByteArray("qwerty"));

}

Hash::run()

{start_timer();

(type==type_windows_NTLM)

{

// преобразуем NTLM(quint8 i=0;i<before_hash_vector->size();i++)

{hash=before_hash_vector->at(i);

(quint8 j=0;j<4;j++)

{int summ=0;ok;

+=hash.mid(0+8*j,2).toUInt(&ok,16);+=hash.mid(2+8*j,2).toUInt(&ok,16)*256;+=hash.mid(4+8*j,2).toUInt(&ok,16)*256*256;+=hash.mid(6+8*j,2).toUInt(&ok,16)*256*256*256;

(j==0)->append(summ);if (j==1)->append(summ);if (j==2)->append(summ);->append(summ);


}

_hash++;

}

}if (type==type_windows_LM)

{(quint8 i=0;i<before_hash_vector->size();i++)

{hash=before_hash_vector->at(i);

(hash=="aad3b435b51404eeaad3b435b51404ee")

{_half_LM_password->insert(i,"solve");_half_LM_password->insert(i,"solve");

}

{_half_LM_password->insert(i,hash.left(16));_half_LM_password->insert(i,hash.right(16));

}

_hash++;

}

(left_half_LM_password->indexOf("solve")!=-1)

{position=left_half_LM_password->indexOf("solve");

_half_LM_password->remove(position);_half_LM_password->remove(position);_hash--;

}

find_hash("aad3b435b51404eeaad3b435b51404ee","aad3b435b51404eeaad3b435b51404ee");

}if ((type==type_linux_md5) || (type==type_linux_sha256) || (type==type_linux_sha512))

{_hash=before_hash_vector->count();

}


// поочередно выполняем задачи(tasks->count()!=0)

{ok;task=tasks->first();type=task.left(1).toInt(&ok,10);

message(tr("В процессе"));

((stopped) || (count_hash==0));

(type)

{0:

(brute_force(task.mid(task.indexOf("arg1")+4,task.indexOf("arg2")-task.indexOf("arg1")-4).toAscii(),.mid(task.indexOf("arg2")+4,task.indexOf("arg3")-task.indexOf("arg2")-4).toInt(&ok,10),.mid(task.indexOf("arg3")+4,task.indexOf("arg4")-task.indexOf("arg3")-4).toInt(&ok,10)))

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

}

;

1:

(brute_force_on_mask(task.mid(task.indexOf("arg1")+4,task.indexOf("arg2")-task.indexOf("arg1")-4).toAscii(),.mid(task.indexOf("arg2")+4,task.indexOf("arg3")-task.indexOf("arg2")-4).toAscii(),.mid(task.indexOf("arg3")+4,task.indexOf("arg4")-task.indexOf("arg3")-4).toInt(&ok,10),.mid(task.indexOf("arg4")+4,task.indexOf("arg5")-task.indexOf("arg4")-4).toInt(&ok,10),.mid(task.indexOf("arg5")+4,task.indexOf("arg6")-task.indexOf("arg5")-4).toInt(&ok,10),.mid(task.indexOf("arg6")+4,task.indexOf("arg7")-task.indexOf("arg6")-4).toInt(&ok,10)))

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

}

;

2:

(brute_force_on_dictionary(task.mid(task.indexOf("arg1")+4,task.indexOf("arg2")-task.indexOf("arg1")-4)))

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

}

;

3:

(brute_force_on_dictionaries(task.mid(task.indexOf("arg1")+4,task.indexOf("arg2")-task.indexOf("arg1")-4),.mid(task.indexOf("arg2")+4,task.indexOf("arg3")-task.indexOf("arg2")-4)))

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

}

;

4:

(brute_force_on_dictionary_gybrid(task.mid(task.indexOf("arg1")+4,task.indexOf("arg2")-task.indexOf("arg1")-4)))

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

}

;

5:

(brute_force_on_dictionaries_gybrid(task.mid(task.indexOf("arg1")+4,task.indexOf("arg2")-task.indexOf("arg1")-4),.mid(task.indexOf("arg2")+4,task.indexOf("arg3")-task.indexOf("arg2")-4)))

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

}

;

6:

(before_check())

{(!stopped)message(tr("Завершено"));message(tr("Отменено"));

};

}

>removeFirst();

}

complete();

}*Hash::LM_hash(const char *password) // алгоритм дес

{

// создаем копию из 7 символов максимум

char word[8];

memset(word,NULL,8);

// копируем туда содержимое, независимо от длины последним всегда будет NULL

if (strlen(password)>7)(word,password,7);(word,password,strlen(password));

result;.clear();


// создаем ключ из 8 символовkey[9];

memset(key,NULL,9);


// переводим слово в верхний регистр

for(quint8 i=0;i<strlen(word);i++)((word[i]>96) && (word[i]<123))[i]-=32;


// формируем ключ[0] = (word[0] >> 1) << 1;[1] = (((word[0] & 0x01) << 6) | (word[1] >> 2)) << 1;[2] = (((word[1] & 0x03) << 5) | (word[2] >> 3)) << 1;[3] = (((word[2] & 0x07) << 4) | (word[3] >> 4)) << 1;[4] = (((word[3] & 0x0F) << 3) | (word[4] >> 5)) << 1;[5] = (((word[4] & 0x1F) << 2) | (word[5] >> 6)) << 1;[6] = (((word[5] & 0x3F) << 1) | (word[6] >> 7)) << 1;

key[7] = (word[6] & 0x7F) << 1;


// переопределяем алгоритм des

QCA::SymmetricKey key_for_des(QByteArray(key,9));_DES->setup(QCA::Encode,key_for_des);


// шифруем.append(algorithm_DES->update(LINE).toByteArray());

result.toHex().data();

}

int *Hash::NTLM_hash(const char *password) // max length password

{int nt_buffer[16];unsigned int output[4];

i=0;length=strlen(password);

//if (length>30)

// length=30;(nt_buffer,0,64);

(;i<length/2;i++)_buffer[i]=password[2*i]|(password[2*i+1]<<16);

(length%2==1)_buffer[i]=password[length-1]|0x800000;_buffer[i]=0x80;

_buffer[14] = length << 4;

int a = INIT_A;int b = INIT_B;int c = INIT_C;int d = INIT_D;


// 1 раунд+= (d ^ (b & (c ^ d))) + nt_buffer[0] ;a = (a << 3 ) | (a >> 29);+= (c ^ (a & (b ^ c))) + nt_buffer[1] ;d = (d << 7 ) | (d >> 25);+= (b ^ (d & (a ^ b))) + nt_buffer[2] ;c = (c << 11) | (c >> 21);+= (a ^ (c & (d ^ a))) + nt_buffer[3] ;b = (b << 19) | (b >> 13);

+= (d ^ (b & (c ^ d))) + nt_buffer[4] ;a = (a << 3 ) | (a >> 29);+= (c ^ (a & (b ^ c))) + nt_buffer[5] ;d = (d << 7 ) | (d >> 25);+= (b ^ (d & (a ^ b))) + nt_buffer[6] ;c = (c << 11) | (c >> 21);+= (a ^ (c & (d ^ a))) + nt_buffer[7] ;b = (b << 19) | (b >> 13);+= (d ^ (b & (c ^ d))) + nt_buffer[8] ;a = (a << 3 ) | (a >> 29);+= (c ^ (a & (b ^ c))) + nt_buffer[9] ;d = (d << 7 ) | (d >> 25);+= (b ^ (d & (a ^ b))) + nt_buffer[10] ;c = (c << 11) | (c >> 21);+= (a ^ (c & (d ^ a))) + nt_buffer[11] ;b = (b << 19) | (b >> 13);

+= (d ^ (b & (c ^ d))) + nt_buffer[12] ;a = (a << 3 ) | (a >> 29);+= (c ^ (a & (b ^ c))) + nt_buffer[13] ;d = (d << 7 ) | (d >> 25);+= (b ^ (d & (a ^ b))) + nt_buffer[14] ;c = (c << 11) | (c >> 21);+= (a ^ (c & (d ^ a))) + nt_buffer[15] ;b = (b << 19) | (b >> 13);


// 2 раунд+= ((b & (c | d)) | (c & d)) + nt_buffer[0] +SQRT_2; a = (a<<3 ) | (a>>29);+= ((a & (b | c)) | (b & c)) + nt_buffer[4] +SQRT_2; d = (d<<5 ) | (d>>27);+= ((d & (a | b)) | (a & b)) + nt_buffer[8] +SQRT_2; c = (c<<9 ) | (c>>23);+= ((c & (d | a)) | (d & a)) + nt_buffer[12]+SQRT_2; b = (b<<13) | (b>>19);

+= ((b & (c | d)) | (c & d)) + nt_buffer[1] +SQRT_2; a = (a<<3 ) | (a>>29);+= ((a & (b | c)) | (b & c)) + nt_buffer[5] +SQRT_2; d = (d<<5 ) | (d>>27);+= ((d & (a | b)) | (a & b)) + nt_buffer[9] +SQRT_2; c = (c<<9 ) | (c>>23);+= ((c & (d | a)) | (d & a)) + nt_buffer[13]+SQRT_2; b = (b<<13) | (b>>19);

+= ((b & (c | d)) | (c & d)) + nt_buffer[2] +SQRT_2; a = (a<<3 ) | (a>>29);+= ((a & (b | c)) | (b & c)) + nt_buffer[6] +SQRT_2; d = (d<<5 ) | (d>>27);+= ((d & (a | b)) | (a & b)) + nt_buffer[10]+SQRT_2; c = (c<<9 ) | (c>>23);+= ((c & (d | a)) | (d & a)) + nt_buffer[14]+SQRT_2; b = (b<<13) | (b>>19);

+= ((b & (c | d)) | (c & d)) + nt_buffer[3] +SQRT_2; a = (a<<3 ) | (a>>29);+= ((a & (b | c)) | (b & c)) + nt_buffer[7] +SQRT_2; d = (d<<5 ) | (d>>27);+= ((d & (a | b)) | (a & b)) + nt_buffer[11]+SQRT_2; c = (c<<9 ) | (c>>23);+= ((c & (d | a)) | (d & a)) + nt_buffer[15]+SQRT_2; b = (b<<13) | (b>>19);


// 3 раунд+= (d ^ c ^ b) + nt_buffer[0] + SQRT_3; a = (a << 3 ) | (a >> 29);+= (c ^ b ^ a) + nt_buffer[8] + SQRT_3; d = (d << 9 ) | (d >> 23);+= (b ^ a ^ d) + nt_buffer[4] + SQRT_3; c = (c << 11) | (c >> 21);+= (a ^ d ^ c) + nt_buffer[12] + SQRT_3; b = (b << 15) | (b >> 17);

+= (d ^ c ^ b) + nt_buffer[2] + SQRT_3; a = (a << 3 ) | (a >> 29);+= (c ^ b ^ a) + nt_buffer[10] + SQRT_3; d = (d << 9 ) | (d >> 23);+= (b ^ a ^ d) + nt_buffer[6] + SQRT_3; c = (c << 11) | (c >> 21);+= (a ^ d ^ c) + nt_buffer[14] + SQRT_3; b = (b << 15) | (b >> 17);

+= (d ^ c ^ b) + nt_buffer[1] + SQRT_3; a = (a << 3 ) | (a >> 29);+= (c ^ b ^ a) + nt_buffer[9] + SQRT_3; d = (d << 9 ) | (d >> 23);+= (b ^ a ^ d) + nt_buffer[5] + SQRT_3; c = (c << 11) | (c >> 21);+= (a ^ d ^ c) + nt_buffer[13] + SQRT_3; b = (b << 15) | (b >> 17);

+= (d ^ c ^ b) + nt_buffer[3] + SQRT_3; a = (a << 3 ) | (a >> 29);+= (c ^ b ^ a) + nt_buffer[11] + SQRT_3; d = (d << 9 ) | (d >> 23);+= (b ^ a ^ d) + nt_buffer[7] + SQRT_3; c = (c << 11) | (c >> 21);+= (a ^ d ^ c) + nt_buffer[15] + SQRT_3; b = (b << 15) | (b >> 17);

[0] = a + INIT_A;[1] = b + INIT_B;[2] = c + INIT_C;[3] = d + INIT_D;

output;

}

Hash::check_hash(const char *variant_password)

{

// проверка флага остановки(stopped)true;


// инкремент количества сделанных операций

current++;

(type==type_windows_LM)

{

// вычисление хэша от текущей комбинации*variant_hash=LM_hash(variant_password);

((left_half_LM_password->indexOf(variant_hash))!=-1)

{position=left_half_LM_password->indexOf(variant_hash);

_half_LM_password->replace(position,"solve");

((right_half_LM_password->at(position)=="aad3b435b51404ee") || (right_half_LM_password->at(position)=="solve"))

{_half_LM_password->remove(position);_half_LM_password->remove(position);_hash--;

}

word[8];(word,NULL,8);(strlen(variant_password)>7)(word,variant_password,7);(word,variant_password,strlen(variant_password));(quint8 i=0;i<strlen(word);i++)((word[i]>64) && (word[i]<91))[i]+=32;find_hash(word,variant_hash);

}

((right_half_LM_password->indexOf(variant_hash))!=-1)

{position=right_half_LM_password->indexOf(variant_hash);

_half_LM_password->replace(position,"solve");

((left_half_LM_password->at(position)=="aad3b435b51404ee") || (left_half_LM_password->at(position)=="solve"))

{_half_LM_password->remove(position);_half_LM_password->remove(position);_hash--;

}

word[8];(word,NULL,8);(strlen(variant_password)>7)(word,variant_password,7);(word,variant_password,strlen(variant_password));(quint8 i=0;i<strlen(word);i++)((word[i]>64) && (word[i]<91))[i]+=32;find_hash(variant_password,variant_hash);

}


// если все найдено(!count_hash)

return true;

}if (type==type_windows_NTLM)

{

// вычисление хэша от текущей комбинацииint *output=NTLM_hash(variant_password);

(NTLM1->indexOf(output[0])!=-1)

{position;=NTLM1->indexOf(output[0]);(NTLM2->at(position)==output[1])(NTLM3->at(position)==output[2])(NTLM4->at(position)==output[3])

{

// преобразуем хэш в шестнадцатиричное представление

static char hex_format[33];

char itoa16[17]="0123456789abcdef";(quint8 i=0;i<4;i++)

{int n=output[i];

(quint8 j=0;j<4;j++)

{int convert=n%256;_format[i*8+j*2+1]=itoa16[convert%16];=convert/16;_format[i*8+j*2+0]=itoa16[convert%16];=n/256;

}

}

_format[32]=NULL;

(NTLM1->indexOf(output[0])!=-1)

{=NTLM1->indexOf(output[0]);(NTLM2->at(position)==output[1])(NTLM3->at(position)==output[2])(NTLM4->at(position)==output[3])

{->remove(position);->remove(position);->remove(position);->remove(position);_hash--;

}

}

_hash(variant_password,hex_format);

}

}


// если все найдено(!count_hash)

return true;

}if ((type==type_linux_md5) || (type==type_linux_sha256) || (type==type_linux_sha512))

{(quint8 i=0;i<before_hash_vector->count();i++)

{

// вычисление хэша от текущей комбинации с нужной солью

QByteArray variant_hash=crypt(variant_password,before_salt_vector->at(i));

(variant_hash==before_hash_vector->at(i))

{find_hash(variant_password,variant_hash);_hash_vector->remove(i);_salt_vector->remove(i);_hash--;

}

}


// если все найдено(!count_hash)true;

}

false;

}

Hash::clear_parametrs()

{=0;=0;_hash=0;=false;_hash_vector->clear();_salt_vector->clear();_half_LM_password->clear();_half_LM_password->clear();_vector->clear();>clear();->clear();->clear();->clear();->clear();

}

Hash::brute_force(const char *alpha, const quint8 &min_length_password, const quint8 &max_length_password)

{alpha_length=strlen(alpha);first_symbol=alpha[0];last_symbol=alpha[alpha_length-1];position[max_length_password+1];

current_combination[max_length_password+1];first_combination[max_length_password+1];

(quint8 i=min_length_password;i<=max_length_password;i++)

{(first_combination,first_symbol,i);_combination[i]=NULL;

(current_combination,first_symbol,i);_combination[i]=NULL;

(quint8 j=0;j<i;j++)[j]=1;[i]=NULL;


{j=i;quint8 current_symbol;

(j!=0)

{_symbol=current_combination[j-1];

(current_symbol==last_symbol)

{_combination[j-1]=first_symbol;[j-1]=1;-;

}

{_combination[j-1]=alpha[position[j-1]];[j-1]++;;

}

}

(check_hash(current_combination))true;

(!memcmp(current_combination,first_combination,i));

}

}

true;

}

Hash::brute_force_on_mask(const char *alpha,const char *mask,const quint8 &min_length_password_on_left,const quint8 &max_length_password_on_left,const quint8 &min_length_password_on_right,const quint8 &max_length_password_on_right)

{alpha_length=strlen(alpha);mask_length=strlen(mask);first_symbol=alpha[0];last_symbol=alpha[alpha_length-1];position[max_length_password_on_left+max_length_password_on_right+1];

current_combination[max_length_password_on_left+max_length_password_on_right+1];first_combination[max_length_password_on_left+max_length_password_on_right+1];right_combination[max_length_password_on_left+max_length_password_on_right+mask_length+1];

(quint8 i=min_length_password_on_left;i<=max_length_password_on_left;i++)

{(quint8 k=min_length_password_on_right;k<=max_length_password_on_right;k++)

{(first_combination,first_symbol,i+k);_combination[i+k]=NULL;

(current_combination,first_symbol,i+k);_combination[i+k]=NULL;

(right_combination,first_symbol,i+k+mask_length);_combination[i+k+mask_length]=NULL;

(quint8 j=0;j<i+k;j++)[j]=1;[i+k]=NULL;


{j=i+k;quint8 current_symbol;

(j!=0)

{_symbol=current_combination[j-1];

(current_symbol==last_symbol)

{_combination[j-1]=first_symbol;[j-1]=1;-;

}

{_combination[j-1]=alpha[position[j-1]];[j-1]++;;

}

}

(right_combination,current_combination,i);(right_combination+i,mask,mask_length);(right_combination+i+mask_length,current_combination+i,k);

(check_hash(right_combination))true;

(!memcmp(current_combination,first_combination,i+k));

}

}

}true;

}

Hash::brute_force_on_dictionary(const QString &filename)

{file(filename);

(!file.exists())

{message(tr("Файл не существует"));

return false;

}if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

{message(tr("Не хватает прав доступа"));

return false;

}

{buf[buffer_size];lineLength;

((lineLength=file.readLine(buf,buffer_size))!=-1)

{[lineLength-1]=NULL;(check_hash(buf))

{.close();true;

}

}

.close();

}

true;

}

Hash::brute_force_on_dictionaries(const QString &filename1,const QString &filename2)

{file1(filename1);file2(filename2);

(!file1.exists())

{message(tr("Файл не существует"));false;

}if (!file1.open(QIODevice::ReadOnly | QIODevice::Text))

{message(tr("Не хватает прав доступа"));

return false;

}if (!file2.exists())

{message(tr("Файл не существует"));

return false;

}if (!file2.open(QIODevice::ReadOnly | QIODevice::Text))

{message(tr("Не хватает прав доступа"));

return false;

}

{buf1[buffer_size];buf2[buffer_size];

(buf1,NULL,buffer_size);(buf2,NULL,buffer_size);

lineLength1;lineLength2;

buf[buffer_size*2];(buf,NULL,buffer_size*2);

((lineLength1=file1.readLine(buf1,buffer_size))!=-1)

{.reset();[lineLength1-1]=NULL;((lineLength2=file2.readLine(buf2,buffer_size))!=-1)

{[lineLength2-1]=NULL;

(buf,buf1,lineLength1-1);(buf+lineLength1-1,buf2,lineLength2-1);[lineLength1+lineLength2-2]=NULL;(check_hash(buf))

{.close();.close();true;

}

}

}

.close();.close();

}

true;

}

Hash::brute_force_on_dictionary_gybrid(const QString &filename)

{file(filename);

(!file.exists())

{message(tr("Файл не существует"));

return false;

}if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

{message(tr("Не хватает прав доступа"));

return false;

}

{buf[buffer_size];lineLength;

((lineLength=file.readLine(buf,buffer_size))!=-1)

{[lineLength-1]=NULL;(variant_for_hybrid(buf))

{.close();true;

}

}

.close();

}

true;

}

Hash::brute_force_on_dictionaries_gybrid(const QString &filename1,const QString &filename2)

{file1(filename1);file2(filename2);

(!file1.exists())

{message(tr("Файл не существует"));false;

}if (!file1.open(QIODevice::ReadOnly | QIODevice::Text))

{message(tr("Не хватает прав доступа"));

return false;

}if (!file2.exists())

{message(tr("Файл не существует"));

return false;

}if (!file2.open(QIODevice::ReadOnly | QIODevice::Text))

{message(tr("Не хватает прав доступа"));

return false;

}

{buf1[buffer_size];buf2[buffer_size];

(buf1,NULL,buffer_size);(buf2,NULL,buffer_size);lineLength1;lineLength2;

buf[buffer_size*2];(buf,NULL,buffer_size*2);((lineLength1=file1.readLine(buf1,buffer_size))!=-1)

{.reset();[lineLength1-1]=NULL;

((lineLength2=file2.readLine(buf2,buffer_size))!=-1)

{[lineLength2-1]=NULL;

(buf,buf1,lineLength1-1);(buf+lineLength1-1,buf2,lineLength2-1);[lineLength1+lineLength2-2]=NULL;

(variant_for_hybrid(buf))

{.close();.close();true;

}

}

}

.close();.close();

}true;

}

Hash::before_check()

{

// пустой пароль

check_hash("");


// пароль совпадает с логином

for(quint8 i=0;i<login_vector->count();i++)(check_hash(login_vector->at(i).trimmed().data()))true;


// комбинации с логином(quint8 i=0;i<login_vector->count();i++)

{

// проверка из гибридного поиска по словарю

if (variant_for_hybrid(login_vector->at(i).trimmed().data()))true;

}


// соседние клавишиfile(QDir().currentPath()+"/before_check/horizontal_max.txt");.open(QIODevice::ReadOnly);

buf[buffer_size];lineLength;

((lineLength=file.readLine(buf,buffer_size))!=-1)

{[lineLength-1]=NULL;(variant_for_before_check(buf))

{.close();true;

}

}

.close();

.setFileName(QDir().currentPath()+"/before_check/horizontal_min.txt");.open(QIODevice::ReadOnly);

((lineLength=file.readLine(buf,buffer_size))!=-1)

{[lineLength-1]=NULL;(variant_for_before_check(buf))

{.close();true;

}

}

.close();

.setFileName(QDir().currentPath()+"/before_check/vertical.txt");.open(QIODevice::ReadOnly);

((lineLength=file.readLine(buf,buffer_size))!=-1)

{[lineLength-1]=NULL;(variant_for_before_check(buf))

{.close();true;

}

}

.close();

true;

}

Hash::variant_for_before_check(char *variant)

{size=strlen(variant);word[buffer_size*4];(word,NULL,buffer_size*4);


// сам вариант(check_hash(variant))

return true;


// разные регистры символов (часто встречающиеся варианты)

{flag=false;(word,NULL,size+1);


// чередование регистра начиная со строчной буквы

for(quint8 i=0;i<size;i++)(((variant[i]>96) && (variant[i]<123)) || ((variant[i]>64) && (variant[i]<91)))

{(flag)

{((variant[i]>64) && (variant[i]<91))[i]=variant[i]+32;[i]=variant[i];=false;

}

{((variant[i]>96) && (variant[i]<123))[i]=variant[i]-32;[i]=variant[i];=true;

}

}[i]=variant[i];

(check_hash(word))true;


// чередование регистра начиная с заглавной буквы

for(quint8 i=0;i<size;i++)((word[i]>96) && (word[i]<123))[i]-=32;if ((word[i]>64) && (word[i]<91))[i]+=32;

(check_hash(word))true;


// верхний регистр(quint8 i=0;i<size;i++)((word[i]>96) && (word[i]<123))[i]-=32;

(check_hash(word))true;


// нижний регистр(quint8 i=0;i<size;i++)((word[i]>64) && (word[i]<91))[i]+=32;

(check_hash(word))true;

}

false;

}

Hash::variant_for_hybrid(char *variant)

{size=strlen(variant);word[buffer_size*4];(word,NULL,buffer_size*4);


// сам вариант(check_hash(variant))

return true;


// повторение пароля

{

// два пароля подряд

memcpy(word,variant,size);(word+size,variant,size);[size+size]=NULL;

(check_hash(word))true;


// пароль+пароль(word,variant,size);(word+size,"+",1);(word+size+1,variant,size);[size+size+1]=NULL;

(check_hash(word))true;


// пароль/пароль[size]='/';

(check_hash(word))true;

// пароль-пароль[size]='-';

if (check_hash(word))true;


// пароль\пароль[size]='\\';


if (check_hash(word))true;

}


// разные регистры символов (часто встречающиеся варианты)

{flag=false;(word,NULL,size+1);


// чередование регистра начиная со строчной буквы

for(quint8 i=0;i<size;i++)(((variant[i]>96) && (variant[i]<123)) || ((variant[i]>64) && (variant[i]<91)))

{(flag)

{((variant[i]>64) && (variant[i]<91))[i]=variant[i]+32;[i]=variant[i];=false;

}

{((variant[i]>96) && (variant[i]<123))[i]=variant[i]-32;[i]=variant[i];=true;

}

}[i]=variant[i];

(check_hash(word))true;


// чередование регистра начиная с заглавной буквы

for(quint8 i=0;i<size;i++)((word[i]>96) && (word[i]<123))[i]-=32;if ((word[i]>64) && (word[i]<91))[i]+=32;

(check_hash(word))true;


// верхний регистр(quint8 i=0;i<size;i++)((word[i]>96) && (word[i]<123))[i]-=32;(check_hash(word))true;


// нижний регистр(quint8 i=0;i<size;i++)((word[i]>64) && (word[i]<91))[i]+=32;

(check_hash(word))

return true;

}


// все возможные регистры пароля

{(word,NULL,size+1);count_letter=0;

(quint8 i=0;i<size;i++)(((variant[i]>96) && (variant[i]<123)) || ((variant[i]>64) && (variant[i]<91)))_letter++;position[count_letter+1];(position,false,count_letter);[count_letter]=NULL;(quint8 i=0;i<size;i++)

{((variant[i]>64) && (variant[i]<91))[i]=variant[i]+32;[i]=variant[i];

}

{j=0;(quint8 i=0;i<size;i++)

{(((word[i]>96) && (word[i]<123)) || ((word[i]>64) && (word[i]<91)))

{(position[j]==false)

{[i]-=32;[j]=true;;

}

{[j]=false;[i]+=32;++;

}

}

}(check_hash(word))true;(j>=count_letter)

break;

}

}false;

}


МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УН

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ