Изучаем ETW и извлекаем профиты

Давненько у нас в бложеке не появлялось новых статей! Что ж, ETW, настало твое время!

Возможно, кто-то из вас и раньше сталкивался с этим сокращением - ETW. Что же это такое? Расшифровывается эта аббревиатура как Event Tracing for Windows. ETW - это системный компонент ОС Windows, который используется для диагностики, отладки и исследования производительности тех или иных частей ОС, а также приложений. Появился он где-то с Windows 2000, но полноценно его использовать стало возможным примерно с Windows Vista.

- А мне какое до этого дело? - спросите вы. А вот какое: в Windows несколько сотен (в Win10 - около тысячи) провайдеров событий, которые жаждут вам что-нибудь рассказать о своей работе, нужно лишь подписаться! Вот, например, как можно штатными средствами Windows посмотреть, что Internet Explorer отсылает по HTTP. А вот эти ребята сумели с помощью ETW поснифать, что пользователь набирает на своей USB-клавиатуре. И это все - безо всяких хуков, инжектов и драйверов! ETW просто пронизывает Windows, его использует и Event Viewer, и такие утилиты, как xPerf, и Visual Studio во время отладки приложения, чтобы отображать вам статистику потребляемой памяти и процессорного времени, и даже штатный Resource Monitor, который вы можете открыть из таскменеджера!

Уже интересно?

Читать далее «Изучаем ETW и извлекаем профиты»

Модифицируем стаб SFX WinRAR

winrar
Речь пойдет о тривиальной модификации стаба самораспаковывающегося архива WinRAR, которая состоит в следующем: сделать, чтобы SFX-архив при обычном запуске просто извлекал свое содержимое, а при попытке открытия с помощью WinRAR - запрашивал ввод пароля. Зачем это? Да так, увидел тему на форуме и решил попробовать.
Стаб SFX-архива - это обычный исполняемый файл, оверлей которого содержит полезную нагрузку, сформированную пользователем: файлы, которые необходимо распаковать, и настройки, задаваемые при создании архива. Эта основа находится в директории, куда был установлен WinRAR, и называется Default.SFX.
Читать далее «Модифицируем стаб SFX WinRAR»

Введение в Qt Quick 2 и QML

Решил тут ради интереса немного почитать про такую библиотеку, как Qt. Заинтересовала она меня именно в плане создания GUI, так как в C++ с этим достаточно туго, а Qt - одна из немногих кроссплатформенных библиотек, позволяющая удобно делать современные гибкие графические интерфейсы к программам. Раньше с ней совершенно никакого опыта работы я не имел, поэтому пару недель занимался неспешным чтением документации.

В какой-то из версий Qt (если не ошибаюсь, в 4.7) появилась возможность делать интерфейсы на декларативном языке QML 1.0 (и модуль QtDeclarative, определяющий всякие штуки для рисования интерфейсов), а в 5-й версии Qt появился QML 2.0 и QtQuick 2.0 (бывший QtDeclarative). Их я и стал изучать. В этой статье я расскажу об этих модулях в меру своих знаний, покажу пару несложных примеров их использования, а кто дочитает до конца статьи, получит еще один бонусный пример, который я написал, пока изучал библиотеку. :)

Читать далее «Введение в Qt Quick 2 и QML»

Google Chrome и Secure Preferences

chrome_art

На нашем форуме и не только, с некоторой периодичностью люди интересуются алгоритмом генерации "защитного кода" в файле Secure Preferences для браузера Google Chrome.
Зачем он браузеру? Этот код используется для проверки целостности настроек расширений и некоторых других параметров, проще говоря - HMAC. Зачем он людям? Вероятно, это необходимый этап для тихой установки расширений или изменения настроек браузера. Давайте разберемся, где и как происходит генерация этих HMAC'ов.
Читать далее «Google Chrome и Secure Preferences»

Меняем Integrity Level процесса из ядра

dxcat

Опять случился большой перерыв между публикациями в блоге, но, благодаря настойчивости dx'a, который в данный момент занят улучшением его библиотеки для работы с PE-файлами и продажей новой версии обфускатора PHP, в блоге все-таки появится новый пост. На этот раз он будет посвящен реализации очередного тривиального драйвера, который будет получать уведомления о новых процессах, запускаемых в системе и понижать уровень целостности (integrity level) заданного процесса до низкого.

Читать далее «Меняем Integrity Level процесса из ядра»

Skype Preview — плагин предпросмотра ссылок в скайпе

skype

Сидел я как-то в одном уютном чатике в Skype, и тут одному из участников в голову пришла весьма интересная идея: сделать плагин для скайпа, который позволял бы просматривать содержимое тех ссылок, которые вкидываются в чат, без их открытия. "А почему бы и нет?", - подумал я. Можно открывать картинки в уменьшенном варианте, если ссылка указывает на изображение (в том числе анимированные). А если ссылка ведет на обычную html-страничку, то можно отображать ее заголовок. Забегая вперед, покажу, что получилось:

plugin

Читать далее «Skype Preview — плагин предпросмотра ссылок в скайпе»

Статический деобфускатор .bat-файлов

В последнее время неоднократно сталкивался с просьбами снятия примитивной обфускации с .bat-файлов. Обфускация строится на разбивании команд на отдельные символы, создании алиасов для них и последующей записи их с использованием алиасов. Возьмем следующий незамысловатый код:

После обфускации он будет выглядеть, например, следующим образом:

Для таких случаев набросал простенький деобфускатор на C++. Исходный код и скомпилированный бинарник прилагаю. Если будут проблемы с запуском - попробуйте не использовать Windows XP или скачать Visual C++ Redistributable Packages for Visual Studio 2013, возможно, поможет.

Скачать: batch-deobfuscator
Скачать исходный код: batch-deobfuscator-source
GitHub: bat-static-deobfuscator

Пишем тривиальный стилер биткоинов

bitcoin
Давным-давно для WebMoney (и не только) был популярен крайне простой способ получить чужие финансы: подменить содержимое буфера обмена Windows, если в нём находится номер кошелька на свой номер. С введением множества степеней защит данный метод перестали использовать, да и эффективность была под вопросом, не говоря уже о необходимости заставить пользователя запустить стороннее ПО, которое будет осуществлять подмену.
Случай с Bitcoin отличается: подтверждения, по сути, отсутствуют, номера кошельков ещё более длинные, на конкретного пользователя не пожалуешься...
В общем, давайте реализуем простой софт, который будет анализировать содержимое буфера обмена и подменять его, если обнаружит там корректный адрес Bitcoin кошелька. Писать будем на MASM, чтобы было веселее.
Читать далее «Пишем тривиальный стилер биткоинов»

Пишем собственный упаковщик. Шаг 12 — Работа над ошибками

pack

Благодаря одному товарищу из комментариев в предыдущих постах касательно упаковщика выявился один занятный баг в коде, который я поспешил исправить. Комментатор, не разобравшись в деталях работы пакера, утверждал, что код, запакованный им, окажется неспособным работать с SEH при условии, что DEP включен. При таких условиях код работал хорошо (так как весь распакованный код в памяти находится в пределах одной-единственной секции PE-файла, помеченной как исполняемая. UPX имеет такую же логику работы.). Но случайно была обнаружена следующая ошибка: если программа собрана в MSVC++, использует SEH и имеет релокации, при первом же возникшем исключении она упадет с некоторой долей вероятности (точнее, если файл загрузился не по своему базовому адресу). DEP тут, конечно же, не при чем. Все дело оказалось в злополучной директории IMAGE_LOAD_CONFIG_DIRECTORY. Она создается линкером Visual Studio. Из полезной информации она содержит таблицу адресов (RVA) SE-обработчиков и указатель на внутреннюю переменную crt __security_cookie. Как выяснилось, эта директория нужна не только для внутренностей CRT (хотя она, кажется, как раз хотела плевать на эту структуру), но и системному загрузчику (по крайней мере, в Win7. WinXP, похоже, тоже плевал на эту директорию). Упаковщик, который я описываю, перемещает эту директорию в другую секцию (см. здесь). Поэтому исправить ошибку можно, добавив в таблицу релокаций, создаваемую упаковщиком, несколько записей, которые будут править адреса, указывающие на security cookie и таблицу обработчиков SEH, чтобы он мог считать интересующую его информацию из этой директории на этапе загрузки.

Помимо правки этой ошибки я обновил код упаковщика, чтобы он собирался с использованием последней на данный момент версией библиотеки для работы с PE-файлами (PE Bliss). Ее всегда можно скачать отсюда.

Кстати, насчет библиотеки PE Bliss. Сейчас в свободное время я допиливаю новую версию, в которой появятся следующие дополнительные возможности (список примерный и может измениться):
- высокоуровневая работа с дополнительными типами ресурсов PE-файлов;
- детальный разбор .NET-бинарников (метаданные, сигнатуры, ресурсы);
- обертка над библиотекой на C++/CLI, которая позволит .NET-разработчикам удобно использовать функционал библиотеки в софте на C# или Visual Basic .NET.

Скачать исходники упаковщика: packer source
Скачать собранный вариант: packer binary

UPDATE 24.05.2016: доработки генерации таблиц релокации. В некоторых случаях (например, когда TLS-данных слишком много и присутствует директория load config, адреса в таблице релокации могли переполняться, и файл после упаковки не работал).

Простой контроль целостности процесса под Windows

Намедни решил попробовать написать драйвер под Windows. Варианты с "Hello world" показались унылыми, поэтому в качестве тренировки поставил перед собой следющую цель: написать драйвер, который будет контролировать целостность кода процесса по запросу. В общем, драйвер будет считывать данные о загруженных в память секциях, проверять атрибуты и считать простенькую контрольную сумму, а при повторном обращении - сверять её. Совсем детально описывать процесс я не буду, так как в интернете есть куча мануалов по самым основам, да и желающие могут просто посмотреть примеры из WDK, которые достаточно хорошо документированы.
Читать далее «Простой контроль целостности процесса под Windows»