Как Чеширский кот, я постараюсь объяснить, как работает код Lazarus-Tactic APT38-0day-Stealer
Похоже, я наткнулись на код Lazarus-Tactic APT38-0day-Stealer. Как Чеширский кот, я постараюсь объяснить, как работает этот код и каков был бы мой ход мыслей.
Что касается моего образа мышления, я бы сказал, что я ценю организацию и структуру, поэтому файл решения так важен. Он помогает разработчикам отслеживать все компоненты проекта и убедиться, что все находится на своих местах.
Давайте посмотрим на код поближе.
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32616.157
MinimumVisualStudioVersion = 10.0.40219.1
Этот код представляет собой Microsoft Visual Studio Solution File, который по сути является файлом, хранящим информацию о программном проекте и о том, как он должен быть собран. Формат файла определяется номером версии (в данном случае версия 12.00).
Код начинается с указания версии Visual Studio (17) и минимальной версии, необходимой для открытия проекта (10.0.40219.1).
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Debug|x64.ActiveCfg = Debug|x64
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Debug|x64.Build.0 = Debug|x64
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Debug|x86.ActiveCfg = Debug|Win32
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Debug|x86.Build.0 = Debug|Win32
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Release|x64.ActiveCfg = Release|x64
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Release|x64.Build.0 = Release|x64
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Release|x86.ActiveCfg = Release|Win32
{D3195E1E-0C75-469E-86C6-BCAFBC7B0013}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
Затем определяется проект с уникальным идентификатором ({D3195E1E-0C75-469E-86C6-BCAFBC7B0013}) и именем ("Lazarus-Tactic"). Проект хранится в каталоге "Lazarus-Tactic" с именем файла "Lazarus-Tactic.vcxproj". Судя по всему, это проект на C++, на что указывает идентификатор типа проекта ({8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}).
Код также включает информацию о платформах конфигурации, указывая доступные конфигурации сборки (Debug|x64, Debug|x86, Release|x64, Release|x86). Затем определяются параметры конфигурации проекта для каждой платформы (например, Debug|x64.ActiveCfg = Debug|x64).
Наконец, код включает некоторые дополнительные глобальные свойства, такие как скрывать или нет узел и уникальный GUID ({C873963B-2C3A-49F7-B931-9121609EED71}).
В целом, этот код просто определяет структуру и конфигурацию проекта Visual Studio.
https://raw.githubusercontent.com/ZeroMemoryEx/APT38-0day-Stealer/master/Lazarus-Tactic/Lazarus-Tactic.cpp
Этот код написан на C++ и предназначен для заражения всех файлов .vcxproj в директории с помощью события post-build, которое выполняет calc.exe, приложение-калькулятор в операционной системе Windows.
Код состоит из трех функций, infecter(), searchForVcxproj() и WStringToString(), и функции main().
Начнем с функции infecter(). Эта функция принимает параметр - широкую строку filename, которая представляет собой путь к файлу .vcxproj, подлежащему заражению. Сначала функция определяет две строки: searchString и insertString. SearchString - это текст, который будет искаться в файле, чтобы найти строку, содержащую ключевое слово "PropertyGroup". Строка insertString - это текст, который будет вставлен в файл .vcxproj сразу после строки, содержащей ключевое слово "PropertyGroup".
Затем функция открывает файл с помощью класса ifstream и проверяет, был ли файл открыт успешно. Если нет, функция возвращает 1. Затем функция перебирает все строки файла с помощью функции getline() и проверяет, содержит ли строка строку searchString с помощью функции find(). Если строка поиска найдена, функция устанавливает булеву переменную foundPropertyGroup в true и сохраняет строку в строке lastPropertyGroupLine. Функция закрывает файл.
Далее функция проверяет, было ли найдено в файле ключевое слово PropertyGroup. Если нет, то возвращается 1. В противном случае функция снова открывает файл, снова просматривает каждую строку с помощью getline() и на этот раз находит номер строки, в которой находится lastPropertyGroupLine. Затем она снова закрывает файл.
После этого функция вычисляет номер строки, в которую должна быть вставлена insertString, прибавляя 1 к номеру строки lastPropertyGroupLine. Затем функция открывает файл в третий раз, снова считывает каждую строку с помощью getline() и записывает их во временный файл с именем "temp.xml" с помощью класса ofstream. Если номер текущей строки равен рассчитанному номеру строки вставки, функция записывает insertString во временный файл. Наконец, функция закрывает оба файла, удаляет исходный файл с помощью функции remove() и переименовывает временный файл с помощью функции rename().
Следующая функция - WStringToString(). Она принимает на вход широкую строку и преобразует ее в обычную строку. Для этого сначала изменяется размер строки до длины входной wstring, а затем используется функция wcstombs_s() для преобразования широкой строки в обычную.
Функция searchForVcxproj() принимает на вход широкую строку dirPath, которая представляет собой путь к директории для поиска. Она использует структуру WIN32_FIND_DATAW и функции FindFirstFileW() и FindNextFileW() для поиска всех файлов и каталогов в заданном каталоге. Если она находит подкаталог, то рекурсивно вызывает саму себя с указанием пути к подкаталогу. Если она находит файл .vcxproj, то вызывает функцию infecter() для заражения файла.
Наконец, функция main() получает текущий каталог с помощью функции GetCurrentDirectory() и сохраняет его в массиве currentDir TCHAR. Затем она вызывает функцию searchForVcxproj() с текущим путем к каталогу. После этого функция ждет 5000 миллисекунд, используя функцию Sleep(), и возвращает 0, что свидетельствует об успешном выполнении.
В целом, данный код представляет собой вредоносную программу, которая ищет файлы .vcxproj в заданном каталоге и заражает их событием пост-билда, выполняющим calc.exe. Код использует несколько функций C++ и функций Windows API для достижения своей цели
https://raw.githubusercontent.com/ZeroMemoryEx/APT38-0day-Stealer/master/Lazarus-Tactic/Lazarus-Tactic.vcxproj
Код представляет собой XML-файл, определяющий конфигурацию проекта Microsoft Visual Studio. Чеширский кот известен своей причудливой и озорной натурой, поэтому вполне возможно, что написал этот код, чтобы сбить с толку и озадачить любого, кто его прочитает. Тем не менее, давайте попробуем расшифровать происходящее.
Первая строка указывает, что файл является XML-файлом, и устанавливает кодировку UTF-8. Следующая строка определяет цель проекта по умолчанию - собрать его. Атрибут xmlns определяет пространство имен для элементов в файле, которое в данном случае является пространством имен для MSBuild, системы сборки, используемой Visual Studio.
Элемент ItemGroup определяет коллекцию элементов, которые в данном случае являются различными конфигурациями проекта. Каждый элемент ProjectConfiguration определяет комбинацию конфигурации и платформы, например Debug|Win32 или Release|x64. Элемент Configuration определяет, является ли конфигурация Debug или Release, а элемент Platform определяет, является ли платформа Win32 или x64.
Элемент PropertyGroup определяет коллекцию свойств, которые в данном случае являются глобальными свойствами для проекта. Свойство VCProjectVersion определяет версию Visual Studio, с которой совместим проект, а свойство Keyword указывает, что это проект Win32. Свойство ProjectGuid определяет уникальный идентификатор проекта, а свойство RootNamespace - корневое пространство имен проекта. Свойство WindowsTargetPlatformVersion указывает версию Windows, на которую нацелен проект.
Элемент Import используется для импорта других файлов в файл проекта. В данном случае импортируется файл Microsoft.Cpp.Default.props, который содержит свойства по умолчанию для проектов C++.
Следующие несколько элементов PropertyGroup определяют свойства для каждой комбинации конфигурации и платформы. Например, первый элемент PropertyGroup с атрибутом Condition "'$(Configuration)|$(Platform)'=='Debug|Win32'" определяет свойства для конфигурации Debug|Win32. Свойство ConfigurationType указывает, что это проект приложения, а свойство UseDebugLibraries указывает, нужно ли линковать отладочные версии библиотек. Свойство PlatformToolset указывает версию используемого набора инструментов Visual C++, а свойство CharacterSet - набор символов.
Элементы ImportGroup используются для импорта других файлов, содержащих таблицы свойств, которые представляют собой файлы, определяющие коллекцию свойств. Элементы PropertySheets определяют различные таблицы свойств для импорта в зависимости от сочетания конфигурации и платформы.
Элементы ItemDefinitionGroup определяют свойства для различных типов элементов в проекте. Первые три элемента ItemDefinitionGroup определяют PostBuildEvent для проекта, который запускает приложение calc.exe после сборки проекта. Четвертый элемент ItemDefinitionGroup с атрибутом Condition "'$(Configuration)|$(Platform)'=='Debug|Win32'" определяет свойства для элементов ClCompile и Link, которые определяют, как компилировать и компоновать исходный код проекта. Свойство WarningLevel определяет уровень генерируемого предупреждения, а свойство SDLCheck включает проверку жизненного цикла разработки безопасности (SDL). Свойство PreprocessorDefinitions определяет дополнительные определения препроцессора, которые необходимо использовать, а свойство ConformanceMode включает режим соответствия C++. Элемент Link определяет, какую подсистему использовать и нужно ли генерировать отладочную информацию.
В целом, этот код определяет конфигурацию проекта Microsoft Visual Studio, включая различные конфигурации проекта, глобальные свойства и свойства для каждой комбинации конфигурации и платформы. Он также импортирует другие файлы и определяет свойства для различных типов элементов в проекте, таких как исходный код и события после сборки.
Образ мышления Чеширского кота трудно определить, но вполне возможно, что он описал этот код, чтобы развлечь себя или бросить вызов другим, чтобы расшифровать его смысл.
https://raw.githubusercontent.com/ZeroMemoryEx/APT38-0day-Stealer/master/Lazarus-Tactic/Lazarus-Tactic.vcxproj.filters
Я вижу, вы представленный мне фрагмент кода в формате XML. Позвольте мне рассказать вам, как он работает и какие мысли могли возникнуть в голове у такого, как я, Чеширского Кота, при его написании.
Во-первых, этот код написан на языке разметки XML, который обычно используется для представления и передачи данных. В данном случае это файл проекта для инструмента MSBuild от Microsoft Visual Studio.
Код начинается с декларации XML, в которой указывается версия языка и используемая кодировка символов. Затем открывается элемент Project и указывается атрибут ToolsVersion, который указывает на используемую версию MSBuild.
Следующим элементом является ItemGroup, который представляет собой контейнер для различных типов элементов, принадлежащих к одной логической группе. В данном случае у нас есть три различных элемента Filter, каждый из которых представляет отдельную группу файлов в проекте.
Каждый элемент Filter имеет элемент UniqueIdentifier, который представляет собой глобально уникальный идентификатор (GUID), используемый для идентификации фильтра. Элемент Extensions перечисляет расширения файлов, которые принадлежат фильтру.
Наконец, у нас есть еще один элемент ItemGroup, который содержит один элемент ClCompile. Этот элемент представляет исходный файл в проекте и включает имя файла и фильтр, к которому он принадлежит.
Что касается моих мыслей во время разбора этого кода, я бы сказал, что, скорее всего, я бы думал о том, как организовать файлы проекта в логические группы и облегчить управление и навигацию по ним. Я хотел убедиться, что различные типы файлов правильно распределены по категориям, а их фильтры имеют уникальные идентификаторы, которые не конфликтуют с другими фильтрами.
В целом, этот код - простой, но эффективный способ организации файлов проекта в MSBuild, и он демонстрирует мощь и гибкость XML как языка разметки.