Данная статья предназначена для новичков и только в ознакомительных целях, использование приложенных вложений только с указанием авторства.
Ну, а мы начинаем наше путешествие в мир криптеров за пачку киреешек(шутка), на выходе будет продукт который можно будет продавать и стать зимбабвийским миллионером). Глубоко залазить в терминологию и прочую по_бень не будем приступим сразу к основной информации.
Сейчас все AV работают вместе: создают изолированную среду, следят за поведением кода и используют облачные сервисы для анализа подозрительного поведения. Поэтому простые способы внедрения кода уже не проходят, и приходится придумывать все более сложные способы обхода защиты.
Основные техники внедрения кода так и не поменялись и их проблемы остались такими же как и были.
LoadPE - это метод ручной загрузки PE-файла в память, но у него есть серьезные ограничения: не все PE файлы можно загрузить корректно, часто возникают ошибки при обработке заголовков, сложности с правильной загрузкой секций / ресурсов в памяти и проблемы с импортами и переопределением функций.
RunPE продолжает работать даже на Windows 11, но имеет свои ограничения: легко обнаруживается современными системами защиты, создает процесс и инжектит в него код(очень легко его можно сдампить, поставив брячку на WinAPI функции), может быть заблокирован облачными сервисами и сложно обойти проверки песочниц, легко может быть сдамплен обычным школьником которые решит поставить брячку на WriteProcessMemory.
Shellcode - это чистый машинный код, но и он имеет свои проблемы: сложно создать стабильный код для разных версий Windows, может быть обнаружен при анализе поведения(или же тупо пойман по куску кода в памяти), требует больших знаний и написания костылей за свой счет без использования библиотек, пример хорошего loaderа который конвертит PE файлы в шеллкод - Donut(Бублик)
CLR - это среда выполнения .NET, которая также имеет ограничения: может быть отслежена системами защиты(AMSI), сложно скрыть поведение программы и нужно патчить AMSI, есть ограничения в работе с памятью и есть риск обнаружения при анализе облачными сервисами.
Все эти загрузчики достаточно древние, но при этом до сих пор актуальные и широко используемые в создании malware.
Помимо способов загрузки кода существуют и способы сокрытия зашифрованного PE файла в конечном закриптованном файле, в основном хранят в секции .text / .data / .rdata / .rsrc(ресурсы) или же подгружают с интернета в виде картинок из которых потом и берут сам PE файл. Все из этих секций можно будет посмотреть в дизассемблере.
У антивирусов существует несколько видов анализа исполняемых файлов основные из них - статический, эвристический, динамический.
Статический анализ - визуальный осмотр файла, поиск аномалий и сигнатур(уже известных кусков кода в двоичном формате, которые так или иначе были замечены в подозрительной активности, анализ ресурсов, хеш таблицы импортов, энтропия и прочее.
Эвристический анализ - это как "умное предположение" на основе уже известных паттернов(прям как в играх) кусков двоичного кода. Анализ с помощью обученного искусственного интеллекта / натренированной модели, которая будет выявлять аномалии и странности - Пример обученной модели с исходниками(тык).
Динамический анализ - проверка исполняемого файла в изолированной среде, отслеживание поведения и выявление похожих файлов которые уже были, отслеживание url запросов, к каким процессам / файлам был доступ, грубо говоря самый страшный анализ который только может быть.
Современные антивирусы комбинируют все эти методы анализа и поэтому нужно быть готовым против всех, статический анализ достаточно легко обмануть простыми техниками и очисткой кода на бинарном уровне, путём изменения настроек компилятора(Настройки оптимизации и т.д.).
Можно сказать начальную часть этапа мы прошли и узнали много нового или же подкрепили старые знания, которые были у вас до этого, в следующих частях будет знакомство с языками программирования и IDE(редакторы кода) для них.
Написание кода будет в следующих статьях, а пока что было только ознакомление с основной терминологией и с чем нам предстоит иметь дело. В комментариях поправляем меня если что-то не так объяснил или где - то ошибся.
Автор: Barmaleus
Ну, а мы начинаем наше путешествие в мир криптеров за пачку киреешек(шутка), на выходе будет продукт который можно будет продавать и стать зимбабвийским миллионером). Глубоко залазить в терминологию и прочую по_бень не будем приступим сразу к основной информации.
PE(Portable Executable) файл- бинарник, исполняемый файл, сугубо говоря exe файл или же dllка.
Shellcode - машинный код, предназначенный для выполнения напрямую в памяти процесса.
CLR (Common Language Runtime) - частью архитектуры .NET для управления выполнением кода.
AV - AntiVirus / Антивирус.
AMSI (Antimalware Scan Interface) - это интерфейс который позволяет антивирусным программам сканировать и анализировать подозрительный код в реальном времени. Это как специальный "фильтр" в Windows, который проверяет все подозрительные операции в системе, не работает в нативных программах.
Malware - вирус, троян, вредоносная программа.
Дизассемблере - программа которая транслирует исполняемый файл / бинарь в машинный код который мы сможем более менее понять.
Shellcode - машинный код, предназначенный для выполнения напрямую в памяти процесса.
CLR (Common Language Runtime) - частью архитектуры .NET для управления выполнением кода.
AV - AntiVirus / Антивирус.
AMSI (Antimalware Scan Interface) - это интерфейс который позволяет антивирусным программам сканировать и анализировать подозрительный код в реальном времени. Это как специальный "фильтр" в Windows, который проверяет все подозрительные операции в системе, не работает в нативных программах.
Malware - вирус, троян, вредоносная программа.
Дизассемблере - программа которая транслирует исполняемый файл / бинарь в машинный код который мы сможем более менее понять.
Сейчас все AV работают вместе: создают изолированную среду, следят за поведением кода и используют облачные сервисы для анализа подозрительного поведения. Поэтому простые способы внедрения кода уже не проходят, и приходится придумывать все более сложные способы обхода защиты.
Основные техники внедрения кода так и не поменялись и их проблемы остались такими же как и были.
LoadPE - это метод ручной загрузки PE-файла в память, но у него есть серьезные ограничения: не все PE файлы можно загрузить корректно, часто возникают ошибки при обработке заголовков, сложности с правильной загрузкой секций / ресурсов в памяти и проблемы с импортами и переопределением функций.
Для тех кто не знает что это, объясню по простому, импорт - это то, что вы используете из другой библиотеки чтобы не реализовывать самим. Например написали хотите вы написать программку написать на плюсах или си и берете публичный код для своей реализации, библиотека для GUI приложений и так далее, если нет исходного кода, то вы используете dll файл и берете функции с него, при этом вы зависите от него.
Секции в PE файле - это как комнаты в доме, где каждая комната предназначена для своего дела: одна для хранения инструментов, другая для документов, третья для диванных войск, четвертая для домохозяеек и т.д. В PE файле есть основные секции: .text для кода программы, .data для данных, которые уже инициализированы, .rdata для констант, .bss для неинициализированных данных, .idata для импортов, .edata для экспортов и .rsrc для ресурсов. Каждая секция имеет свои права доступа: .text обычно только для чтения и выполнения, .data для чтения и записи, а .rsrc может быть общедоступной.
Секции в PE файле - это как комнаты в доме, где каждая комната предназначена для своего дела: одна для хранения инструментов, другая для документов, третья для диванных войск, четвертая для домохозяеек и т.д. В PE файле есть основные секции: .text для кода программы, .data для данных, которые уже инициализированы, .rdata для констант, .bss для неинициализированных данных, .idata для импортов, .edata для экспортов и .rsrc для ресурсов. Каждая секция имеет свои права доступа: .text обычно только для чтения и выполнения, .data для чтения и записи, а .rsrc может быть общедоступной.
Тык
или Тык
или Тык
RunPE продолжает работать даже на Windows 11, но имеет свои ограничения: легко обнаруживается современными системами защиты, создает процесс и инжектит в него код(очень легко его можно сдампить, поставив брячку на WinAPI функции), может быть заблокирован облачными сервисами и сложно обойти проверки песочниц, легко может быть сдамплен обычным школьником которые решит поставить брячку на WriteProcessMemory.
Тык
Shellcode - это чистый машинный код, но и он имеет свои проблемы: сложно создать стабильный код для разных версий Windows, может быть обнаружен при анализе поведения(или же тупо пойман по куску кода в памяти), требует больших знаний и написания костылей за свой счет без использования библиотек, пример хорошего loaderа который конвертит PE файлы в шеллкод - Donut(Бублик)
CLR - это среда выполнения .NET, которая также имеет ограничения: может быть отслежена системами защиты(AMSI), сложно скрыть поведение программы и нужно патчить AMSI, есть ограничения в работе с памятью и есть риск обнаружения при анализе облачными сервисами.
Все эти загрузчики достаточно древние, но при этом до сих пор актуальные и широко используемые в создании malware.
Помимо способов загрузки кода существуют и способы сокрытия зашифрованного PE файла в конечном закриптованном файле, в основном хранят в секции .text / .data / .rdata / .rsrc(ресурсы) или же подгружают с интернета в виде картинок из которых потом и берут сам PE файл. Все из этих секций можно будет посмотреть в дизассемблере.
Секция .text в PE файле - это основная секция, где хранится исполняемый код программы. Это как "кабинет программиста", где лежат все инструкции, которые компьютер будет выполнять.
Секция .data - это как "кладовка с барахлом", где хранятся все переменные и значения, которые программа уже задала заранее. Это противоположность секции .bss, где хранятся незаданные данные. В .data можно как читать, так и записывать информацию во время работы программы.
Секция .rdata (read-only data) - это как "архив важных документов", где хранятся только для чтения данные, такие как константы, строки и другие неизменяемые значения. Она защищена от записи, чтобы предотвратить случайные или намеренные изменения важных данных.
Секция .rdata (read-only data) - это как "архив важных документов", где хранятся только для чтения данные, такие как константы, строки и другие неизменяемые значения. Она защищена от записи, чтобы предотвратить случайные или намеренные изменения важных данных.
Секция .rsrc (ресурсы) - это как "хранилище медиа и интерфейса", где хранятся все элементы, которые пользователь видит и использует: иконки, изображения, меню, диалоги и другие ресурсы программы. Ее спокойно можно посмотреть с помощью программы Resource Hacker.
У антивирусов существует несколько видов анализа исполняемых файлов основные из них - статический, эвристический, динамический.
Статический анализ - визуальный осмотр файла, поиск аномалий и сигнатур(уже известных кусков кода в двоичном формате, которые так или иначе были замечены в подозрительной активности, анализ ресурсов, хеш таблицы импортов, энтропия и прочее.
Таблица импортов - это специальная структура в PE файле, которая содержит информацию о всех внешних библиотеках и функциях, которые программа использует. Это как список необходимых инструментов, которые программа берет из других библиотек. В ней хранятся названия DLL и методов из них.
Эвристический анализ - это как "умное предположение" на основе уже известных паттернов(прям как в играх) кусков двоичного кода. Анализ с помощью обученного искусственного интеллекта / натренированной модели, которая будет выявлять аномалии и странности - Пример обученной модели с исходниками(тык).
Динамический анализ - проверка исполняемого файла в изолированной среде, отслеживание поведения и выявление похожих файлов которые уже были, отслеживание url запросов, к каким процессам / файлам был доступ, грубо говоря самый страшный анализ который только может быть.
Современные антивирусы комбинируют все эти методы анализа и поэтому нужно быть готовым против всех, статический анализ достаточно легко обмануть простыми техниками и очисткой кода на бинарном уровне, путём изменения настроек компилятора(Настройки оптимизации и т.д.).
Можно сказать начальную часть этапа мы прошли и узнали много нового или же подкрепили старые знания, которые были у вас до этого, в следующих частях будет знакомство с языками программирования и IDE(редакторы кода) для них.
Написание кода будет в следующих статьях, а пока что было только ознакомление с основной терминологией и с чем нам предстоит иметь дело. В комментариях поправляем меня если что-то не так объяснил или где - то ошибся.
Автор: Barmaleus