• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как правильно изучать malware-кодинг под Windows

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Эта мини-статья является развернутым описанием моего старого поста https://xss.pro/threads/34442/post-204920 Ничего особо нового тут не будет, просто решил выделить отдельной темой и дооформить.

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

0х0
Итак, начнем. В школе сначала учатся читать и писать, а потом уже переходят к другим дисциплинам, в случае же нашей темы - вы должны уметь пользоваться Windows , на уровне уверенного пользователя / начинающего сисадмина. Понятно, что если вы читаете эту статью, значит какие-то навыки работы с компьютером у вас есть. Но соц.сети и ютуб это не то, что нужно. Вы должны уметь пользоваться командной строкой Windows (cmd.exe) , "путешествовать" по файловой системе, иметь базовые понятия о .bat файлах, переменной %PATH% (знать что это, уметь добавить/удалить туда значения). Нужно разобраться и настроить виртуальную машину, т.к. во-первых, подобный софт может убить основную ОС, а во-вторых , малварь придется проверять на разных выпусках и версиях винды. Конкретную литературу к этому пункту не могу посоветовать, т.к. у всех разный уровень знаний.

Теория:
Практика:
  • установить виртуалку (VirtualBox или другую), поставить туда семерку / ХР.
  • В командной строке перейти в другую папку, на другой диск, создать файл, удалить файл, выполнить программу из цмд . Справку ищите на https://ab57.ru или в гугле.

0х1
Далее, нужно определится с языком программирования, т.е. на чем все это дело будет создаваться. Если вкратце, то учить надо язык Си. Если подробнее - язык программирования должен быть нативным (т.е. никаких фреймворков и прочее) и компилируемым (не скрипты). На эту тему можно много холиварить, почему так , а почему не учить петон, а вот на шарпе... Я уже говорил много раз, как первый язык нужно то, где нет ничего лишнего вида неотключаемых библиотек, фреймворков, сборщиков мусора. Именно чистый код. Изучите это - можете потом писать на чем угодно, но начинать учиться нужно именно с такого языка.
Языков много, но в принципе, выбирать можно между Си и Паскалем. Почему не Ассемблер? С него очень тяжело начинать, я знаю это по своему опыту. Изучая Ассемблер в качестве первого языка , вы будете вынуждены учить и сам Асм, и основы программирования, и WinApi (поскольку в Асма нет никакой стандартной библиотеки). Т.е. чтобы вывести строку на экран или там записать в файл, вам надо будет параллельно изучить чудесный мир Windows API, с миллионом параметров и тысячей типов данных , да еще и ксорить дворды конвертировать это в Асм-код. В то время как Си или Паскаль на этом этапе позволят "схалявить" и использовать простые функции. Почему не С++ ? Потому что в нем нет никаких преимуществ перед чистым Си в контексте нужной нам задачи, а учить ООП и новые стандарты с 0 - нереально (и бессмысленно). Настоящие плюсы - это фабрики, шаблоны, итераторы, умные указатели , буст и т.д. и т.п, а не "Си с классами" образца 94 года , как видят С++ многие. Со временем, возможно, вы захотите перейти на плюсы, но не сейчас. Есть еще freebasic и прочая экзотика, но эти языки менее популярны, и в случае чего (нет инклуда, какая-то ошибка) не у кого будет спросить. Вначале обучения это очень важно, когда есть ошибка, которая не гуглится и спросить особо не у кого. Поэтому - либо Си, либо Паскаль. С чего бы не начали, правда, надо учесть, что знание Си (на уровне чтения сорцев) все равно будет нужно , т.к. все эти MSDN и книги содержат примеры именно на этом языке. В данной заметке я тоже буду ориентироваться на Си, поэтому изучайте Си. Касаемо паскаля - если у кого есть на примете хорошая книга для начинающих (и мысли на эту тему) , пишите здесь. Я могу вспомнить только Столярова https://xss.pro/threads/28946/ , но и у него паскаль идет сугубо как подготовка к Си-кодингу.

Теория:
  • Стивен Прата "Язык программирования С. Лекции и упражнения". https://rutracker.org/forum/viewtopic.php?t=4791274 Она подойдет тем, кто начинает с полного 0, т.к. там все разжевано до мельчайших деталей.
  • Брайан Керниган, Деннис Ритчи. "Язык программирования Си" https://rutracker.org/forum/viewtopic.php?t=32310 более сложная книга (относительно первой), но это классика (авторы создали язык Си).

Практика:
  • Все упражнения из книги (закодить самому , разобраться как что и почему работает, поэкспериментировать с разными возможностями языка).
  • Установить Visual Studio, там хорошая пошаговая отладка, подсветка синтаксиса, автодополнение и т.д. Почитать справку, как там дебажить, потестить на практике (регистры, память, переменные).

0х2
Изучив базовые основы языка Си, можно двигаться дальше , а именно - приступить к изучению WinApi. Основная разработка в ОС Windows идет с помощью Win32 Api - это , так сказать, самый низкий (из документированных Майкрософтом) уровень для разработки под винду в юзермоде. Еще есть Native Api и даже прямой вызов сисколов, но пока этого всего не надо. Вам нужно усвоить базовую информацию по разработке под Windows - что такое поток, процесс, служба, как разрабатываются многопоточные приложения и т.д. Параллельно нужно совершенствовать знания языка Си, а именно - изучить базовые алгоритмы. С некоторыми из них вы должны были уже встречаться ранее. Знание алгоритмов нужно, чтобы быть именно нормальным программистом, а не "быдлокодером". Также некоторые системные структуры (да и просто чужие сорцы) могут использовать все эти хэш таблицы, двусвязные списки, и подобное. Конечно, в любом языке программирования давно существуют стандартные библиотечные средства для такого. Но - вам нужно понимать, как все это дело устроено на низком уровне, а уж потом юзать готовое. Вообще, в процессе обучения нужно делать свои "велосипеды", чем больше тем лучше.

Теория:
  • Финогенов К.Г "Win32. Основы программирования" https://rutracker.org/forum/viewtopic.php?t=908022 , самая простая и базовая книга по WinApi. К сожалению, автор ее писал лет 20 назад, когда еще все было по другому, но все же.
  • http://firststeps.ru/mfc/winapi/win/apiwind1.html - основы винапи на русском языке, и вообще полезный сайт
  • Керниган, Пайк "Практика программирования" https://rutracker.org/forum/viewtopic.php?t=3049308 отличная книга (один из авторов - создатель Си и Go), как раз на тему алгоритмов и разработки в целом.

Практика:
  • Напишите простейшие GUI приложения под винду. Никаких компонентов, чистый WinApi (окна, диалоги). Потестируйте разные примеры с книги Финогенова.
  • Доработайте свои примеры из книг по Си (раздел 0х1), добавив туда окна. К примеру, окно, форма ввода открыть такой-то файл, если ок - считать данные с него, если не ок - вывести ошибку.

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

Теория:
  • Джеффри Рихтер "Windows via C/C++" https://rutracker.org/forum/viewtopic.php?t=3075398 . Классика системного программирования под винду. Вне зависимости, что еще вы планируете изучать, эту книгу прочитать вы обязаны.
  • Дж. Харт "Системное программирование в среде Windows" https://rutracker.org/forum/viewtopic.php?t=988938 Также неплохая книга, есть задания для самостоятельной работы.
  • Рихтер, Кларк , "Программирование серверных приложений для windows 2000" https://rutracker.org/forum/viewtopic.php?t=298205 далеко не все из этой книги вам понадобится сразу, но некоторые темы (реестр, файлы) следует изучить, т.к. они дополняют первую книгу. Кстати, именно в этой книге есть IOCP (нафиг никому не нужный 20 лет, но внезапно обретший популярность из-за говнолокеров).

Практика:
  • В вышеупомянутых книгах много примеров , изучите их, попробуйте что-то изменить, выполните задания по доработке примеров или придумайте сами.
  • Напишите простейший криптолокер, который ищет файлы и шифрует их банальным ксором. Используйте разные технологии (потоки, порт, тредпул), сравните какая эффективней (как сравнивать см. в книге Харта).
  • Напишите компонент (модуль в виде DLL) для вашего криптолокера, пропишите его в реестр ; добавьте отстук на какой-то домен (используя Wininet/winsock/winhttp api, документацию см. в мсдн).

0х4
В книге Рихтера из предыдущего этапа в конце обучения вы столкнулись с понятием инжекта в процесс, перехватом апи функций и подобными темами. Пришло время изучить это все дело подробнее. Нужно учиться изучать программы без исходных кодов, дебажить их, реверсить , понимать логику чужой программы и искать ошибки в своей в боевых условиях. Студийный отладчик помогал все это время в обучении. Но для чужих программ такой халявы не будет, т.к. у вас нет исходных кодов , а только Асм листинг. Чем дебажить? Можно взять как старую OllyDBG (только 32 бита), так и более новый x64dbg, и разбираться. Сначала трейсить пошагово свои же программы, параллельно читая справочник по Ассемблеру. Книжек по последнему есть великое множество, но не все оттуда нужно в данном случае - Асм достаточно понимать, а не писать на нем (тем более под dos, как учит 80% авторов). Знания Ассемблера пригодятся и дальше, для вызова сисколов, сокрытия/перехвата вызовов винапи, разработки шеллкодов и так далее.

Теория:

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

0хFF
Вот таков примерный курс, изучив который вы сможете уверенно начать разрабатывать простую малварь. Почему простую? Потому что, увы, несмотря на большой объем инфы, многие вещи все равно еще остались за кадром. К примеру, РЕ формат , секьюрити винды, технология СОМ, драйвера (не обязательно учиться писать малварь под ядро, но понимать как там что устроено, весьма желательно), криптография, сеть, NTFS , графика винды (огромная тема, все эти GDI+, win32k.sys) и т.д. и т.п. Но это все дело поправимое, было бы желание учится. Имея базу, можно со всем постепенно разобраться.

Дальнейшее чтение:
  • MSDN
  • Марк Руссинович "Внутреннее устройство Windows"
  • "от зеленого к красному" - три статьи, линк ищите сами, на васме или chm копии старого васма.
  • rsdn.org
  • Свен Шрайбер "Недокументированные возможности Windows 2000"
  • ..... тысячи сайтов, страниц, книг..

Дальнейшая практика:
  • реверс чужой малвари, написание своей. Что-то не знаете - реверсите конкурента, читайте аверские обзоры , спрашивайте на форуме.

И постоянно учитесь, ведь знание это Сила и главный капитал!

Примечания.
  1. Статья отображает сугубо мое субъективное мнение и мой личный опыт, никого ни к чему не призывает, просто советует. Конструктивная критика ("сначала лучше изучить Х, а там сделать упор на Y перечитав Z") приветствуется. Неконструктивная ("это все бред, учите петон!") будет удаляться (но никто не запрещает создать свою тему и там расписать свой опыт от и до).
  2. Ссылки на материалы, ес-но могут устареть, умереть, переехать, поэтому ищите их по названию в гугле.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Спасибо автору, как раз начал интересоваться этой темой (т.к. на данный момент прошёл больше половины книги Стивена Прата про Си, а для чего ещё учить си как не для вирусов всяких), а тут такой подгон. От души!!! Си я кста учить начал после петона, мне язык очень нравится, есть сложные моменты, но в этом и весь вкус. Теперь уже на петоне не пишу, как бы не забыть)))

Учите Си, не будьте дэбилами. (если мы говорим про низкоуровневое программирование.)

Вопрос к автору, далее лучше взять книгу К&R, или идти дальше, например изучать ВинАпи?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вопрос к автору, далее лучше взять книгу К&R, или идти дальше, например изучать ВинАпи?
В принципе, эти книги взаимозаменяемы. Просто К&R это руководство для программистов (где-то у них в предисловии даже было), а Прата - для новичков (больше разъяснений, разжевывания).
После Праты можно переходить к винапи, но , подчеркну еще раз - упражнения что он дает, нужно закодить. Можно пропустить ерунду вида вывода елочки в консоли (хотя , в целом, лишних знаний не бывает, вот теже локерщики делают консольные декрипторы с меню и т.д.), но нельзя игнорировать указатели, структуры, файлы. Т.к. непонимание какого-то момента вначале обучения сводит на нет всю дальнейшую науку. Прежде чем переходить к винапи вы должны четко усвоить и понять язык Си.
 
установить виртуалку (VirtualBox или другую), поставить туда семерку / ХР / висту / восьмерку / 8.1 / десятку / серверные версии винды / а также все 64 битные версии

Вот так, чтобы по кайфу.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В принципе, эти книги взаимозаменяемы. Просто К&R это руководство для программистов (где-то у них в предисловии даже было), а Прата - для новичков (больше разъяснений, разжевывания).
После Праты можно переходить к винапи, но , подчеркну еще раз - упражнения что он дает, нужно закодить. Можно пропустить ерунду вида вывода елочки в консоли (хотя , в целом, лишних знаний не бывает, вот теже локерщики делают консольные декрипторы с меню и т.д.), но нельзя игнорировать указатели, структуры, файлы. Т.к. непонимание какого-то момента вначале обучения сводит на нет всю дальнейшую науку. Прежде чем переходить к винапи вы должны четко усвоить и понять язык Си.
Стараюсь все задачи делать, наверное больше всего времени отнимают, а ещё отнимает время набор кода из примеров, но так больше понимание. С задачами иногда приходится попарится, но зато потом запоминаешь надолго. Кстати, стоит ли вести конспект, я когда питон учил, конспект ввёл, а тут что-то не задалось с насала, всё так запоминал, вот думаю теперь, а может всё таки надо было вести конспект то.
 
На высоте просто!!!
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Кстати да, Apocalypse упомянул важную деталь, которую я упустил. Со временем нужно будет завести парк виртуальных машин для тестирования софта. Где-то на уровне , когда программирования под винду будет более-менее уверенным. Системное программирование имеет огромное к-тво нюансов, которые могут проявляться в зависимости от версии ОС, и боевой софт (имеется ввиду тот, который будет использовать кто-то кроме программиста) должен обкатываться на всех возможных виндах. Где-то нет такой апи, где-то она возвращает такую ошибку, где-то изменили пути.. Тесты должны быть обязательно. С какой ОС начинать? В идеале с ХР, но в реале можно и с семерки, т.к. под ХР практически никто ничего не пишет (видел только какие-то говнолокеры, хз правда кого они лочат). Лично у меня стоят вм начиная с вин2к, но мне интересно в этом разбираться + свет клином на малваре не сошелся. ХР хорош для базового изучения реверса, шеллкодов и так далее - т.к. там еще нет aslr, юак, смартскрин и прочих новинок из более поздних ОС.

А если нацелен под андроид, процесс обучения будет критично другим?
Наверное да. Не писал ни разу под андройд. В любом случае, там совершенно другая архитектура (ARM процессор), и в основном под него пишут на Java.
Впрочем, знание Си и алгоритмов лишним точно не будет. Подробнее не скажу, может кто придет в тему, кто шарит в андро, я же сугубо по винде.
 
А если нацелен под андроид, процесс обучения будет критично другим? И хватит ли Си под андроид?

Дарю сразу чит-шит по АРМ-у

1597039046817.png
 
А не поздно ли в 2020 учить малварекодинг под винду?
Не удел ли это прошлого поколения выращенного на книгах Криса Касперски.
Я ничего не имею против языка Си и С++. Но вот изучать по началу пугающе сложный, непонятный - засоренный огромной кучей разнообразных функций WinAPI по книгам 2006 года - честно говоря страшновато. Страшно что знания потеряют актуальность.
Может же случиться, что через 5 лет Microsoft выпустит Windows 11 на новом ядре и примет решение - убрать обратную совместимость, ради того что-бы почистить немного MSDN от мусора.
А мы с вами, только закончили изучать WinAPI и PE формат итд, которые не настолько фундаментальны, как скажем алгоритмы и структуры данных.
Ну и тем более, что мобильные девайсы вытясняют десктопы с огромной скоростью.

Спасибо за статью, очень полезна. Но уверенное изучение материала в с татье, понадобиться 2-3 года)
Если бы у меня была вторая жизнь, я бы посвятил ее малваре-кодингу)
 
Страшно что знания потеряют актуальность.
Может же случиться, что через 5 лет Microsoft выпустит Windows 11 на новом ядре и примет решение - убрать обратную совместимость, ради того что-бы почистить немного MSDN от мусора.
А мы с вами, только закончили изучать WinAPI и PE формат итд, которые не настолько фундаментальны, как скажем алгоритмы и структуры данных.
Так а что учить то тогда по твоему?))
Или ты предлагаешь вообще ничего не учить, потому что через какое то время знания станут не актуальными?)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А не поздно ли в 2020 учить малварекодинг под винду?
Возможно и поздно, ну так что поделать? Я вот тоже мечтал бы иметь машину времени, и изучать всю эту матчасть с 1995 года, чтоб быть как клерк или еп_кс0фф или еще какая элита. Но надо исходить из текущих реалий, а знания лишними не бывают; те же алгоритмы или Си пригодятся для кодинга под линукс. Тема была создана как ответ на многочисленные вопросы "как учить". Мое виденье именно такое , а кто-то скажет что надо учить шарп или петон.

По теме винапи. Я давно думаю, что МС могут прикрыть все это дело, ввести обязательную ЦП для натив приложений или еще что. Разное может быть, но сомневаюсь что в ближайшие 10 лет оно случится. Слишком много всего написано на чистом Си, в т.ч. в самой винде, чтобы это раз и удалить. Та же технология СОМ - вроде древнее говно, но это основа винды, СОМ нельзя вырезать или убрать; РЕ формат - ну фиг знает что должно быть, чтоб его переписали.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А не поздно ли в 2020 учить малварекодинг под винду?
Не удел ли это прошлого поколения выращенного на книгах Криса Касперски.
Я ничего не имею против языка Си и С++. Но вот изучать по началу пугающе сложный, непонятный - засоренный огромной кучей разнообразных функций WinAPI по книгам 2006 года - честно говоря страшновато. Страшно что знания потеряют актуальность.
Может же случиться, что через 5 лет Microsoft выпустит Windows 11 на новом ядре и примет решение - убрать обратную совместимость, ради того что-бы почистить немного MSDN от мусора.
А мы с вами, только закончили изучать WinAPI и PE формат итд, которые не настолько фундаментальны, как скажем алгоритмы и структуры данных.
Ну и тем более, что мобильные девайсы вытясняют десктопы с огромной скоростью.

Спасибо за статью, очень полезна. Но уверенное изучение материала в с татье, понадобиться 2-3 года)
Если бы у меня была вторая жизнь, я бы посвятил ее малваре-кодингу)
вряд ли актуальность потеряет. Но изучив то, что описал выше Квака можно иметь основное понятие (крепкий фундамент), а дальше реверсисить, самому доучивыть.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
+ к изучению Си могу предложить сайт metanit. Там насколько я помню из книги взято, жаль заданий нету, но как справочник и т.д. норм подойдет.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну ты чё, кто в субботу то начинает, постыдился бы -_-
Я по итогу сегодня начал, а не вчера)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх