Всем привет,
На этот раз статья будет не технической (хотя в ней и будут попадаться какие-то технические термины/моменты), а скорее автобиографической, если так можно выразиться. Эта статья о том, как я докатился до такой жизни пришёл в реверс-инжиниринг, что читал, чем интересовался, где применял, и т.д. И, я почему-то уверен, что моя история будет иметь множество отличий от твоей. Поехали...
Начало
А начиналось всё ещё в далёком детстве. Думаю, как и многим парням (а может и девушкам), мне всегда было интересно знать, как же всё устроено, почему работает, почему не работает, и т.д.
Сначала я начал разбирать все машинки на батарейках, которые у меня были (даже те, что были у брата). Конечно, не всегда удавалось собрать, но, интерес был превыше. Потом нашёл какой-то старый радиоприёмник-магнитофон у отца в кладовке, и разобрал его тоже. Ещё были тамагочи. Но там я вообще ничего не мог понять: микросхема, "капля" и экран. Хотя да, экран я разбирал на слои.
Конечно же, за всё несобранное я получал по шапке.
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
, и дальше уже по обстоятельствам. Так и достигаешь нирваны...