Реверс-инжиниринг. История. Моя +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, и дальше уже по обстоятельствам. Так и достигаешь нирваны...




К сожалению, не доступен сервер mySQL