Реверс-инжиниринг. История. Моя +71




Всем привет,


На этот раз статья будет не технической (хотя в ней и будут попадаться какие-то технические термины/моменты), а скорее автобиографической, если так можно выразиться. Эта статья о том, как я докатился до такой жизни пришёл в реверс-инжиниринг, что читал, чем интересовался, где применял, и т.д. И, я почему-то уверен, что моя история будет иметь множество отличий от твоей. Поехали...


Начало


А начиналось всё ещё в далёком детстве. Думаю, как и многим парням (а может и девушкам), мне всегда было интересно знать, как же всё устроено, почему работает, почему не работает, и т.д.
Сначала я начал разбирать все машинки на батарейках, которые у меня были (даже те, что были у брата). Конечно, не всегда удавалось собрать, но, интерес был превыше. Потом нашёл какой-то старый радиоприёмник-магнитофон у отца в кладовке, и разобрал его тоже. Ещё были тамагочи. Но там я вообще ничего не мог понять: микросхема, "капля" и экран. Хотя да, экран я разбирал на слои.
Конечно же, за всё несобранное я получал по шапке.


Sega Mega Drive



Отец купил мне её на день рождения: обычная пиратка, ибо лицензионных тогда не было, плюс картридж "Contra: Hard Corps". Уверен, момент покупки приставки для многих детей 90-х не забыт до сих пор (ромхакеры и ретрогеймеры — привет!), а именно для меня он стал ещё и ключевым в будущем. Но обо всём по-порядку.


Время шло, я рос. В школе всегда была интересна информатика и физика (ещё химия). Ассемблеру там, конечно, не учили, но программировать в алгоритмической среде "ИнтАл" (белорусская разработка для школ) — очень даже. И, для меня было шоком, когда я пошёл на районную олимпиаду по информатике, и, у всех, кроме меня, были синие окошки Turbo Pascal, а у меня — белое — Интал. Но, тогда я занял почётное третье место.


11-й класс



(прим. автора: тот самый компьютер, только куда позднее)


Осенью 2005-го года мне купили компьютер. С первых дней я начал играть в игры. Учёба в школе просела, но держалась на нормальном для гимназии уровне. А спустя полгода играть надоело. Тогда и свершился переломный момент!


Негеймер


Именно тогда, в 2006 году, как мне кажется, начался варезный бум. Куча сайтов с кряками, кейгенами, патчами. Каждый старался перепаковать инсталлятор так (привет сборкам Винды), чтобы скачавшему ничего лишнего делать не нужно было: установилось и работает, правда иногда добавляя что-то от себя.


И я был таким. Правда сам "таблеток" не делал, а лишь находил их, рисовал NFO-шку, перепаковывал инсталлер (чаще всего это были Inno Setup), а дальше вы знаете.



Переводчик



Так вот, тогда мне почему-то не нравилось, что далеко не все программы переведены на русский язык, и захотелось это исправить. Накачал разных редакторов ресурсов, типа Resource Hacker, начал открывать все exe и dll-файлы программ что находил в Program Files, и смотрел, какие строковые ресурсы можно перевести. Переводил, паковал в установщик .lng или .RUS файл, и выкладывал (так и не узнал, как эти rus-файлы работали). Но так продолжалось до тех пор, пока мне не повстречались упакованные и защищённые файлы.


cracklab.ru


Ныне exelab.ru. Именно там я узнал, что исполняемые файлы бывают упакованными (а порой и защищёнными), а так же как с этим бороться. И, так как авторы часто упоминали в своих статьях такие штуки как "ассемблер", "дизассемблирование", "рассылка Калашникова", пришлось углубляться в матчасть.


Скачал для экспериментов себе парочку "крэкмисов" (программы, специально написанные для того, чтобы их реверсили, обучаясь при этом взлому и защите). Попробовал — очень понравилось! Всё получилось с первого раза, чему я был несказанно рад.


В итоге, простые защиты снимались на раз-два с помощью патчинга (от слова patch — заплатка), а вот с теми, что посложнее (я решил попробовать эротические шашки и поддавки) как-то уже стало тяжело, и я остановился, решив вернуться к переводам.



Ромхакинг


Иногда играя в Сегу, мне попадались картриджи на русском языке, на титульных экранах игр которых были такие надписи как "Группа перевода SHEDEVR", "Перевод NEW-GAME.RU". Разработчики ли это, или же какие-то сторонние организации я не знал, но у них явно был доступ к каким-то манускриптам, древним текстам шумеров, в которых рассказывалось, как переводить игры на русский язык. И мне захотелось овладеть этими знаниями.



Так я открыл для себя форум "Шедевра".


У них были статьи, были программы — всё необходимое для того, чтобы сделать твою любимую игру ещё и "твоей любимой игрой на русском языке". Правда, статьи были только для NES (Nintendo Entertainment System, или по-народному: Денди, Сюбор). Но всё равно круто! И я погрузился в новые и увлекательные для себя темы: Ромхакинг и эмуляция ретро-консолей на ПК.



Если вкратце, то ромхакинг — это любое изменение образа или файла игры, с какой либо целью: перевод, исправление кода, графики.


Это был очень занимательный процесс: сидишь, перерисовываешь квадратики игрового шрифта пиксель за пикселем, переводишь и вставляешь с помощью программы для перевода PokePerevod текст, и смотришь что получилось. Правда, никакого тебе ассемблера, только хардкор! Но это уже было планкой, через которую очень немногие могли перепрыгнуть (судя по количество активных на форуме Шедевра).


Я учитель


Сделав какие-то переводы "в стол", а какие-то и в народ, я вернулся к исполняемым файлам Windows. Ещё немного поднаторев в ассемблере, я понял, что "секретных" знаний во мне теперь чересчур много, и мне есть что рассказать из своего опыта, есть чем поделиться, и что ещё не было описано в имеющихся статьях. Хотелось передавать знания таким же новичкам, каким я был сам (видимо, сказывается то, что мама — учитель).


Взяв первую попавшуюся программу, которая требовала лицензию (а практически все статьи, обучающие крякингу, так и начинались), я решил исследовать её, параллельно рассказывая что я делаю. Тогда не будет казаться, что программа взята специально старой версии, давно изученная, поломанная, а получится наоборот такой себе свежий и актуальный урок, со скриншотами и практически без абсолютных адресов, чтобы хоть как-то сохранить актуальность статьи на момент чтения кем-либо в будущем.


Получив положительные отзывы, я писал ещё и ещё, понимая, что спрос есть.


Инструменты



При написании каждой статьи я старался использовать только самые свежие и удобные программы на тот момент: Olly Debugger с плагинами, PEiD, PE Explorer, и кучу других. Никаких тебе SoftICE, HIEW и DEBUG.COM, коими привыкли пользоваться большинство авторов, хотя пользоваться ими в современном мире было сплошной болью.


Тем не менее, на то время я никогда не пользовался IDA Pro. Она мне казалась сложной, непонятной, в ней очень трудно было заниматься отладкой, а простейшие вещи типа FS[0x30] и LastError, как в Olly Debugger, узнать было очень сложно.


А в универах учат реверсу?


Если в двух словах, то в Беларуси с этим туго, и, насколько я знаю, в России и Украине тоже. Почему? Да потому что специалисты этой профессии обычно нужны в одной с половиной организации, и, обычно, полтора человека. Собственно, и преподавателей не так много.



Да, ассемблеру, конечно, учат, даже в некоторых колледжах. Только студент, глядя на написанный ассемблерный листинг, вряд ли даже может осознать, что эти все регистры, операнды, опкоды хоть как-то связаны с информационной защитой, эксплоитами, кряками, кейгенами, патчами, малварью, антивирусами, прошивками и т.д.


Например, в Беларуси я знаю только два-три места, куда требуются реверс-инженеры. В России, конечно, ситуация получше, но, специалистов также немного.


Первая работа


В одну из этих фирм я и решил пойти работать вирусным аналитиком, понимая, что, собственно, больше и некуда.
Реверсишь малварь, клепаешь сигнатуры, изучаешь принципы работы вредоносного ПО, пишешь расшифровщики для ransomware (если получается), попутно улучшаешь ядро.


В принципе, работа неплохая, но, лишь спустя время я осознал, что всяко ближе не наблюдать за тем, как малварь использует какие-то уязвимости, а самому их находить, быть первым в этом, помогая защищать информационный мир отправленными разработчикам отчётами.


Другой ассемблер


Однажды я узнал, что кроме ассемблерного кода Intel (16-, 32-, 64-битного) бывает и другой, по-началу кажущийся совершенно непохожим на тот, что ты знаешь. Это произошло в тот момент, когда я добрался до перевода своей любимой игры — "Thunder Force III", в которую брат играл лучше меня.



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


Поэтому я стал гуглить, наткнувшись в итоге на работу одного француза, который как раз разобрал алгоритм сжатия игры. Я связался с этим человеком, поинтересовавшись, как же он изучал принцип работы алгоритма сжатия, на что он скинул мне мою первую IDB-шку (это файл базы данных IDA Pro), в которой были разобраны многие моменты кода игры, что меня очень впечатлило!


Так я погрузился в дебри IDA Pro и ассемблера Motorola 68000, из которых не выбрался (и не хочу) до сих пор.



P.S. Thunder Force III я так и не перевёл, но написал редактор уровней к ней.


Sony Playstation



Да, следующей была "первая плойка". У неё также был другой ассемблер — MIPS, с другими регистрами, опкодами, адресами. И на этой приставке всё так же были игры с пожатыми ресурсами, которые нуждались в локализации.


Обратное мышление и первый кейген


Знаете, что тогда стало для меня настоящим испытанием? Имея на руках лишь ассемблерный листинг кода, который распаковывает что-либо, написать к нему упаковщик. Здесь потребовалось выработать обратное мышление, которое практически не требовалось во время патчинга "крэкмисов", и излечивания программ от жадности.


Я пытался идти от обратного, понимая, что должно быть на выходе, на входе, и какие байты сжатых данных за что отвечают, чтобы сделать такие же.


Написав ещё множество утилит для кучи игр по распаковке и упаковке данных, я осознал, что готов написать свой первый кейген, т.к. уже научился мыслить от обратного.


Не помню, что это была за программа, но кейген удался, и из имени пользователя я смог получать всегда правильный серийный номер. О чём также поведал в статье.


Статья о кейгене


А вот писать статью о кейгене было тяжело. Тяжелее написания кейгена. Т.к. в статье передать принцип обратного мышления довольно таки сложно. Как и всё, что приходит с опытом.


Крякерские команды



Поначалу, если ты, как и я, пришёл в реверс самоучкой, ты реверсишь один, для себя (либо в народ, это как пойдёт). И тебя это устраивает. Но, потом ты натыкаешься на какой-нибудь релиз крякерской команды (это те, что выкладывают взломанный софт с кряками и кейгенами), и решаешь присоединиться к ним. Там и силы свои можно будет сравнить с другими людьми, и заодно набраться от них опыта.


Собравшись с духом, пишешь письмо, с просьбой присоединиться. Высылают задание в виде кейгенми. Решаешь его, после чего тебе дают доступ в чатик команды.


На самом деле, не все из них реверсеры. Кто-то художник, кто-то умеет доставать платный софт, у кого-то вычислительные мощности (возможность факторизовать любой публичный ключ RSA-512 за два дня, на 2013-й год, если это требовалось для снятия лицензионной защиты). В общем, преимущества налицо. Но софт для релиза всё равно выбираешь сам, чаще всего. И денег за релизы не получаешь. Правда.


Тогда в чём профит, спросите вы? В том, чтобы зарелизить раньше другой команды (FFF, CoRE и многие другие). Очень хорошо эта тема была раскрыта в веб-сериале "Scene (Сцена)".


Проблемы с законом?


Да, за распространение кряков и кейгенов всё таки есть вероятность загреметь (особенно если программа популярная и стоит много денег). В любой момент может произойти контрольная закупка: тебе напишет дядя, который хочет "взломать Adobe/1C Бухгалтерия сколька будит стоеть" (реальная история). Но ребята хотят выживать, особенно если работы нет, а "навык"-то применять хочется, не важно пока куда. И начинают идти на крайности...


… барыжат ломаным софтом, взламывают программы за деньги.


И, в тот момент, когда появляется желание жить честно, крякер идёт устраиваться на работу, там откапывают его прошлое, и — "Извините, но Ваше прошлое сыграло не в Вашу пользу!". Хотя, с моей позиции, человека с таким опытом стоит брать с руками и ногами, ведь, во первых, вы даёте человеку возможность исправиться, и, во вторых, направляете его знания в правильное русло. Среди моих знакомых действительно есть примеры успешного трудоустройства в антивирусную область, где товарищ на собесе сказал, что взламывал программы на заказ.


Честно заработанный лицензионный ключ


Да, и такое бывает. Даже у крякера. Были где-то статейки о том, как выпросить у разработчика ключ. И я так пробовал делать. Не помогало.


В те годы я как раз учился "слепой" печати, и искал адекватные программы для этого. Шахиджанян взрывал мозг своим "Соло на клавиатуре", поэтому я начал искать альтернативы. Наткнулся на Typing Reflex. Она была платной, но очень хорошей.


Тогда я перевёл программу на белорусский язык, и отправил автору языковой файл. За что получил в ответ лицензионный ключ на своё имя! Мой первый лицензионный ключ.



Что дальше?


Наигравшись в пирата, постепенно приходишь к тому, что работа у тебя есть, зарплата стабильная, дело любимое делаешь, а значит пора завязывать с нехорошими вещами.


Из вариантов куда податься: антивирусные компании, промышленная безопасность (реверс прошивок, промышленных протоколов, поиск уязвимостей), спец-отделы каких-то крупных фирм, типа Sony, где требуется исследовать защищённость собственных продуктов, ну или стать сильным и независимым реверс-инженером и зарабатывать на багбаунти, выступать на конференциях и т.д.


Ещё бывают реверс-инженеры хардварщики (те, что железо реверсят), но о них я знаю мало. Хотя, тема очень даже интересная. Я же больше по программной части.


Нирвана


Насмотревшись на различного рода платформы, ассемблерный код (Intel, ARM, PowerPC, M68K, 6502, MIPS, 65c816, Blackfin, IA64 и какие-то ещё, не помню), приходишь к выводу, что принцип у всех ассемблеров практически одинаковый (ну, кроме разве что Итаниума), и начинаешь смотреть на эти бесконечные листинги по-другому: в первую очередь находишь команды прыжков, move-команды, возврат из функции, с какой стороны source, с какой dest, и дальше уже по обстоятельствам. Так и достигаешь нирваны...

Вы можете помочь и перевести немного средств на развитие сайта



Комментарии (41):

  1. Zarf
    /#19695748 / +1

    Спасибо за отличную статью — было приятно вспомнить времена HIEW и SOFTICE.

    Отдельное спасибо за то, что напомнили про сериал — надо пересмотреть, а то в памяти осталась только музыкальная тема.

  2. luciana
    /#19695942 / +1

    Спасибо, очень круто!

  3. vilgeforce
    /#19696760

    Зря вы про HIEW, отличная тулза! :-)

    • DrMefistO
      /#19696788

      Я купил её, пытался пользоваться, но чот не сложилось.

      • vilgeforce
        /#19696824

        Она — прекрасный редактор, в том числе структур PE-файлов. Как дизассемблер я ее не использую практически никогда. А вот бегло глянуть что же в файле — самое оно

        • DrMefistO
          /#19696832

          Для PE-файлов есть CFF Explorer, а для дизазма — IDA. Для хекс-редактирования — Hex Workshop.

          • axifive
            /#19698228 / +1

            А так же кроме IDA есть не менее функциональный Radare2.

            • DrMefistO
              /#19698236 / +1

              Никто не спорит, что Радар и Бинарный Ниндзя есть, но я пока не дорос до них, а они — до моих запросов (к подобного рода ПО).

              • maxzhurkin
                /#19701378

                Звучит, так, как будто вы растёте в разные стороны (навстречу)

            • perfect_genius
              /#19699008

              Но почему игнорируют x64dbg? Только из-за того, что не портируют на Линукс?

              • DrMefistO
                /#19699512

                Никто не игнорирует. Но тогда, когда я только вливался в реверс, его не было.

    • pfemidi
      /#19696794 / +1

      Подпишусь. Я даже официально купил себе HIEW, поддержал так сказать отечественного производителя. IDA Pro конечно хорошо, но иногда это из пушки по воробьям. Правда HIEW умеет только ARM, x86 и x64, так что автору с Motorola 68000 он точно не поможет.

  4. adic3x
    /#19696862 / +1

    От одного скриншота Оли стало тепло на душе ;)

    • SADKO
      /#19698462

      Таки да, Оля была хороша для всякого, а Ида больше для не пуганного, но детального исследования, я ей в основном виндючные драйвера разбирал и оснастку, что бы потом…

  5. CorvOrk
    /#19697036 / +1

    Спасибо за статью. Делал keygen для Black&White, читы для Silent Storm, Dota2 и прочее, связанное с играми (разумеется только в целях любопытства). Только у меня интерес к этому проснулся намного позднее — уже в университете — все детство только и делал, что играл (Вы «слезли» с игр за пол года — для меня это было самой настоящей зависимостью, особенно с появлением MMORPG).

    Да, все это прокачивает понимание работы ОS, как данные хранятся в процессоре/ОЗУ, ассемблер и многое другое. Только вот в работе это никак не помогает — даже олимпиадное программирование полезнее (узнаете алгоритмы/структуры, может что спросят на собеседовании, раз в сто лет даже что-то можно применить в работе) — слишком узконаправленные знания.

    • DrMefistO
      /#19697044 / +3

      Только вот в работе это никак не помогает

      Смотря какая работа. А вообще никто не мешает шарить в ассемблере и олимпиадном программировании одновременно.

    • spiiin
      /#19697694 / +2

      Помогает в какой-то степени. Алгоритмы можно понять и изучая код — структуры данных в сеговских играх те же, алгоритмы компрессии, связанные с разработкой игр алгоритмы — AI врагов, поиск пути, допустимые упрощения в этих алгоритмах. Понимая ассемблер, можно намного лучше разобраться в низкоуровневой оптимизации, в том, какой оверхед дают скриптовые и высокоуровневые языки, в том, во что именно компилируется ваш код.
      Вы будете иметь представление о том, как защитить вашу программу от исследования и модификации. И самое полезное — улучшатся ваши навыки отладки и поиска ошибок в своих программах.

  6. HenadziMatuts
    /#19697700 / +2

    Приятно увидеть, так сказать, земляка, да ещё и со схожими интересами. Хотя я относительно недавно заинтересовался реверсом, это была моя борьба с прокрастинацией на работе, тогда начал практиковаться на простеньких crackme, потом пробовал писать кейген к Adobe Audition 1.5 (неудачно), потом пробовал в программирование и отладку под Sega Mega Drive (чуть более удачно), и в конце концов занялся портом одной досовской игрушки.

    Интересно насчёт первой работы вирусным аналитиком, уж не ВирусБлокАда ли?) Пожалуй из тех мест где в нашей стране ищут реверс-иженеров я знаю только её и CheckPoint.

    • DrMefistO
      /#19697716 / +1

      Я не хотел рекламы в статье или коментах. Но добавлю ещё про Белорусские Облачные Технологии — сплошное КГБ, госорганизация.

      • HenadziMatuts
        /#19697734

        Таких знаю, но не знал у них есть такие позиции. Я как-то подавал заявку на реверс-инженера в gog (aka cd project), но это было слишком самонадеянно)

        • DrMefistO
          /#19698488

          Ах, да, ещё какое-то время в Wargaming требовался реверс-инженер для написания систем противодействия ботам и читингу. Но брали лишь тех, у кого большой игровой опыт в современные игры. У меня такого не было.

        • perfect_genius
          /#19698880

          Развиваюсь на реверсера уже пару лет чтобы устроиться к ним. А почему не взяли?

          • HenadziMatuts
            /#19699076

            Меня в общем даже не рассматривали, просто присылали письмо с отказом в ответ на резюме) Но в это есть смысл потому что у меня нет профессионального опыта ни в реверсе ни в геймдеве в целом, сюда же необходимось релокации и оформления для кандидата который явно не стоит того.

          • DrMefistO
            /#19699528

            Игрового опыта в современные игры не было, только в ретро. А тестовое задание в виде описания реализации системы античитинга я сделал.

            • perfect_genius
              /#19701890

              Странно, вроде как-раз для ретро им и нужен был реверсер, чтобы работали на современных системах.

              • DrMefistO
                /#19701940

                Не, мне рассказывали про защиту от ботов и модов.

              • HenadziMatuts
                /#19702120

                Тут возник небольшой конфуз. Реверсер для ретро нужен был в GOG, куда пробовал устроиться я, а DrMefistO рассказывает об опыте собеседования на реверсера в Wargaming, там про ботов и античиты.

    • DrMefistO
      /#19698496

      отладку под Sega Mega Drive

      Не под мои ли видосы и статьи?)

      • HenadziMatuts
        /#19698720

        Нет, это был блог big evil corporation. Там парень параллельно с блогом делал игру под сегу. Сейчас ради интереса проверил, летом он её доделал, вроде как даже на картриджах выходила.

  7. Coline
    /#19697884 / +1

    Хотелось бы побольше узнать про законодательство в этой области в РФ и США. Допустим мне бы когда-нибудь пришла в голову идея какую-нибудь перевоплотить старую игру — исследовать логику, не без помощи реверса, с целью воссоздания на каком-нибудь ЯП и бесплатного распространения. Или сделать мод для игры, к которой нет инструментария. Насколько это законно? Я видел такие проекты (OpenMW, OpenRA, Skyrim Together, etc), но они зарубежные и не знаю насколько это законно у нас. Да и если законно, то с чего начать?

    • HenadziMatuts
      /#19699090

      Если по-простому, то переписывать и распространять код можно, ресурсы — нельзя, т.к. они, зачастую, лицензируется.

    • tyndrovik
      /#19699530

      Про кейгены и пр ст 273 ук рф(закон не разделяет программу и её оперативную память), Для общего развития — ст 272, 274, 138.1 ук рф.

  8. spam-receiver
    /#19698080 / +2

    Если кому интересно, есть бесплатная книга Дениса Юричева «Reverse Engineering для начинающих»

    beginners.re
    github.com/DennisYurichev/RE-for-beginners
    yurichev.com

  9. SADKO
    /#19698448 / +1

    Ух-ты знакомые шашки ;-) и не то, что-бы шашки, а поддавки, там всё интересней…
    … а в плане защиты, я уже не помню подробностей, но процесс изучался прямо в памяти во время работы

    • DrMefistO
      /#19698464

      Если готовы рассказать о снятии защиты стрип-шашек и поддавков, было бы круто:)

  10. Oldster
    /#19698898

    Спасибо за статью, прочитал как про себя. Какие хорошие были времена, сайс, ида, хью (кстати тоже покупал)

  11. dmitrmax
    /#19698934 / +1

    Забавно. Путь во много похож на мой, только с разницей в 7-10 лет. Я как-то не очень понимаю, как при данных временных точках вы могли застать Сегу Мегу Драйв. У меня компьютер появился в 1997 и уже в то время это была довольно устаревшая приставка.

    • DrMefistO
      /#19699526

      Да запросто. В Беларуси Сега была популярна где-то в нулевые, плюс-минус.

    • VEG
      /#19700610

      Ну не у всех родители были одинаково обеспеченными. Я до 2000 года не видел ничего кроме «Dendy». Большое количество детей довольствовалось такой же приставкой и дальше. А потом, через несколько лет, у людей уже начали массово появляться компьютеры.

  12. Andy_Big
    /#19703138

    Вспомнил как несколько лет назад приобрел экшн-камеру, в которой были некоторые софтовые недочеты, которые производитель не спешил поправлять. И вот, вспомнив свой не слишком большой опыт ассемблера 90-х годов и установив IDA, которую вообще до этого пару раз мельком видел, я ринулся в дебри прошивки этой камеры :)
    Сам был удивлен, но за месяц мне удалось не только разобраться во многих моментах прошивки, но и поправить несколько недочетов в прошивке :) Даже на 4PDA выкладывал патчи под нее.
    Но тяжко, конечно, заниматься этим, не имея приличного опыта реверс-инжиниринга :)