Сегодня многие российские ИТ-компании вполне спокойно и официально признают наличие в своем штате позиции реверс-инженера (недавно «Системный администратор» опрашивал ИТ-компании о том, что необходимо знать и уметь такому человеку). Тем не менее профессия считается и редкой, и одновременно хорошо оплачиваемой и востребованной [1].
– Расскажите подробнее, чем вы занимаетесь в Parallels?
– Василий Жданов (В.Ж.): Я работаю над двумя продуктами: Parallels Desktop для Mac и Parallels Access. Если говорить более конкретно, то занимаюсь поиском способов реализации и реализацией решений, направленных на интеграцию операционных систем между собой. У нас над этим классом задач работает целая команда. Мне достаются, так скажем, самые сладкие куски пирога: когда нет очевидного способа реализовать тот или иной функционал, и для поиска ключа порой приходится «зарываться по уши» в недра компонентов операционных систем. Для примера можно назвать несколько функций режима Coherence. Это интеграция иконок области уведомлений Windows (тех самых, что обычно располагаются внизу «возле часов») в панель статуса Mac OS X. Или, например, интеграция уведомлений Windows 8 с центром уведомлений Mac. Не обошлась без реверс-инжиниринга и специальная интеграция для Outlook. Особых усилий потребовала интеграция приложений Windows 8. Из менее «заметных» функций, но потребовавших определенных усилий и изобретательности, можно назвать прозрачное переключение профильных папок («Рабочий стол», «Мои документы» и т.д.) во время входа пользователя в систему, возможность показывать в «Проводнике» ОС Windows USB-устройство, воткнутое в Mac, именно там, где Windows-пользователь привык его видеть (в силу особенностей нашей реализации шаринга USB-дисков оно для Windows является сетевым устройством и поэтому раньше отображалось в разделе для сетевых устройств).
– Михаил Филиппов (М.Ф.): Последние несколько лет я отвечаю за проект Parallels Containers for Windows – это независимая от Microsoft реализация концепции серверной виртуализации уровня ОС. Наш подход основан на виртуализации ядра ОС, которое после модификаций способно запускать произвольное количество пользовательских окружений Windows. Таким образом, наши контейнеры (напомню, что в компании также разрабатываются контейнеры для ОС на базе ядра Linux) полагаются на модификации в ядре. И если в случае Linux сообщество разработчиков приняло от нас большинство этих изменений в главную ветку исходных кодов ядра, то компания Microsoft не смогла быть настолько открытой.
– Почему вы стали специализироваться на реверс-инжиниринге? Что стало определяющим?
– В.Ж.: Я бы не стал называть это специализацией. Это просто то, что у меня неплохо получается. Интерес к тому, «как оно устроено», родился вперед меня. Еще в детстве «реверсил» игрушки. Позже увлекся электроникой, и мне было интересно исследовать электронные устройства. Иногда это было единственным доступным способом найти неисправность в устройстве и починить его. Интерес «как оно устроено» сопровождался интересом «как это можно использовать», и я повторял своими силами некоторые узлы существующих устройств, чтобы составить из них что-то новое. Позже увлекся компьютерами. Но серьезно исследованием программ занялся уже здесь. И это лишь один из моих интересов. Другие – это язык C++, метапрограммирование, проектирование сложных программ. И каждому из них в большей или меньшей степени находится применение в нашей компании.
– М.Ф.: Для меня реверс-инжиниринг тоже не специализация, а инструмент познания мира – мира компьютерных технологий. Наша вузовская программа предполагала параллельное изучение языка С и языка ассемблера для тогда еще 16-битных процессоров семейства x86. На лабораторных работах с помощью отладчика мы изучали, как работают (а чаще не работают) наши программы. В процессе изучения внутреннего устройства программ и того, как они взаимодействуют с ОС и аппаратурой, меня глубоко впечатлила гибкость программ – внести исправления и проверить результат получалось легко и быстро.
Самостоятельная сборка из комплектующих в 1995 году собственного персонального компьютера (единственно верный способ для студента) позволила не ограничиваться учебными часами в лаборатории. Конечно же, я начал запойно играть в компьютерные игры – Doom, Railroad Tycoon и Dune II, которую мне никак не удавалось закончить. Проблема была в том, что на последнем уровне приходилось играть сразу против трех противников, а кредиты и игровая валюта неизменно заканчивались, что приводило к поражению. Выход был найден путем редактирования файла сохранения игры и вписывания нужного количества кредитов. Это, собственно, был мой первый опыт применения реверс-инжиниринга.
Несмотря на то что компьютерные игры меня давно уже не увлекают, желания разбираться, как устроены программы, меньше не стало.
– Расскажите о том, как вы понимаете реверс-инжиниринг, и для чего он используется в ИТ?
– В.Ж.: Когда я уже вовсю «запускал ручки», я еще не знал слова «реверс-инжиниринг» и не припомню, чтобы вообще как-то выделял этот процесс с целью обозначить его неким словом. С моей точки зрения этим словом обозначают исследование внутреннего устройства некой рукотворной сущности в контексте ее воспроизведения или модификации. Если говорить о реверс-инжиниринге программных продуктов, то одной из высокоуровневых целей его использования в нашей компании я могу назвать реализацию интеграционной функциональности в наших продуктах Parallels Desktop и Parallels Access.
Если спуститься уровнем ниже, то мы можем увидеть аспекты применения реверс-инжиниринга в этом контексте более детально. Это, например, поиск недокументированных функций и интерфейсов, поиск способов и точек внедрения своего кода для модификации поведения некоего компонента операционной системы и т.п.
Если отвлечься от наших задач, то принципиально возможно использовать реверс-инжиниринг, например, для извлечения некоего «know how», чем могут промышлять конкуренты. Пираты используют реверс-инжиниринг для взлома программ. Антивирусные компании могут использовать его для исследования вредоносной активности вирусов. Список примеров можно продолжать долго.
М.Ф.: На мой взгляд, реверс-инжиниринг – это прежде всего инструмент, который может применяться совершенно произвольным образом и даже для целей, не совсем совместимых с достижением общего блага. Как инструмент реверс-инжиниринг помогает удовлетворить любопытство пытливого ума, что «ежели один человек построил, другой завсегда разобрать может», а цель этих усилий в применении найденного знания о внутреннем устройстве для недокументированного использования, поиска уязвимостей или просто программных ошибок.
Пояснение от компании: контейнеры для Windows
Косвенно мы тоже участвуем в разработке компонентов ядра Windows: за время работы над контейнерами мы направили в Microsoft множество сообщений об обнаруженных ограничениях и просто ошибках в компонентах ядра Windows, и часть из них была учтена в следующих версиях Windows, а для решения более десятка проблем Microsoft выпустила отдельные пакеты исправлений. В частных беседах инженеры Microsoft отзывались о нашем проекте как о самом технически сложном для ядра Windows. Но, к сожалению, до совместной разработки дело пока не дошло. Так как же это работает, если Microsoft не принимает изменения и не предоставляет доступ к исходным кодам ядра Windows? При разработке контейнеров Parallels центральное место занимают две технологии: реверс-инжиниринг и обновление программного кода во время исполнения (Dynamic software updating, реализацией этой технологии мы по-настоящему гордимся, считая ее одной из лучших в мире, и защищаем патентами).
Благодаря этим двум подходам вся технология виртуализации работает в ядре ОС, что позволяет разделять объекты ядра между контейнерами, тем самым изолируя контейнеры друг от друга. Каждый контейнер имеет свой собственный набор процессов, сессий и драйверов, а также реестр и дерево объектов ядра. В итоге опыт взаимодействия пользователя с ОС в контейнере ничем не отличается от взаимодействия с самой операционной системой Windows, и штатные инструменты ОС, такие как Диспетчер задач, Редактор Реестра и набор утилит Sysinternals Марка Руссиновича, можно использовать для управления контейнерами и их мониторинга.
|
– Можно ли выделить его разновидности?
– В.Ж.: Мой ответ покажется бесполезным. Сколько угодно. Все зависит от цели такого разделения. Например, если мы хотим оценить долю реверс-инженеров по отраслям промышленности, то будем делить реверс-инжиниринг по отраслям. Это может быть, скажем, реверс-инжиниринг в электронике или в автомобилестроении, или в ИT, или в пошиве сумок. В свою очередь, в каждой из отраслей можно поделить еще мельче, если того требует поставленная цель. Если же я просто занимаюсь исследованием чего-либо, я не думаю о том, к какой разновидности реверс-инжиниринга относится моя задача, не думаю о каком-то разделении вообще.
– М.Ф.: Для меня важно, какие цели преследует исследователь, поэтому я провожу только этическую границу, всецело поддерживая мотивацию «белого» хакинга в получении новых знаний для поддержания прогресса, а вот быть, что называется, criminal mind – это, пожалуй, не по мне.
– Какой объем знаний необходим реверс-инженеру?
– В.Ж.: Встречный вопрос: необходим для чего? Если мы хотим обучаться реверс-инжинирингу, то, на мой взгляд, для начала достаточно всего лишь желания. Если это вопрос «по достижении какого объема знаний можно называть себя реверс-инженером?», то моим ответом будет «а какая разница?». Каждая новая задача – это новые знания, и всегда есть чему учиться. Если вам это интересно, то вы этим просто занимаетесь.
– М.Ф.: Наличие высшего профильного ИТ-образования очень важно как основы структуры знаний, но, по-видимому, не обязательно, поскольку велико число просто талантливых самоучек. То есть дело не в каком-то тайном знании, а в самой личности инженера, которого увлекает сам процесс получения новых знаний. Сильными сторонами реверс-инженера являются внимательное отношение к деталям, умение находить неочевидные причинно-следственные связи и воображение, способное воссоздать целиком даже очень сложную систему. Я очень рад, что среди моих коллег есть такие замечательные люди.
– Особенности реверс-инжиниринга на платформах Linux, Windows, OS X?
– В.Ж.: Даже на одной платформе от задачи к задаче можно выделить множество особенностей. С другой стороны, можно и на разных платформах найти похожие задачи, без лишних особенностей. Если различия в наборе инструментальных средств можно назвать особенностями, то пусть ими будут эти различия.
– М.Ф.: Пожалуй, я выделил бы такой момент – наши Linux-коллеги по Parallels предпочитают носить бороды и свитера с оленями, но свитера с оленями мне тоже нравятся, хотя я и специализируюсь на Windows.
– Какие тренды в области обратной разработки можно выделить на сегодняшний день?
–М.Ф.: Виртуализация и создание доверенных вычислительных систем (Trustworthy computing) в облаках – вот области, в которых много неисследованных деталей.
– Сейчас получают распространение облачные инструменты для реверс-инжиниринга. Например, CrowdRE. Используете ли вы какие-либо из них? Можете ли, применительно к реверс-инжинирингу, выделить их преимущества и недостатки, особенности?
– В.Ж.: Если правильно понимаю, это инструменты для совместной работы распределенной команды. Нет, такие инструменты я пока не использую.
– М.Ф.: В силу специфики наших задач мы с такими инструменты в своем проекте также не работаем.
Пояснение от компании: Parallels Desktop для Mac
Вот, например, почему нам пришлось влезть во внутренности Windows, чтобы дать возможность пользователю увидеть USB-устройство, присоединенное к Mac, в «Проводнике» ОС Windows, причем именно там, где он привык его видеть. У нас есть технология SmartMount, и вот зачем она нужна. Если пользователь вставляет, например, флешку в компьютер Mac, то она появляется только на маковском десктопе. Человек, работающий в режиме Coherence, хочет полной интеграции – то есть видеть содержимое своей флешки и в Windows. Но, чтобы она там появилась, ее нужно переконнектить в виртуальную машину, а делать это каждый раз очень неудобно. Мы решили использовать Shared Folders. Поскольку эта функция представляет собой драйвер сетевой файловой системы и показывается в Windows как сетевой носитель, то, когда флешка коннектится в Мас, мы пробрасываем ее через Shared Folders в Windows. Тогда она автоматически попадает в Network location. Но пользователю непонятно, что свою флешку он должен найти именно там: он привык, что USB-девайс выглядит определенным образом и показывается именно там, где и все removable media. Стандартными способами невозможно сделать так, чтобы сетевая шара показывалась в списке устройств как подключаемый девайс и при этом еще и отражалась как USB. Именно для этого Василию пришлось «внедриться» в «Проводник» и «объяснить» ему, что вот эту вещь надо показывать именно так. И теперь у нас SmartMount показывает USB-флешки как внешние накопители.
|
– Какие инструменты предпочитаете, программное обеспечение?
– В.Ж.: В исследованиях чаще всего мне хватает IDA, windbg, lldb. Иногда это всякие мониторы активности (например, утилиты от Sysinternals или малоизвестные под OSX). Иногда пишу тестовые программки для проверки гипотез.
– М.Ф.: Я всегда применял отладчики – это были Borland Turbo Debugger, NuMega SoftICE, Windows Debugger. Работая в Parallels, начал использовать инструменты для анализа кода, такие как IDA Pro. Сейчас мы широко используем скриптовые языки, например, Python, для автоматизации анализа кода и аварийных дампов с помощью расширения PyKd для WinDbg.
– Ваше мнение о GNU Radare? Что этому инструменту не хватает?
– М.Ф.: Мы не применяем GNU Radare, но, как всякий проект с открытым исходным кодом, он силен сообществом, его поддерживающим. Участие в конференциях и проведение воркшопов – это, я полагаю, правильный путь развития продукта.
– Есть ли предпочтения в отношении аппаратной составляющей?
– В.Ж.: Здесь нет никаких изысков. На моем рабочем месте старенький Mac Pro 1.1, на котором не работают современные версии Mac OS X в связи с устаревшей версией UEFI, и на него я установил Windows. А также есть старенький iMac 2010 года. На этих двух машинках я и работаю. С первой использую удобную компактную клавиатуру от Lenovo, совмещенную с трекпоинтом.
– М.Ф.: Мобильность – поэтому ноутбук, при этом ноутбук может быть любого цвета, при условии, что этот цвет – черный, если перефразировать Генри Форда.
– Участвовали ли вы в программах Bug Bounty? Есть ли в вашей компании такая программа, и связана ли она с реверс-инжинирингом?
– В.Ж.: Нет, лично я не участвовал.
– М.Ф.: Я сам никогда не участвовал в программах Bug Bounty, но при этом мы с коллегами нашли и сообщили в Microsoft о более чем двух десятках багов в ядре Windows. В Parallels, конечно же, есть система премирования за найденные уязвимости в наших программных продуктах, есть внутренний ценник вознаграждения. Наш архитектор по безопасности Антон Дедов говорил, что даже был случай, когда человек нас открыто шантажировал – заплатите или выложу. Но, естественно, в этом случае он уже попал совсем под другую статью, и против него возбудили следствие. Вообще уязвимость может быть у кого угодно. Есть две шкалы представлений об уязвимости в продукте – продукт уязвим, и мы еще не знаем, насколько он уязвим. Признак плохой компании – игнорирование или замалчивание (работа через маркетологов) публично найденных инцидентов.
В Россию еще только начинает проникать понимание, что попасть в компанию и работать в ее интересах по поиску уязвимостей – это цивилизованный способ реализовать свою страсть к разбору всего и вся, как у маленького ребенка. Мы нанимаем и в штат, и вне штата людей, которые отличаются плодовитостью в поиске дыр в наших продуктах.
Конечно, эта задача тоже связана с реверс-инжинирингом.
– Как вы считаете, есть ли в вашей работе некий этический момент, ответственность? Что вы думаете об отношении к реверс-инженерам как к «хакерам»?
– В.Ж.: Этический момент? Будто реверс-инженеры делают что-то плохое. А разве реверс-инженер и хакер не есть одно и то же? Ответственность, безусловно, есть. Это ответственность перед нашими пользователями. Если по результатам реверса не удается создать стабильное решение, нужно реверсить еще или в другом направлении, или не решать задачу вовсе.
– М.Ф.: Как я уже говорил выше, для меня важнейший критерий – это мотив разработчика. То есть реверс оправдан, если стоит именно созидательная задача.
– Что вы посоветуете начинающим? На какие книги, курсы обратить внимание?
– В.Ж.: Чтобы суметь что-то извлечь из исследуемой сущности, в большинстве случаев нужно хорошо ориентироваться в среде, в которой она функционирует, и в зависимости от глубины исследования предметной области, с которой она имеет дело. Скажем, если мы имеем машинный код некоторой библиотеки и хотим понять, какие аргументы имеет некоторая недокументированная функция, содержащаяся в этой библиотеке, то мы должны хорошо разбираться в машинных инструкциях той машины, под которую эта библиотека создана, способах передачи аргументов на этой машине, соглашениях вызовов и т.д. В некоторых случаях подобные задачи можно решить с помощью автоматических средств и без особых знаний, но в других случаях потребуется разбираться основательно. В свете сказанного, можно рекомендовать учиться сначала «форвард-инжинирингу», а реверс-инжиниринг придет сам.
– М.Ф.: Развиваться и совершенствоваться гармонично, свет клином на реверсинге не сошелся!
- Реверс-инженер – профессия в цене – http://samag.ru/uart/more/258.
Беседовал Игорь Штомпель