Разработка малвари на С++. Глава 1.

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Всем вечер добрый. Видимо я действительно немного закопался.
pdf тут
Разработка малвари на С++.
Углубленный курс.
SNOW эксклюзивно для XSS.IS
Посвящается
кормилице нашей – святой Винде, да будет благословенен создатель ее, муд
рейший из мудрых, пресвятой Билли, да будет лишь прирастать она свежими уязвимостями с каждым новым релизом её, да останется она во веки веков источником нашего процветания и пропитания.

Содержание
1 Введение.
1.1 Мотивация. Или для чего всё это нужно.
1.2 Для кого этот курс .
1.3 Цели и задачи курса.
2 Список литературы и ресурсов, необходимых для успешного старта.
2.1 Литература по С++ .
2.1.1 Бессмертная классика.
2.1.2 Полезные ресурсы.
2.1.3 STL .
2.1.4 Boost .
2.1.5 Qt .
2.2 Чистый код. Искусство рефакторинга.
2.3 Литература по проектированию и архитектуре ПО.
2.4 Литература по управлению проектами.
2.5 Литература по внутреннему устройству операционных систем.
2.5.1 Windows .
2.5.2 Linux .
2.6 Литература по сетям.
2.6.1 Литература по корпоративным сетям и Active Directory .
2.7 Литература по информационной безопасности.
2.7.1 Вирусология. Написание вирусов и прочих зловредов .
2.7.2 Методы защиты информации.
2.8 Литература по системам контроля версий.
3 Подготовка к запуску проекта. Управление проектом. Инструменты для командной разработки.
3.1 Таск-трекер. Выбор, настройка, политики использования.
3.2 Выбор и настройка системы контроля версий.
3.2.1 GIT .
3.2.2 Subversion (SVN) .
4 Подготовка рабочего окружения.
4.1 Выбор IDE .
4.1.1 MS Visual Studio .
4.1.2 CLion .
4.1.3 QtCreator .
5 Выбор и настройка инструментов тестирования.
5.1 Модульное тестирование.
5.1.1 Google tests.
6 Заключение

1 Введение
Итак, пришло время собирать камни (С) – приступить к написанию обещанного цикла статей.
1.1 Мотивация. Или для чего всё это нужно.
Тут должна быть некая предыстория, в которой рассказывалось бы про ... Да про что угодно, на самом деле. Но ее не
будет. Мотивация предельно простая. Хочу плашку эксперта, как у Вахи и Ранда. А для этого нужно потрудиться.
А если серьезно, то имея достаточно солидный опыт разработки на плюсах, я всё равно временами испытываю сложности
при разработке тематических проектов. Многие вещи для меня остаются загадкой, до тех пор, пока я не пощупаю их лично.
Но мне чуть проще, т.к. опыт белой разработки позволяет относительно быстро «въехать в тему» на уровне, достаточном
для решения задачи но, зачастую, недостаточном для понимания сути вещей. Поэтому я решил пойти по пути повышения
своей квалификации именно таким способом. Ибо, как известно, если хочешь разобраться в чем либо, попробуй объяснить
это пятилетнему ребенку. Глядишь и получится чего.
А если у вас нет серьезного опыта промышленной разработки, то зачастую всё будет сводиться к сочинению очеред-
ной козы на лисапеде, из говна и палок, с кучей костылей. У меня тоже примерно так, только у меня получаются уже
тюнингованные козы или лисапеды, поэтому будем учиться вместе.
1.2 Для кого этот курс
Как упоминалось выше, курс предназначен для всех желающих вступить в секту адептов С++. А также для тех, кто
считает себя уже состоявшимся профи и готов делиться опытом и получать новый. Ибо, как известно, опыта много не бывает.
Особенно ценным вкладом в проект будет участие в нем опытных специалистов по мыловарению. Я очень надеюсь, что для
кого-то это станет отправной точкой путешествия в увлекательный мир разработки на православных плюсах. Если хотя бы
один человек напишет, что проект помог ему определиться с дальнейшим направлением развития – значит всё уже не зря.
1.3 Цели и задачи курса.
Как строительство любого здания начинается с проектирования, так и любой курс, будь то и курс по матану в универе,
и курс от инфоцыган по зарабатыванию 100500 баксов в наносекунду, начинается с описания целей и задач.
Приступим. Здесь я постараюсь набросать своё видение, в дальнейшем этот список будет пополняться и редактироваться.
Попрошу не пугаться несколько формального описания целей и задач. Это не означает вовсе, что курс будет построен
именно в таком порядке. Мы пойдем другим путем. Во время написания проектов в рамках курса будут возникать вопросы,
так или иначе перечисленные в целях и задачах. Мы их будем подробно разбирать, давать отсылку на соответствующие
источники. Необходимый минимум для решения проблемы я дам. Остальное для самостоятельного изучения. Всегда поста-
раюсь ответить на ваши вопросы.
На самом деле я сам еще не знаю что у нас получится. Но, как говорил один мудрый человек: «будешь делать – будет
делаться, а не будешь делать – ни х*я не будет делаться».
Дабы упростить восприятие, основные пункты – это у нас цели, а подпункты – задачи, которые необходимо решить для
достижения целей.
Поехали.
1. Цель: Дать общее понимание специфики изучения С++, с учетом как собственного опыта, так и исходя из ваших
советов и комментариев.
Задачи:
  1. составить список рекомендуемой литературы по изучению языка, с описанием преимуществ и недостатков того или иного произведения или автора;
  2. составить список ресурсов, на которые мы будем опираться в дальнейшей работе, с указанием их сильных и слабых сторон;
  3. дать рекомендации по выбору и настройке рабочего окружения – IDE, компиляторов, дебаггеров;
  4. ознакомить с особенностями разработки на плюсах, в том числе мы разберем:
    1. Работу с памятью – мы наконец таки выясним чем отличается new от malloc и почему за использование сырых указателей в С++ необходимо вводить кастрацию без наркоза;
    2. Работу с низкоуровневым API на уровне операционной системы – пощупаем работу с WinAPI и POSIX и многое другое;
    3. Поддержку сразу всех существующих парадигм программирования – тута вам и процедурщина – для старых пердунов, и ООП – не путать с «Си с классами», и, даже, функциональщина в чистом виде – я видел 4 вложенных лямбды в проде и выжил. Поэтому мы будем потихоньку изучать и применять на практике;
    4. Шаблоны. Основа основ.
    5. Статическую типизацию. Ее преимущества и недостатки.
    6. Кроссплатформенность – таки да, на плюсах можно писать чистый кроссплатформенный код, правда именно к мыловарению это довольно сложно, если вообще, применимо, но мы попробуем.
    7. сюда же можно добавить ознакомление со списком наиболее популярных библиотек С++, таких как STL, boost, Qt, OpenCV, OpenSSL, Poco, Google protobuf, ... и рекомендации по их применению в тех или иных ситуациях. То есть мы должны понимать где нам выгоднее взять готовый инструмент и освоить его, а где придется таки сочинять свою козу на лисапеде.
    8. (f) Обсудим современные стандарты С++. Начиная с С++ 11 и до С++ 20, включительно. С++ 23 и даже С++ 26 трогать не будем. Там очень много не очевидных нововведений, от которых неокрепший мозг может превратиться во что-нибудь нехорошее и вытечь. Очень многие конторы сидят еще на С++ 14, С++ 17 – вроде как промышленный стандарт, но это не точно. Ну и не забудем, конечно, о С++ 98/03 – первых стандартах языка.
2. Цель: Дать общее представление о технологии разработки ПО, применительно к мыловарению и не только.
Обсудим и попробуем применить на практике такие штуки, как:
  1. Жизненный цикл ПО – от анализа требований, составления ТЗ, проектирования архитектуры – до непосредственно разработки, тестирования, внедрения и сопровождения.
  2. Общие требования к разрабатываемому ПО:
    1. качество – какой софт можно считать качественным, а какой – куском дерьма;
    2. производительность – в мыловарении это особенно актуально;
    3. масштабируемость – горизонтальная и вертикальная;
    4. надежность – хороший софт должен работать даже в условиях ядерной войны;
    5. безопасность – в мыловарении один из самых важных моментов, ибо если вы написали крутейший стиллер, с помощью которого увели пару лямов зелени у жирных буржуев, но при этом у вас комменты на русском, а в настройках гита вы указали свою реальную почту, то праздник на вашей улице продлится очень недолго;
    6. удобство использования – как ни крути, но современный мамкин хацкер боится консоли, как черт ладана. Поэтому у нас 2 пути – либо делать консольный интерфейс максимально продуманным и понятным даже для мартышки, либо прикручивать гуй/панель;
    7. тестирование – модульное, интеграционное, нагрузочное. Без тестов нынче никуда. Будем разбираться;
    8. сопровождаемость – ПО должно быть спроектировано и написано таким образом, что даже если вам на голову упадет кирпич или тимлид уйдет на месяц в запой, его могли подхватить привлеченные, условно говоря с улицы, кодеры и без особых проблем продолжить разработку. А когда тимлид вернется из запоя, у него не возникнет желания повторно уйти в алкогольный туман;
    9. документирование – О, эти извечные споры по поводу документации. Одни кричат, что код должен быть самодокументируемым. Другие рвут тельник на груди, доказывая, что только наличие качественной документации позволяет считать таковым и ПО, каким бы успешным оно не было. Будем разбираться и с этим;
  3. Методологии разработки ПО – waterfal (водопад), а также все эти ваши agile, scrum, kanban. Попробуем разобраться что это и с чем едят. Одну из методик возьмем на вооружение при разработке проектов в рамках курса.
3. Цель: дать общее представление о разработке архитектуры приложений.
Архитектура приложений – это основа основ, залог успеха или неудачи проекта. Поэтому данному аспекту будет уделено особое внимание.
Задачи:
  1. составить список литературы и ресурсов по теме;
  2. научиться извлекать функциональные (пользовательские сценарии) и не функциональные (количественные и качественные характеристики, помноженные на хотелки заказчика) требования к проекту из постановки задачи;
  3. рассмотреть основные архитектурные стили и шаблоны, найти им практическое применение в рамках курса;
  4. паттерны проектирования – данный пункт вынес в отдельную цель, дабы подчеркнуть его важность;
  5. научиться составлять системные требования к продукту – производительность, масштабируемость, надежность, безопасность, доступность;
  6. научиться определять технологические ограничения, связанные с используемыми технологиями и инструментами;
  7. научиться моделировать и визуализировать архитектуру – UML, DDD (domain Driven Design), Нотация моделирования C4 – Context, Containers, Components, Code;
  8. научиться оценивать различные варианты архитектуры и выбирать наиболее подходящую для конкретного проекта;
  9. изучить принципы SOLID и научиться им следовать;
4. Цель: изучить и научиться применять на практике паттерны проектирования.
Задачи:
  1. составить список литературы и ресурсов по теме, с указанием их преимуществ и недостатков;
  2. изучить основные концепции паттернов проектирования, их классификацию, области применения;
  3. код, много кода, много чужого кода, написанного с использованием лучших практик
5. Цель: научиться писать чистый код.
Небольшое лирическое отступление.
Чтобы научиться писать чистый код необходимо регулярно этим заниматься. Приведу пример.
В свое время для меня матан был китайской грамотой. А при виде несобственных интегралов я впадал в полуобморочное состояние. Но, как известно, успех любого специалиста прямо пропорционален квадрату его задницы. Выбор у меня был простой. Либо отчисляться с позором, либо таки научиться брать эти интегралы. Вооружившись Фихтенгольцем, Демидовичем и китайским Антидемидовичем я взялся за дело. С первыми 30 интегралами проблем не было. Они табличные, либо сводятся к ним в пару преобразований. А вот дальше было очень весело. В китайском антидемидовиче решения были, даже с комментариями и подробным объяснением. Но, сука, на китайском. У меня было всего 2 пути. Либо разбираться с матаном, либо учить китайский. Я пошел по первому пути. После первой сотни я начал понимать, что вроде там ничего сложного то и нет. После второй – я начал то ли понимать что я делаю, то ли осваивать китайский. После третьей – я почти перестал подглядывать в китайца. По итогу: зачет был сдан, экзамен тоже. С чистым кодом, архитектурой и прочими сложными штуками ситуация аналогичная. И мы попробуем таки это сделать – научиться ими пользоваться. Для этого нам понадобится:
  1. составить список литературы и ресурсов по теме, с указанием их преимуществ и недостатков;
  2. изучить принципы написания чистого кода и научиться применять их на практике:
    1. SOLID – Single Responsibility Principle, Open-Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Inversion Principle;
    2. YAGNI – You Aren’t Gonna Need It;
    3. KISS – Keep It Simple, Stupid;
    4. DRY – Don’t Repeat Yourself;
    5. SoC – Separation of Concerns.
  3. разобраться с композицией и агрегацией – что это, для чего, чем отличаются, научиться применять на практике;
  4. изучить общепринятые практики обработки ошибок и исключений;
  5. изучить и научиться использовать общепринятые практики документирования и комментирования;
  6. изучить инструменты и методологии рефакторинга, научиться применять;
  7. code review – практика, практика и ничего кроме практики.
6. Цель: Изучить системы контроля версий и научиться применять их как в командной, так и при индивидуальной разработке.
Задачи:
  1. изучить основные понятия и терминологию – репозиторий, коммит, ветка, слияние, конфликт;
  2. изучить основные команды систем контроля версий – на примере git:
    1. инициализация репозитория – git init;
    2. клонирование существующего репозитория – git clone;
    3. добавление файлов в репозиторий – git add;
    4. фиксация изменений – git commit
    5. операции с ветками – git branch, git checkout;
    6. операции слияния – git merge
    7. внешние репозитории, операции с ними – git push, git pull
  3. (c) изучить основной функционал платформ для управления репозиториями, такие как Github, Gitlab, Bitbacket, Gitea, включая:
    1. управление репозиториями;
    2. отслеживание и управление изменениями в коде, включая просмотр истории коммитов, просмотр изменений между коммитами, просмотр различий между ветками и другие функции;
    3. управление ветками и слиянием, включая создание новых веток, слияние веток, разрешение конфликтов и другие функции;
    4. управление пользователями и группами;
    5. управление проектами;
    6. интеграция с таск-трекерами – Jira, Trello, Open Project;
    7. CI/CD
7. Цель: дать общее представление о внутреннем устройстве операционных систем.

Задачи: (нагло слямзил у Русиновича)
  1. составить список литературы и ресурсов по теме;
  2. ознакомиться с основными концепциями внутреннего устройства Windows;
  3. ознакомиться с особенностями архитектуры и основными компонентами Windows;
  4. ознакомиться с понятием процессов, особенностями их реализации, операций над ними;
  5. ознакомиться с понятием заданий, как механизмом управления наборами процессов и поддержки контейнеров Windows;
  6. ознакомиться с понятием потока, механизмами его создания, внутренней структурой, организацией планирования потоков в Windows;
  7. ознакомиться с принципами управления памяти в Windows, понятием диспетчера памяти, принципами его работы, механизмом использования памяти процессами и драйверами;
  8. ознакомиться с системой ввода/вывода в Windows, ее интеграция с драйверами устройств, механизмы работы с периферийными устройствами ввода/вывода;
  9. ознакомиться с механизмами безопасности, встроенными в Windows, в частности инструментами борьбы с эксплойтами. Наиболее интересный раздел для нас, но его понимание невозможно без предварительного изучения остальных.
Для Unix систем список задач будет аналогичен, на нем пока останавливаться не буду, дополню, если потребуется.
8. Цель: дать общее представление о работе компьютерных сетей, организации корпоративных сетей.
В данном разделе основной упор будет сделан на внутреннее устройство корпоративных сетей, принципы их работы.
Задачи:
  1. составить список литературы и ресурсов по теме;
  2. ознакомить с основными понятиями компьютерных сетей;
  3. ознакомить с внутренним устройством корпоративных сетей;
  4. ознакомить с Active Directory.

9, Цель: – дать общее представление о написании зловредов средствами С++. Разработать в рамках курса супер-пупер-вирус, которым можно взломать Пентагон или спереть всю крипту у жирных буржуев.
Задачи:
  1. определиться с типом разрабатываемого приложения;
  2. определить ключевые этапы разработки;
  3. выбрать и настроить рабочее окружение, компиляторы, IDE, инструменты;
  4. разработать требования к проекту;
  5. составить из требований техническое задание на разработку, можно даже по ГОСТ;
  6. определить формат ведения документации;
  7. Что на счет прототипирования?
  8. определить методику тестирования, подготовить лабораторию для проведения испытаний, определиться с выходным форматом результатов тестирования и их интерпретацией;
  9. определить файловую и логическую структуру проекта;
  10. определить уровни абстракции;
  11. определить code style проекта, правила именования сущностей;
  12. продумать механизм логгирования – необходимо продумать консольный и файловый формат логов;
  13. определить механизмы отладки;
  14. подготовить инструменты обфускации и морфинга кода;
  15. разработать архитектуру проекта, по всем правилам, включая разработку UML и data flow диаграм;
  16. реализовать MVP – версию продукта, реализующую минимальный функционал, достаточный для использования;
  17. протестировать приложение в реальных условиях, составить список ошибок, необходимых доработок;
  18. вернуться к пункту разработки архитектуры, повторять до достижения необходимого результата.
Считаю, что пока этих целей и задач более чем достаточно для того чтобы приступить к реализации нашего первого
проекта.
Теперь немного о том, что представлено в первой, вводной статье.
Я постараюсь дать, если не исчерпывающий, то стремящийся к таковому список литературы, материалов и инструментов,
необходимых для старта. Постараюсь кратко рассказать об инструментах, которыми лично я пользуюсь каждый день. Еще
раз повторюсь. Основная цель курса дать удочку, а не рыбу. То есть максимально сократить время на изучение теории
«По классике», когда мы сначала изучаем условное ООП, а потом пишем десяток непонятных и никому ненужных «hello
worldow» на демонстрацию всяких там полиморфизмов и прочих инкапсуляций. Но, при этом, без глубокого понимания
теоретических основ нам ловить нечего. Поэтому на каждом этапе я буду стараться давать рекомендации по изучению того
или иного теоретического материала.
Ну что же, поехали.
В этой главе у нас не будет кода, от слова совсем. Будет много умных книжек и серьезных ресурсов. К каждому из
которых я дам краткий комментарий, дабы не размазывать статью.
Также мы постараемся выбрать необходимый инструментарий и настроить рабочее окружение, чтобы подойти к следу-
ющему этапу во всеоружии.
Меньше слов, больше дела. Поехали.


2 Список литературы и ресурсов, необходимых для успешного старта.
2.1 Литература по С++
Я намерено не включаю в список литературы учебники, посвященные азам языка, т.к. всё это вы можете найти и без
меня. Кроме того, я предполагаю, что большинство из начинающих разработчиков в состоянии самостоятельно их, азы,
освоить. Курсов сейчас пруд пруди.
2.1.1 Бессмертная классика.
  1. Бьерн Страуструп. Было бы странно, если бы папа плюсов не был первым в этом списке. Поехали.
    1. Язык программирования С++ – канонический труд, содержащий максимально подробное описание языка. Написана, на мой взгляд, несколько суховато, но это не отменяет её ценности и важности.
    2. Дизайн и эволюция С++ – предоставляет читателю уникальное и глубокое понимание процесса разработки и эволюции языка. Бьёрн Страуструп рассказывает о том, как C++ был задуман, как он развивался и какие решения были приняты на каждом этапе его развития. Книга охватывает основные концепции и принципы, которые лежат в основе C++, а также объясняет, почему были сделаны те или иные выборы в дизайне языка. Рекомендовано к прочтению после получения некоторого опыта в разработке. Читал, но давненько. Пришло время освежить знания.
    3. Язык программирования C++. Краткий курс – сам не читал, наткнулся в процессе подготовки статьи, поэтому описание возьму из тырнета. В этой книге создатель языка C++ Бьерн Страуструп описывает, что собой представляет современный C++. Это краткое самодостаточное руководство охватывает основные функциональные возможности языка и основные компоненты стандартной библиотеки - пусть и не с полной глубиной изложения материала, однако на высоком профессиональном уровне. Книга включает множество конкретных примеров, которые облегчают изучение данного языка программирования.Страуструп представляет функциональные возможности C++ в контексте поддерживаемых ими стилей программирования, таких как объектно-ориентированное и обобщенное программирование. Его книга на удивление всеобъемлюща - она начинается с основ языка программирования C++ и постепенно переходит к таким сложным темам, как многие новые и уже устоявшиеся функциональные возможности C++17, включая семантику перемещения, однородную инициализацию, лямбда-выражения, усовершенствованные контейнеры, случайные числа и параллелизм. Сюда входят и некоторые расширения C++20, например концепты и модули. Заканчивается книга обсуждением дизайна и эволюции C++.
  2. Скотт Мейерс – один из ведущих мировых экспертов по С++, широко востребованный как инструктор, консультант и докладчик на разных конференциях. Более 20 лет книги Скотта Мейерса серии Эффективный С++ являются критерием уровня книг по программированию на С++. Скотт Мейерс имеет степень доктора философии (Ph.D.) в области компьютерных наук в Университете Брауна (Brown University). Его сайт находится по адресу aristea.com. Несомненно, мой любимый автор. Его книги написаны настолько лаконичным и доступным языком, что остается только восхищаться этим и с радостью возвращаться к ним снова и снова. Обязательно к прочтению.
    1. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ [2006] Мeйерс. Не смотря на год издания, не утратит актуальности еще очень долгое время. Особенно будет полезна тем, кто переходит с чистого Си на плюсы.
    2. Эффективное использование С++. 35 новых способов улучшить стиль программирования [2006] Скотт Мейерс – продолжение предыдущей книги.
    3. Эффективный и современный С++ 42 рекомендации по использованию С++ 11 и С++14 [2016]. Скотт Мейерс – продолжение легендарной серии книг, на этот раз посвящена современным стандартам языка. Если вам нужна базовая информация о «современных» возможностях С++, то ее можно найти в избытке. Но если вы ищете руководство о том, как использовать эти возможности для создания правильного, эффективного, сопровождаемого и переносимого программного обеспечения, поиск становится более сложным. Вот здесь вам и пригодится данная книга. Она посвящена не описанию возможностей С++ 11 и C++l4, а их эффективному применению.
    4. Андрей Александреску. Современное проектирование на С++. Было бы непростительной ошибкой не включить данный труд в список литературы обязательной к изучению. В этой книге представлена коллекция пригодных к повторному использованию проектных решений, называемых обобщенными компонентами (generic componetns), также способы их разработки. Обобщенные компоненты предоставляют пользователю хорошо известные выгоды, свойственные библиотекам, однако они пригодны для более широкого спектра системных архитектур. Приемы кодирования и реализации сконцентрированы на задачах и моментах, традиционно присущих проектированию, которое обычно предшествует собственно кодированию программ. Благодаря своему высокому уровню абстракции обобщенные компоненты позволяют необычайно выразительно, сжато и легко отображать в коде сложные архитектуры. (цитата из книги)
2.1.2 Полезные ресурсы.
  1. 1 .Ravesli – один из лучших русскоязычных курсов для новичков. В РФ, к сожалению недоступен, по понятным причинам. Еще один повод разъебать пендосов.
  2. 2. https://en.cppreference.com/w/ – вся документация по языку.


2.1.3 STL
STL – стандартная библиотека шаблонов. Не буду растекаться мыслью по древу о ее важности, а просто приведу цитату из предисловия к книге Яцека Галовица (наверное фамилия, всё же, склоняется.) «C++ 17 STL стандартная библиотека шаблонов»:
«Сегодняшний С++ (сам язык и библиотека шаблонов) предоставляет средства для работы со сложными структурами данных и алгоритмами, предлагает возможность управления ресурсами с помощью автоматических указателей, а также поддерживает лямбда-выражения, константные выражения, переносимые средства управления потоками для параллельного (конкурентного) программирования, регулярные выражения, генераторы случайных чисел, исключения, шаблоны с переменным количеством аргументов (эта часть языка C++,отвечающая за шаблонные типы, является полной по Тьюрингу!), определенные пользователями литералы, переносимые средства работы с файловой системой и многое другое. Такое количество возможностей делает С++ универсальным языком, который идеально подходит для реализации высококачественного и высокопроизводительного программного обеспечения, применимого в различных отраслях. Однако многие разработчики С++ охотно изучают сам язык, а библиотеку STL переводят на задний план. Применение языка C++ без поддержки стандартной библиотеки зачастую приводит к тому, что программы выглядят так,
будто написаны с использованием классов, а не с учетом современных подходов. Это печально, ведь подобное применение языка не дает задействовать всю его мощь

В четвертом издании своей книги The C++ Programming Language («Язык программирования С++»), включающем сведения в том числе о С++11, Бьярн Страуструп (Bjarne Stroustrup) пишет: «Пожалуйста, помните, что эти возможности языка и стандартной библиотеки призваны поддержать приемы программирования, позволяющие разрабатывать качественное ПО. Для решения какой-то конкретной задачи их нужно использовать в комбинации друг с другом — как кирпичики из одного набора, — а не отдельно и изолированно друг от друга». »

Сюда я помещу всего 2 книги, но их, считаю, будет вполне достаточно для решения большинства стандартных и не очень
задач, связанных с использованием STL.
  1. 1. Эффективное использование STL [2002] Скотт Мейерс. Не смотря на год издания, не утратила актуальности, такая бессмертная классика. Учит эффективному использованию стандартной библиотеки шаблонов.
  2. 2. C++ 17 STL стандартная библиотека шаблонов. Яцек Галовиц. Ещё одна моя настольная книга.

2.1.4 Boost
Писать на С++ и не использовать всю мощь boost – преступление. Это мое личное мнение. Фактически эта штуковина
дает почти безграничные возможности. Там есть всё, а чего нет – можно написать. Но, как говорится, есть один нюанс. Сразу
пытаться использовать буст – это равносильно самоубийству. Однако, если вы сможете постичь дзен, то всё остальное будет
казаться вам сущими пустяками. Библиотека boost настолько мощная, что отдельным модулям посвящены целые книги. В
частности это
  1. The Boost Graph Library User Guide and Reference Manual. от Jeremy Siek, Lie-Quan Lee и Andrew Lumsdaine. Написана простым и доступным языком, при условии, что у вас есть некоторые познания в теории графов. Кстати, любимый многими BloodHound активно использует под капотом теорию графов. Так что, как ни странно, но именно в мыловарении эта штука – BGL нам может понадобиться, например для построения карты сети и ее последующей визуализации.
  2. John Torjo «Boost.Asio C++ Network Programming» – посвящена программированию сетей с помощью boost.asio. На хабре есть русский перевод этой книги. Для неподготовленной психики читается достаточно тяжело. Лично я сломал мозг не единожды, прежде чем хоть немного стал понимать как работает эта черная магия. Рекомендую приступать к изучению после ознакомления с базовой литературой по сетям.
  3. РАЗРАБОТКА ПРИЛОЖЕНИЙ НА C++ С ИСПОЛЬЗОВАНИЕМ BOOST от Антона Полухина. книга представляет собой сборник рецептов для разработки приложений с использованием библиотеки Boost C++. Антони Полухин рассматривает различные компоненты Boost, такие как Boost.Thread, Boost.Filesystem, Boost.Regex,Boost.Asio и другие. Книга содержит множество практических примеров и рецептов, которые помогают понять и применить библиотеку Boost в реальных проектах. Также периодически обращаюсь к данному источнику.
  4. 4. Boost C++ Libraries: A Practical Guide, Борис Шелинг – неплохая книжица, но только если у вас нет доступа к официальной документации. В некотором роде дублирует ее.
2.1.5 Qt
Возможно Qt в мыловарении и сложно использовать напрямую, поскольку это тот еще монстр. Однако для вспомогательных целей может вполне даже пригодиться, особенно когда необходимо быстро накидать гуй для более удобного тестирования или использования. Я лично очень люблю делать различные конфигураторы с помощью кути. Это когда ты создаешь мастера, он тебе предлагает заполнить поля на нескольких страницах и на выходе выплевывает JSON. Гораздо проще один раз написать конфигуратор, нежели ручками каждый раз редактировать json или, упаси боже, просить юзера сделать собственный конфиг по вашему образцу. Поверьте, вы узнаете о себе много нового.
Тут у нас тоже всё по классике.
  1. Жасмин Бланшет, Марк Саммерфилд. Qt 4.8. Программирование GUI на С++. Таки да, я опять достал с полки дерьмо мамонта. НО!!! Этого вполне достаточно, чтобы разобраться с основами и успешно писать используя Qt5, Qt6. Это одна из лучших, если не лучшая книга по куте. Шлее, с его очередным новомодным Qt latest edition нервно курит в сторонке. Максимум на что он способен – это перевод официальной документации с небольшой доработкой примеров. Зато стильно, модно, молодежно бл#ть, последнюю версию кути описывает. Шлее хорош только в качестве русскоязычного справочника. Не более. Я имею право это утверждать, имея опыт разработки на Qt более 10 лет. Я начинал еще с Qt 4.8. Сейчас активно использую как Qt 5.15. так и Qt6.
  2. Марк Саммерфилд. Qt. Профессиональное программирование. Разработка кроссплатформенных приложений на С++. Еще один классический труд. Тут уже описывается внутреннее устройство кути. Основной акцент сделан на создании моделей, графических представлений и гибридных приложений «рабочий стол + Интернет», на многопоточной обработке данных и приложениях, содержащих мультимедийные объекты и форматированный текст. Представлено подробное введение в подсистемы анимации и конечных автоматов, включенные в версию Qt 4.6.
  3. Макс Шлее. Qt X.Y. Раз уж я упомянул его, отозвавшись не самым лестным образом, то обязан включить его в список. Вместо X, Y можете подставить произвольные цифры и гугл выдаст нужный результат. Годится только в качестве справочника.
В качестве полезного ресурса для изучения Qt хотел бы порекомендовать evileg.com – отличный цикл уроков по кути,
от азов, до сложных вещей. Автор, вроде как, действующий Qt разработчик. Там же есть статьи по многим направлениям,
в том числе по азам С++, несколько статей по boost, из которых заслуживает отдельного внимания статья, посвященная
статической линковке приложений с бустом, под винду. Но наиболее полный курс у него получился именно по куте.
2.2 Чистый код. Искусство рефакторинга.
Одна из целей проекта – научиться писать чистый код. Рассмотрим основную литературу по теме.
  1. Роберт Мартин. Чистый код. Создание. Анализ. Рефакторинг. – классика, обязательная к прочтению. Настольная книга, к которой я обращаюсь каждый раз, когда перестаю понимать что происходит в моем коде. По задумке автора должна научить писать вас читаемый, поддерживаемый и расширяемый код. Огромное внимание уделяется именованию всего и вся, комментариям, форматированию кода. Вроде бы мелочи, но из таких мелочей и рождается чистый код.
  2. 2. Рефакторинг. Улучшение существующего кода | Фаулер Мартин. Отличная книга. В дополнение к «Чистому коду» Дядюшки Боба. Обязательна к прочтению.
  3. 3. Стив Макконнелл. Совершенный код. Еще один классический мастодонт. Также рекомендую в качестве настольной книги. Вы можете не читать ее всю целиком, но обращаться к ней, когда у вас возникнут проблемы с поддержкой собственного кода.
Я намерено не расширяю список другими произведениями, ибо их десятки и сотни. Каждый составит собственный «must
read» список, но даю необходимый минимум.
2.3 Литература по проектированию и архитектуре ПО.
Самое интересная и сложная часть. Тут, опять же, мы не обойдемся без классики. Поехали.
  1. 1. Паттерны объектно-ориентированного проектирования. Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес – начнем, конечно, с «Банды четырёх». Это, что называется, must read for each coder. Ей, кстати, тоже сто лет в обед, но это фундаментальный труд. Основа основ. Описаны 23 классических паттерна и дано множество примеров их практического применения. Язык, относительно простой и понятный.
  2. Погружение в паттерны проектирования [2018] Александр Швец – очень рекомендую. Написано очень доступно, с кучей картинок. К тому же автор русскоязычный, что сильно упрощает понимание. Однозначно рекомендую к прочтению. Очень сильно помогает понять содержание основной книги.
  3. Head First. Паттерны проектирования. – стильно, модно, молодежно, с прикольной телкой на обложке. Не знаю. Мне лично не зашла. Много картинок и мало сути. После Швеца не пляшет, на мой взгляд. Но упомянуть о ней обязан.
  4. Чистая архитектура. Искусство разработки программного обеспечения. Мартин Роберт. Книга не нуждается в представлении, предлагает подробное руководство по созданию чистой архитектуры программного обеспечения. Роберт Мартин объясняет, как структурировать приложения, чтобы они были легко поддерживаемыми, тестируемыми и масштабируемыми. Книга охватывает принципы SOLID, зависимости, границы и другие важные аспекты архитектуры ПО. Является обязательной к прочтению.
2.4 Литература по управлению проектами.
пока опущу этот пункт, нам добраться бы до него.

2.5 Литература по внутреннему устройству операционных систем.
Знание внутреннего устройства ОС и понимание механизмов их работы является критически важным как для мыло-
варов, так и для специалистов по защите информации. Тут можно провести аналогию с автомехаником и пониманием им
устройства и принципов работы ДВС.
Рассмотрим основные задачи, для решения которых оно таки надо:
  • поиск и эксплуатация уязвимостей – переполнение буфера, например;
  • понимание принципов работы системных вызовов, процессов, файловых систем, сетевого взаимодействия;
  • написание персистентных вирусов – способных оставаться в системе даже после перезагрузки. Для этого используется запись в реестр; создание задач в планировщике; подмена системных файлов; использование руткитов с помощью которых возможно повторное заражение системы, в случае удаления файла; изменение атрибутов файлов для сокрытия компонентов;
  • защита от обнаружения антивирусами;
  • обход защитных механизмов как на уровне ОС, так и антивирусов, межсетевых экранов и прочих веселых штук, с которыми нам обязательно придется столкнуться во время полевых испытаний, поскольку они тоже активно используют различные фичи ОС.
Начнем, как обычно, с классики.
  1. Эндрю С. Таненбаум. Современные операционные системы. Большой талмуд, охватывающий как общие моменты для большинства операционных систем, так и подробно описывающий особенности, например, windows, android, linux. Лично я использую в качестве справочника.
  2. "Operating System Concepts"by Abraham Silberschatz, Peter Baer Galvin, and Greg Gagne. Если верить описанию, то это один из наиболее авторитетных учебников по ОСям, охватывающий основные концепции и принципы работы операционных систем, включая управление процессами, памятью, файловыми системами, безопасностью. Ранее не сталкивался. Буду изучать.
2.5.1 Windows
  1. 1. Марк Е. Руссинович. Внутреннее устройство Windows. В некотором смысле «наше всё». Опять же – это мое, сугубо личное мнение, но лучшего и наиболее полного издания, посвященного именно архитектуре винды, не найти. Возможно я плохо искал. Здесь есть всё, что нам необходимо знать на старте. Язык очень доступный. Таки да, там уже рассматривается Windows 10. А для любителей всего нового замечу, что в живых сетях до сих пор встречаются такие динозавры, как Windows Server 2003. Причем частенько они подключены к основной сети и есть шанс пробиться через них, поскольку аверами там и не пахнет.
  2. 2. Windows Internals: The Implementation of the Windows Operating Environment"by David A. Solomon. Нашел только английскую версию. На первый взгляд очень подробно излагаются основные темы. Рекомендовано к прочтению.
2.5.2 Linux
Линукс мы пока тоже опустим. Для начала с виндой бы разобраться. Первое что пришло на ум – Роберт Лав «Linux
driver development».

2.6 Литература по сетям.
Тут тоже всё по классике.
  1. 1. Эндрю С. Таненбаум. Компьютерные сети. – охватывает основные концепции и принципы работы компьютерных сетей, включая архитектуру сетей, протоколы, маршрутизацию, безопасность, управление сетями и многое другое, в общем всё то, что нам непременно понадобится когда-нибудь.
  2. 2. Основы сетей от сетевой академии Cisco. Очень полезная книжица, идеально подходит в качестве настольного справочника.
Возможно вы сможете еще что-то порекомендовать. Буду очень признателен.
2.6.1 Литература по корпоративным сетям и Active Directory
Active Directory – это штука, представляющая собой такой «Швейцарский нож», с помощью которого хоть ракету в космос можно запустить, только нужно найти нужную кнопку. Проблема в том, что ее еще надо найти. Возможно сравнение и не очень корректное, но вот мысль, которую я хочу донести – если бы сисадмины использовали хотя бы 50% ее возможностей, то 99% мамкиных хацкеров никогда бы не заработали свою первую десятку зелени на халяву. К нашему счастью, с той стороны мамкиным хацкерам противостоят мамкины же сисадмины, которые зачастую не понимают мощности инструмента, который им достался. Там только с помощью одних групповых политик можно так законопатить сеть, что мышь не проскочит.
  1. 1. Ричард Мориарти. Active Directory: Полное руководство Подробное руководство по Active Directory, охватывающее все аспекты службы каталога. Книга объясняет архитектуру, настройку и управление объектами, а также интеграцию с другими службами Microsoft.
  2. 2. Брайан Поузи. Windows Server 2022: Полное руководство. Полное руководство по Windows Server 2022, охватывающее все аспекты администрирования и настройки сервера. Книга включает информацию о роли Active Directory Domain Services, управлении групповыми политиками и других важных аспектах.
  3. Ralf Hacker. Active Directory глазами хакера. Довольно свежая. Настоятельно рекомендую к изучению. Рассматривается архитектура системы безопасности Active Directory.

2.7 Литература по информационной безопасности.
С этим пунктом мне обещали помочь наши уважаемые форумчане, ибо обычные книги успевают устареть раньше, чем
будут напечатаны. Чуть позже этот пункт дополню.
2.7.1 Вирусология. Написание вирусов и прочих зловредов
2.7.2 Методы защиты информации.

2.8 Литература по системам контроля версий.
Поскольку мы будем использовать git, то я ограничусь литературой по этому продукту, который сильно упрощает жизнь.
1. Скотт Чакон, Бен Страуб, ProGit – исчерпывающее руководство по Git, которое будет полезно менеджеру по
конфигурации. Книга покрывает все основные аспекты Git, включая создание репозиториев, ветвление и слияние, а
также расширенные техники работы с Git.


3 Подготовка к запуску проекта. Управление проектом. Инструменты для команд-
ной разработки.

Теперь нам нужно подготовить рабочее окружение. Нам понадобятся:
  • • Таск-трекер;
  • • система контроля версий, а также веб-морда к ней, для совместной работы над исходным кодом;
  • • IDE – интегрированная среда разработки. Штука нужная и полезная. К ее выбору необходимо подойти очень тщательно.
  • • к IDE нам понадобится компилятор, отладчик, система сборки.
  • • поскольку курс у нас продвинутый, а сами мы крутые перцы, то код у нас будет покрыт модульными тестами. А еще попробуем разобраться с тем что такое интеграционное и, прости господи, нагрузочное тестирование.
Поехали.
3.1 Таск-трекер. Выбор, настройка, политики использования.
Начнем с Таск-трекера. Если коротко , это специальный сервис для отслеживания выполнения задач. С очень бога-
тым внутренним миром, с этими вашими канбанами,эджайлами и прочими scrum’aми. Наиболее известные: Jira, YouTrack,
OpenProject, Redmine. Каждая из них обладает своими преимуществами и недостатками. Функционал, плюс минус, похож
– отслеживание времени и затрат, совместная работа над проектами, интеграция с gitlub, github, .... Можно развернуть
на собственном сервере. Jira и YouTrack бесплатны для команд до 10 человек. OpenProject и Redmine - опенсурсные и
бесплатные.
Redmine – имеет необходимый и достаточный функционал для полноценного управления проектом и командой.
Расширяется с помощью плагинов, но в последнее время, как мне кажется, уже немного старомоден, что-ли. Многое
придется настраивать ручками, маловато готовых шаблонов. При установке необходим шаманский бубен и хороший
запас русского матерного, ибо написан он на рельсах (Ruby on Rails).
OpenProject – имеет богатый функционал «из коробки», можно настроить под себя всё что угодно. Ставится из
коробки без лишних телодвижений.
Лично мне нравится OpenProject. YouTrack тоже хорош, но с недавнего времени я принципиально не плачу этим редискам из
JetBrains. Jira – корпоративный монстр, как по мне. Ее точно не стоит использовать в проектах с общим числом участников
менее сотни.

3.2 Выбор и настройка системы контроля версий.
Про системы контроля версий я уже писал в целях и задачах. Рассмотрим две наиболее популярные – git и subversion. А
использовать будем гит, т.к. его, по меньшей мере основные команды, так или иначе знают большинство.
3.2.1 GIT
Для винды я рекомендую использовать git for windows (https://gitforwindows.org/). Отличная консольная утилита. С поддержкой основных команд. Да еще умеет в основные команды линукса – cd, ls, cat, cp, mv, и даже бальзам на мою душу – встроенный редактор vim – git bash это называется. Git BASH Git for Windows provides a BASH
emulation used to run Git from the command line. *NIX users should feel right at home, as the BASH emulation behaves just like the "git"command in LINUX and UNIX environments. Установка простая, позволяет выбрать формат коммитов и, самое главное, при инициализации пустого репозитория создает ветку master, которая существовала испокон веков, что называется. А не, «main», бл#ть, которую придумали недопидорги-общечеловеки.

Под линуксом ставится в одну команду
sudo apt install git

Для удобства я развернул gitlab. Кому надо – стучите в личку, выдам доступ. Там же есть встроенный таск-трекер.
3.2.2 Subversion (SVN)
После работы с git кажется очень неудобной. В одной из контор, где мне довелось работать, использовали сие чудо.
Каких-то негативных эмоций не было. Но привыкать к мышкоблудию пришлось довольно долго. Под виндой вменяемых
консольных клиентов я не нашел. Если кто встречал – поделитесь в комментах. А гуевина есть – черепашка мы ее звали,
TortoiseSVN называется. Хороший инструмент, но тут уже, как говорится, вкусовщина. Мне достаточно нормального bash
окружения для git.

4 Подготовка рабочего окружения.
4.1 Выбор IDE
Выбор IDE для программиста сродни выбору снаряги для покорения Эвереста альпинистом. Современные IDE в том
или ином виде предоставляют весь необходимый функционал и даже больше. О существовании многих фич можно даже не
подозревать. Постараюсь быть кратким.
4.1.1 MS Visual Studio
Студия. Старая, добрая, ламповая. Может и умеет почти всё. Нужно уметь ее готовить. Поддерживает несколько компи-
ляторов и систем сборки. Умеет даже в линукс, но я лично сложнее «hello world’a» не писал, чисто поигрался, потестировал.
Доступно несколько лицензий, в том числе бесплатная. Я использую professional. Мне хватает. Ключики лежат на гитхабе
и гуглятся на раз. Что интересно – без проблем доступна из РФ.

Модульное тестирование (или юнит-тестирование) — это процесс в программировании, позволяющий проверить
на корректность отдельные модули исходного кода программы. Модули могут включать в себя один или несколько про-
граммных модулей вместе с соответствующими управляющими данными, процедурами использования и обработки. Ос-
новные принципы модульного тестирования:
• Изоляция: каждый модуль тестируется отдельно, что позволяет быстро выявить ошибки и регрессии.
• Поощрение изменений: модульные тесты помогают программистам проводить рефакторинг кода, будучи уверен-
ными в его корректности.
• Упрощение интеграции: модульное тестирование помогает устранить сомнения по поводу отдельных модулей и
может быть использовано для подхода к тестированию «снизу вверх».
• Документирование кода: модульные тесты можно рассматривать как «живой документ» для тестируемого класса.
• Отделение интерфейса от реализации: модульные тесты помогают абстрагироваться от сложных зависимостей
и минимизировать их в системе.
Преимущества модульного тестирования:
• Быстрое выявление ошибок: Позволяет быстро обнаруживать ошибки в коде и исправлять их.
• Упрощение рефакторинга: Поощряет программистов к изменениям кода, так как легко проверить, что код рабо-
тает и после изменений.
• Упрощение интеграции: Помогает устранить сомнения по поводу отдельных модулей и может быть использовано
для подхода к тестированию «снизу вверх».
• Документирование кода: Модульные тесты могут служить примером использования класса.
• Отделение интерфейса от реализации: Помогает минимизировать зависимости в системе.
Существует много различных фреймворков для модульного тестирования. Мы рассмотрим наиболее популярные.
5.1.1 Google tests.
Google Tests — это библиотека для модульного тестирования на языке C++, разработанная Google. Она предостав-
ляет мощный инструмент для тестирования отдельных частей программы (классов, функций, модулей) в изоляции.
Основные особенности Google Tests включают:
• Минимальные единицы тестирования: Каждый тест представляет собой отдельную единицу, которая автомати-
чески запускается при запуске.
• Группы тестов: Тесты могут быть объединены в группы, что позволяет организовать тестирование более структу-
рированно.
• Тестовые классы (test fixture): Возможность создания и повторного использования одной и той же конфигурации
объектов для нескольких различных тестов.
• Безопасность для многопоточного использования: Библиотека разработана с учетом многопоточного использо-
вания, хотя для использования утверждений в разных потоках одновременно требуется самостоятельная разработка
примитивов синхронизации.
• Поддержка различных платформ: Официально поддерживается на Linux, Windows и Mac, но также работает на
множестве других систем.
Гуглотесты отлично интегрируются со всеми вышеперечисленными IDE. Пока остановимся на них.
Я тут еще много чего хотел написать. Но пока не буду. Итак уже тут много воды налито.

6 Заключение
В общем получилось что есть. Несколько растянулось это дело всё.
Теперь попробую описать дальнейшие шаги.
1. определиться с типом разрабатываемого приложения;
2. описать его примерный функционал;
3. сформулировать требования к продукту;
4. составить техническое задание;
5. спроектировать архитектуру;
6. разработать MVP продукта;
7. ну и так далее, я там выше уже всё это писал
Я это к чему всё. Если кто-то думает, что я буду в одну каску код писать – таки нет, вы сильно ошибаетесь. У нас будет
полноценная командная разработка. Во всяком случае я очень надеюсь, что это получится. А я потом буду всё это веселье
описывать. Прошу всех желающих принять непосредственное участие в разработке оставить плюсик.
Спасибо всем, кто дочитал до конца.
За сим позвольте откланяться.56
 
Сверху Снизу