кто такой реверс инженер
Путь становления Реверс инженера?
Господа,поступаю в этом году в институт на программиста.
Писал раньше на python,очень нравилось,но вот пришло время выбирать профессию,выбрал программиста,решил начать изучать новые языки.
Конкретно недавно попробовал, то, чем наверное занимались дети в 90-х.»Зареверсил игру», и написал небольшую DLL,чтобы они автоматически добавляла патроны каждые 50 секунд.
Удивлению и наслаждению не было придела, когда оно заработало, а когда не работало было еще интересней.
Я понял, что так называемое «умение копаться в чужом коде», это мое.
Слышал о направлении реверс инженер уже давно, и вот хочу спросить собственно.
С чего начать?
Что учить?
Что почитать?
Не обязательно говорить сейчас какие то сложные темы.
Ну самое известное это наверное реверс вирусов всяких,чтобы был конкретный пример,возьмем это направление.
Допустим,что нужно знать,чтобы попасть в лабораторию касперского?
Для начала желательно на русском, чтобы въехать в тему на родном языке и не путаться в терминах, дальше можно на английском.
Рецепт прост до безобразия:
Если вам хочется разбираться в каждой фиче, каждую новую программку ковырять, разбирать формат её файлов, каждую новую игру пытаться взломать, написать для неё бота, чит и т. п. Значит это ваше, просто продолжайте делать то, что делаете.
Если нет, то никакие книги не помогут. В этом деле нужна страсть и огромное терпение.
Матан никому не нужен в реверсе. Максимум решение систем линейных уравнений понадобится.
Важно скорее нестандартное мышление, умение брутфорсить в голове множество вариантов, подходов. Для этого нужно знать технологии. Т. е. буквально, знать нужно как можно больше. Чем больше вы знаете, тем быстрее будет решена задача. Это абсолютно различные области: ОС, сети, способы шифрования, компрессии, хеширования, сериализации; знание баз данных и их языков запросов; знание компиляторов в плане, как они генерируют код; знание реализации той же стандартной библиотеки, понимание как компилируется один и тот же код разными компиляторами, понимать, как работают интерпретаторы байткода, виртуальные машины, и т. п.
Это, что касается общих технологий. А есть ещё такая штука, как архитектурные паттерны. Они обычно применяются в прикладных приложениях, малварь редко такое применяет. Т. е. нужно видеть в коде, например, паттерн Event, различные варианты паттерна MVC, и т. п. Например, вы реверсите продукт на Qt. Чтобы его понимать, вам нужно знать. Qt, и уметь на нём разрабатывать, читать его исходный код, знать что такое метаобъекты, как они хранятся, используются, вызываются. А если, внезапно, оно юзает что-то интерпретируемое, типа питона или луа, то вам, мало того, что нужно знать сами языки, так ещё и реализацию их интерпретаторов. А ещё бывает JIT.
Нужно ещё решить, что вы хотите реверсить. Малварь и прикладные приложения немного расходятся. В малвари нужно больше знать нестандартных вещей. Различных вариантов антиотладки, скрытия активности, багов операционной системы, поведения антивирусов. Малварь может быть ботнетом, например. Ботнеты обычно имеют командный сервер, который довольно трудно вычислить, он меняется динамически, как-то не даёт себя обнаружить. Для этого нужно знать как устроен интернет, как работает dns, разбираться в сетевых протоколах.
Короче, для реверсера нужно учить всё. Не нужно фильровать определённые технологии, вам понадобятся все они без исключения. Ибо всё, что было создано для вычислительных систем, в них используется, а соответственно, вам придётся это знать, чтобы реверсить.
Кстати, чуть не забыл.
Самая лучшая книга по реверсу на русском.
И ещё есть классический курс статей от Рикардо Нарвахи: «Введение в крэкинг с нуля, используя OllyDbg». Погуглите его. Если осилите книгу Юричева и этот курс, то сможете спокойно собеседоваться в Касперский. Хотя, поверьте, есть вещи поинтереснее касперского.
Реверс-инжиниринг. История. Моя
На этот раз статья будет не технической (хотя в ней и будут попадаться какие-то технические термины/моменты), а скорее автобиографической, если так можно выразиться. Эта статья о том, как я докатился до такой жизни пришёл в реверс-инжиниринг, что читал, чем интересовался, где применял, и т.д. И, я почему-то уверен, что моя история будет иметь множество отличий от твоей. Поехали.
Начало
А начиналось всё ещё в далёком детстве. Думаю, как и многим парням (а может и девушкам), мне всегда было интересно знать, как же всё устроено, почему работает, почему не работает, и т.д.
Сначала я начал разбирать все машинки на батарейках, которые у меня были (даже те, что были у брата). Конечно, не всегда удавалось собрать, но, интерес был превыше. Потом нашёл какой-то старый радиоприёмник-магнитофон у отца в кладовке, и разобрал его тоже. Ещё были тамагочи. Но там я вообще ничего не мог понять: микросхема, «капля» и экран. Хотя да, экран я разбирал на слои.
Конечно же, за всё несобранное я получал по шапке.
Sega Mega Drive
Отец купил мне её на день рождения: обычная пиратка, ибо лицензионных тогда не было, плюс картридж » Contra: Hard Corps «. Уверен, момент покупки приставки для многих детей 90-х не забыт до сих пор (ромхакеры и ретрогеймеры — привет!), а именно для меня он стал ещё и ключевым в будущем. Но обо всём по-порядку.
11-й класс
(прим. автора: тот самый компьютер, только куда позднее)
Осенью 2005-го года мне купили компьютер. С первых дней я начал играть в игры. Учёба в школе просела, но держалась на нормальном для гимназии уровне. А спустя полгода играть надоело. Тогда и свершился переломный момент!
Негеймер
Именно тогда, в 2006 году, как мне кажется, начался варезный бум. Куча сайтов с кряками, кейгенами, патчами. Каждый старался перепаковать инсталлятор так (привет сборкам Винды), чтобы скачавшему ничего лишнего делать не нужно было: установилось и работает, правда иногда добавляя что-то от себя.
Переводчик
cracklab.ru
Скачал для экспериментов себе парочку «крэкмисов» (программы, специально написанные для того, чтобы их реверсили, обучаясь при этом взлому и защите ). Попробовал — очень понравилось! Всё получилось с первого раза, чему я был несказанно рад.
В итоге, простые защиты снимались на раз-два с помощью патчинга (от слова patch — заплатка), а вот с теми, что посложнее (я решил попробовать эротические шашки и поддавки) как-то уже стало тяжело, и я остановился, решив вернуться к переводам.
Ромхакинг
Иногда играя в Сегу, мне попадались картриджи на русском языке, на титульных экранах игр которых были такие надписи как «Группа перевода SHEDEVR «, «Перевод NEW-GAME.RU «. Разработчики ли это, или же какие-то сторонние организации я не знал, но у них явно был доступ к каким-то манускриптам, древним текстам шумеров, в которых рассказывалось, как переводить игры на русский язык. И мне захотелось овладеть этими знаниями.
Так я открыл для себя форум «Шедевра«.
У них были статьи, были программы — всё необходимое для того, чтобы сделать твою любимую игру ещё и «твоей любимой игрой на русском языке«. Правда, статьи были только для NES (Nintendo Entertainment System, или по-народному: Денди, Сюбор). Но всё равно круто! И я погрузился в новые и увлекательные для себя темы: Ромхакинг и эмуляция ретро-консолей на ПК.
Если вкратце, то ромхакинг — это любое изменение образа или файла игры, с какой либо целью: перевод, исправление кода, графики.
Это был очень занимательный процесс: сидишь, перерисовываешь квадратики игрового шрифта пиксель за пикселем, переводишь и вставляешь с помощью программы для перевода PokePerevod текст, и смотришь что получилось. Правда, никакого тебе ассемблера, только хардкор! Но это уже было планкой, через которую очень немногие могли перепрыгнуть (судя по количество активных на форуме Шедевра).
Я учитель
Сделав какие-то переводы «в стол», а какие-то и в народ, я вернулся к исполняемым файлам Windows. Ещё немного поднаторев в ассемблере, я понял, что «секретных» знаний во мне теперь чересчур много, и мне есть что рассказать из своего опыта, есть чем поделиться, и что ещё не было описано в имеющихся статьях. Хотелось передавать знания таким же новичкам, каким я был сам (видимо, сказывается то, что мама — учитель).
Взяв первую попавшуюся программу, которая требовала лицензию (а практически все статьи, обучающие крякингу, так и начинались), я решил исследовать её, параллельно рассказывая что я делаю. Тогда не будет казаться, что программа взята специально старой версии, давно изученная, поломанная, а получится наоборот такой себе свежий и актуальный урок, со скриншотами и практически без абсолютных адресов, чтобы хоть как-то сохранить актуальность статьи на момент чтения кем-либо в будущем.
Получив положительные отзывы, я писал ещё и ещё, понимая, что спрос есть.
Инструменты
А в универах учат реверсу?
Если в двух словах, то в Беларуси с этим туго, и, насколько я знаю, в России и Украине тоже. Почему? Да потому что специалисты этой профессии обычно нужны в одной с половиной организации, и, обычно, полтора человека. Собственно, и преподавателей не так много.
Да, ассемблеру, конечно, учат, даже в некоторых колледжах. Только студент, глядя на написанный ассемблерный листинг, вряд ли даже может осознать, что эти все регистры, операнды, опкоды хоть как-то связаны с информационной защитой, эксплоитами, кряками, кейгенами, патчами, малварью, антивирусами, прошивками и т.д.
Например, в Беларуси я знаю только два-три места, куда требуются реверс-инженеры. В России, конечно, ситуация получше, но, специалистов также немного.
Первая работа
В одну из этих фирм я и решил пойти работать вирусным аналитиком, понимая, что, собственно, больше и некуда.
Реверсишь малварь, клепаешь сигнатуры, изучаешь принципы работы вредоносного ПО, пишешь расшифровщики для ransomware (если получается), попутно улучшаешь ядро.
В принципе, работа неплохая, но, лишь спустя время я осознал, что всяко ближе не наблюдать за тем, как малварь использует какие-то уязвимости, а самому их находить, быть первым в этом, помогая защищать информационный мир отправленными разработчикам отчётами.
Другой ассемблер
Однажды я узнал, что кроме ассемблерного кода Intel (16-, 32-, 64-битного) бывает и другой, по-началу кажущийся совершенно непохожим на тот, что ты знаешь. Это произошло в тот момент, когда я добрался до перевода своей любимой игры — » Thunder Force III «, в которую брат играл лучше меня.
Ресурсы в ней оказались сжатыми каким-то неизвестным упаковщиком, т.к. я не смог найти шрифт ни одним тайловым редактором (именно в таких программах чаще всего и перерисовывают игровые буковки, что выводятся на экран).
P.S. Thunder Force III я так и не перевёл, но написал редактор уровней к ней.
Sony Playstation
Обратное мышление и первый кейген
Знаете, что тогда стало для меня настоящим испытанием? Имея на руках лишь ассемблерный листинг кода, который распаковывает что-либо, написать к нему упаковщик. Здесь потребовалось выработать обратное мышление, которое практически не требовалось во время патчинга «крэкмисов«, и излечивания программ от жадности.
Я пытался идти от обратного, понимая, что должно быть на выходе, на входе, и какие байты сжатых данных за что отвечают, чтобы сделать такие же.
Написав ещё множество утилит для кучи игр по распаковке и упаковке данных, я осознал, что готов написать свой первый кейген, т.к. уже научился мыслить от обратного.
Не помню, что это была за программа, но кейген удался, и из имени пользователя я смог получать всегда правильный серийный номер. О чём также поведал в статье.
Статья о кейгене
А вот писать статью о кейгене было тяжело. Тяжелее написания кейгена. Т.к. в статье передать принцип обратного мышления довольно таки сложно. Как и всё, что приходит с опытом.
Крякерские команды
Поначалу, если ты, как и я, пришёл в реверс самоучкой, ты реверсишь один, для себя (либо в народ, это как пойдёт). И тебя это устраивает. Но, потом ты натыкаешься на какой-нибудь релиз крякерской команды (это те, что выкладывают взломанный софт с кряками и кейгенами), и решаешь присоединиться к ним. Там и силы свои можно будет сравнить с другими людьми, и заодно набраться от них опыта.
Собравшись с духом, пишешь письмо, с просьбой присоединиться. Высылают задание в виде кейгенми. Решаешь его, после чего тебе дают доступ в чатик команды.
На самом деле, не все из них реверсеры. Кто-то художник, кто-то умеет доставать платный софт, у кого-то вычислительные мощности (возможность факторизовать любой публичный ключ RSA-512 за два дня, на 2013-й год, если это требовалось для снятия лицензионной защиты). В общем, преимущества налицо. Но софт для релиза всё равно выбираешь сам, чаще всего. И денег за релизы не получаешь. Правда.
Проблемы с законом?
Да, за распространение кряков и кейгенов всё таки есть вероятность загреметь (особенно если программа популярная и стоит много денег). В любой момент может произойти контрольная закупка: тебе напишет дядя, который хочет «взломать Adobe / 1C Бухгалтерия сколька будит стоеть» (реальная история). Но ребята хотят выживать, особенно если работы нет, а «навык«-то применять хочется, не важно пока куда. И начинают идти на крайности.
… барыжат ломаным софтом, взламывают программы за деньги.
И, в тот момент, когда появляется желание жить честно, крякер идёт устраиваться на работу, там откапывают его прошлое, и — «Извините, но Ваше прошлое сыграло не в Вашу пользу!«. Хотя, с моей позиции, человека с таким опытом стоит брать с руками и ногами, ведь, во первых, вы даёте человеку возможность исправиться, и, во вторых, направляете его знания в правильное русло. Среди моих знакомых действительно есть примеры успешного трудоустройства в антивирусную область, где товарищ на собесе сказал, что взламывал программы на заказ.
Честно заработанный лицензионный ключ
Да, и такое бывает. Даже у крякера. Были где-то статейки о том, как выпросить у разработчика ключ. И я так пробовал делать. Не помогало.
Тогда я перевёл программу на белорусский язык, и отправил автору языковой файл. За что получил в ответ лицензионный ключ на своё имя! Мой первый лицензионный ключ.
Что дальше?
Наигравшись в пирата, постепенно приходишь к тому, что работа у тебя есть, зарплата стабильная, дело любимое делаешь, а значит пора завязывать с нехорошими вещами.
Ещё бывают реверс-инженеры хардварщики (те, что железо реверсят), но о них я знаю мало. Хотя, тема очень даже интересная. Я же больше по программной части.
Нирвана
Евгений Казаев, RusEm — о том, как работает реверс-инженер и что нужно любить в чужом коде
Обратная разработка или реверс-инжиниринг –– это уже устоявшийся термин. Фактически реверс-инженеры могут не только восстановить из готовой программы или устройства все этапы его создания, но и создать аналогичный продукт без прямого копирования, в том числе и с недокументированными возможностями. Это позволяет сэкономить на разработке значительные средства и время. Кроме того, обратная разработка играет существенную роль в поиске уязвимостей ОС и при создании антивирусного ПО. Евгений Казаев из RusEm рассказал в рамках конференции PartyHack в Иннополисе, как работают реверс-инженеры, об их главных инструментах и о том, что он любит в чужом коде.
Читайте «Хайтек» в
Любить чужой код
Цель реверс-инженера — получить исходный код из уже готовой и скомпилированной программы. В этом нам помогает дизассемблер. Текст на языке ассемблера — минимум, который мы можем получить при работе с данной программой. В таком случае декомпилятор на голову выше дизассемблера, так как он «позволяет», опять же, в кавычках, поскольку здесь зависит от его уровня, работать уже непосредственно с программой. Дизассемблер в зависимости от того, на каком языке программа была написана, старается привести машинный код программы к исходному коду на этом же языке для облегчения понимания. Не будем же мы переделывать приложение, пускай даже мегабайт на ассемблере, это тяжкий и неимоверный труд. А отладчики, например, используют больше для динамического анализа. То есть они позволяют нам исследовать программу в моменты запуска, во время работы, смотреть состояние регистра, стека и всего прочего.
Reverse Engineering, обратная разработка –– исследование устройства или программы с целью:
Инструменты, которые использует обратный инженер:
Для меня Java, если речь идет о стартапе, — это фиаско. Помимо этого декомпилятора, я обожаю APKTOOL. Он позволяет не только разбирать, но и собирать назад. Есть небольшая NOVI-оболочка к нему, которая декомпилирует наше приложение в smali-код. Smali-код — это текстовые представления байт-кода java-машины.
Что я как реверс-инженер люблю в чужом коде:
Строки наше все
Программисты в основном пишут с учетом того, как бы они сделали это со своей позиции, облегчая логику и упрощая разработку, но редко кто пишет со стороны защиты. Представим, что вы стартап и написали гениальнейшее приложение, хотите его продавать и начинаете думать о защите. Но нужно продать не одну копию программы, а, например, столько копий, сколько у вас пользователей. После этого думаете: раз мы хотим продать одно приложение одному юзеру, хотя бы для одного устройства, то будем стараться привязать его к устройству. Есть приложение, есть устройство, нам нужно продать копию. Логично, что нужно защитить приложение, чтобы оно работало только на этом устройстве. Как же нам определить устройство и выделить из многих? Это можно сделать по серийному номеру. И мы будем использовать серийный номер. Его могут поменять, но это противозаконно. Дальше думаем: у нас есть IMEI, чтобы он не был таким очевидным, зашифруем его. Пишем некоторую функцию — хэш или соль, без разницы, назовем ее Akrypt.
Все зависит от уровня программиста или сложности. Из полученного возьмем часть и назовем это кодом — это будет с нулем шесть символов, и сделаем следующую систему — пользователь присылает свой серийный номер, по данной схеме отправляем ему код валидации. Мы хотим анализировать приложение, необходимо от чего-то отталкиваться. От чего? Вспомним, что я люблю в чужом коде. В первую очередь, смотрю строки. Строки наше все.
Строки –– маяки в море кода. Строки в открытом виде –– наша радость.
Евгений Казаев
Что мне нравится, так это читабельность. Вы пишете, например, метод проверки. То, что удобнее понимать и писать, называете этот метод проверкой. Зачастую программисты, которые впервые пишут защиту, делают это так, что результаты проверки лицензии, файлы лицензии, коды регистрации используются только для проверки. Лицензия ради проверки лицензии. Код регистрации ради проверки кода регистрации. Защита от самого себя — защита от дурака. Банальная условная проверка показывает, что результат проверки сам метод не использует больше нигде. Мы просто проверяем, прошла она или не прошла. И у меня есть не вредный совет: не надо делать так. Используйте результат проверки не просто как проверку. Воспользуйтесь шифрованием, посмотрите, прошло оно или нет, а результат шифрования используйте где-то в приложении, — и чтобы он был критичен для работы приложения. Тогда никакое изменение не спасет того, что приложение будет падать без нужных данных.
Думайте не как программист
В реверсинге есть два пути — это запатчить приложение, когда ты просто изменяешь код, и создать генератор ключей. Это высшая каста. Вы сами генерируете ключи пользователю. Метод «проверка» берет текст, введенный пользователем user-код, заводит переменную rite-код, и ей присваивают значение, полученное из gen-кода. Это из локальной валидации, когда код введен и валидируется в этом же приложении. Вот вам мой совет: сами проверяем и сами считаем. В случае с генератором ключей приложение при этом не трогается. Чем это хорошо? Пока не смените алгоритм валидации, все ваши версии уже зарелизены. А проверку можно обойти легко. Если будет 500 таких вызовов, нужно изменить результаты функции методом «проверка». Здесь можно просто пропатчить методом, и он всегда будет возвращать истину, вне зависимости от того, что там внутри, и неважно, сколько будет проверок, все пройдут. И если мы стремимся в высшую касту и хотим сделать генератор, нас отделяет от генератора только одна неизвестная функция — метод Encode.
Вредный совет — телефон ваш друг, если привяжете его к серийному номеру. У вас же нет идеи, что он обманет, в мыслях такого не будет. Всегда думайте, что телефон ваш друг, доверяйте ему. Даже если бы я не смог разобрать функцию генерации кода, но у меня бывала куплена лицензия на один аппарат. Сделать так, чтобы он работал на всех аппаратах, — не менять телефон.
Евгений Казаев
Не доверяйте никаким входным данным. Послать можно любой код и отправить любые данные. Даже если вы уверены, что эти данные никогда не поменяются, всегда найдется метод их подменить. А там уже зависит от того, как все устроено.
Многие начинающие программисты, когда думают о защите, смотрят в сторону платных продуктов — протекторов. Они позволяют, можно сказать, без усилий сделать защиту на свое приложение. На первых порах, пока вы не сделаете свою защиту, более-менее стойкую, забудьте про протекторы. Если не в паблике, а в привате, почти на любой протектор есть анпротектор, темная сторона. Если вы будете программировать защиту, думайте не как программист, а как человек на той стороне.
Обратный инжиниринг
Обра́тная разрабо́тка (обратный инжиниринг, реверс-инжиниринг; англ. reverse engineering ) — исследование некоторого устройства или программы, а также документации на них с целью понять принцип его работы и, чаще всего, воспроизвести устройство, программу или иной объект с аналогичными функциями, но без копирования как такового.
Применяется обычно в том случае, если создатель оригинального объекта не предоставил информации о структуре и способе создания (производства) объекта. Использование обратной разработки может противоречить закону об авторском праве и патентному законодательству.
В настоящее время под словами «reverse engineering» чаще всего понимается т. н. «clean room reverse engineering», то есть процесс, при котором одна группа разработчиков анализирует машинный код программы (в сленге хакеров для этого процесса используется также выражение «обратный инжиниринг» или «реверсный инжиниринг»), составляет алгоритм данной программы на псевдокоде, либо, если программа является драйвером какого-либо устройства, составляет исчерпывающие спецификации интересующего устройства. После получения спецификаций другая группа разработчиков пишет собственный драйвер на основе полученных спецификаций или алгоритмов. Такой подход позволяет избежать обвинений в нарушении авторских прав на исходную программу, так как по законам, к примеру в США, подпадает под понятие «fair use», то есть добросовестного использования оригинальной программы. Результат обратной разработки редко идентичен оригиналу, что и позволяет избежать ответственности перед законом.
Содержание
Сферы применения обратной разработки
Электроника
Копирование различных электронных блоков без фактической разработки. Известно, что часть советской цифровой электроники копировалась. Например, американская серия интегральных схем 74 и её советский аналог К(Р)155.
Ещё один пример обратной разработки — создание компанией AMD процессора Intel 80386.
Программное обеспечение
С развитием Интернета популярные операционные системы и программы всё интенсивнее исследуются на предмет обнаружения в них уязвимостей или т. н. дыр. В дальнейшем найденные дыры могут использоваться для получения несанкционированного доступа к удалённому компьютеру или компьютерной сети.
Одним из широко известных примеров обратной разработки является исследование IBM, ставшее серьёзным шагом на пути развития производства IBM-совместимых компьютеров сторонними производителями. Создание сервера GNU/Linux и работающего с серверами на базе ОС Microsoft Windows) также потребовало обратной разработки используемого SMB.
Обратная разработка программного обеспечения производится с помощью следующих методик.
Базы данных
может использоваться при создании реляционной модели базы данных.
Промышленность
Обратная разработка продукта конкурента с целью узнать его устройство, принцип работы и оценить возможности создания аналога.
Военная промышленность
Самыми известными фактами обратной разработки во время второй мировой войны являлись:
Для анализа исходного кода
Существуют программы, которые предоставляют как возможность восстановления (обратный, reverse) по исходному коду общего системного проекта (классы, связь между ними и т.п.), так и прямой генерации исходного кода на основе созданного проекта (функциональных блоков бизнес-процесса):