Reverse Engineering

Reverse Engineering (ревёрсинг, обратная разработка) — процесс <del>пизженья</del> восстановления исходников из конечного продукта инженерной и/или научной деятельности, интуитивно конструируя внутреннюю механику по принципу "«а какие процессы должны вызвать такое вот внешнее поведение этого продукта?»". Ориентируясь на нюх, так сказать. Иногда приводит к написанию собственного сорца али моделированию/разводке/пайке железячного аналога. Много их — ибо ваистену…
Возможно, все мы в детстве сломали немало игрушек пытаясь понять «как оно там устроено». С возрастом это проходит. Но не у всех.
Учёные пытаются дизассемблировать Вселенную, чтобы восстановить исходники Б-га, который явно наложил несколько пакеров и обфускаторов. Военные первым делом подбирают оружие на поле боя — чтобы посмотреть, как устроена эта штурмовая винтовка Stg-44 и можно ли из неё сделать Калаш, а уже потом закапывают трупы. Китайские дизайнеры успешно реверсируют дольче-габбано, чтобы произвести его больше, дешевле и хреновее. Ну а некоторые реверсируют программы, чтобы исправить в них некоторые ошибки (одна из самых распространённых — жадность разработчика) или просто посмотреть, как она устроена, что умеет, и сделать свою, с маджонгом и гейшами. Они-то и являются илитой IT.
Алсо, чуть менее, чем все советские микросхемы представляли собой аналоги забугорных, скопированные с готовых продуктов. В связи с этим в этой стране даже создан закон о правовой охране топологий интегральных микросхем, чтоб у нас в свою очередь не тырили.
Реверсинг ПО — восстановление принципов/идей/алгоритмов работы программы для исследования и/или создания аналогичного ПО. Часто применяется для:
Не следует путать взлом ПО с его реверсингом: для взлома достаточно разобрать принцип работы лицензионной проверки, а реверсинг — это полный разбор программы по кирпичикам и раскладывание своего мозга по уровню кошерности.
Для успешного кодопиздинга требуется знать ассемблер, иметь общее представление о криптографии, знать мунспик и теорию вероятностей — не быдлокодер ли твой предшественник? Ну и матан — например, теорию графов для анализа ветвлений. Но можно и не знать, главное — уметь быстро найти, что почитать, и резво разобраться.
Реверсинг железа — всяких блоков управления стиральными машинами, субару импрезами, контрольно-кассовыми машинами. Обычно применяется для:
Любой разработчик и производитель имеет свою лабораторию анализа отказов для "настоящего" чип-реверсинга. Вот, например, фотоотчёт о лаборатории Atmel.
В той стране от безысходности вообще было принято решение об отказе от разработки собственных чипов. Копипиздинг топологии ИМС был поставлен на широкую ногу.
Дизассемблер — это утилита, преобразующая бинарный код в ассемблерный листинг. В простейших случаях этого вполне достаточно, и остаётся немного покурить и найти то, что нужно. В худших — это каша, и без скриптов и/или отладчика не обойтись.
Hiew ("Hacker’s viewer"). Небольшая утилита, для нормальных людей бесполезная, юзают лишь надрочившиеся спецы, иногда — продвинутые пользователи (как шестнадцатеричный редактор). Давно существует куча GUI-шных тулзов для тех же целей, но по славной традиции тулзу продолжают использовать…
Sourcer от компании V Communications. Стародавний мощный дизассемблер времен DOS и ранних версий Windows. Позволял из .COM или .EXE файлов получать непосредственно .ASM файл, причём для различных компиляторов ассемблера, таких как TASM или MASM. Если было задано достаточное количество проходов при дизасемблировании, то с высокой степенью вероятности можно было при компилировании только что созданного .ASM файла получить исходную исполнимую программу байт-в-байт. Доставлял хорошими комментариями в листинге, скоростью работы, поддержкой разных типов процессора и, конечно, олдскульным "сценовским" интерфейсом. Сейчас не актуален, хотя некоторые анонимусы продолжают держать его в своём инструментарии, например, для дизассемблирования MBR жёсткого диска, Boot-сектора, специальных утилит, загружаемых с дискеты без какой-либо ОС (например утилиты перепрошивки BIOS или утилиты от производителей HDD), и прочего. То есть для низкосистемных нужд. Последней явилась на свет версия v8.01 от 2001 года. Sourcer — помним, любим, скорбим!
Без этих вещей вы никогда не узнаете, что процессор Nippon-Denso NP648976 на самом деле жалкий клон Motorola 6803 с 16К ROM на борту. А когда узнаете, поймёте, что япошки никогда ничего сами не придумывали, а только умело пиздили.
Отладчик — программа для контролируемого исполнения программы или в общем случае любого произвольного куска кода, вплоть до инжектированной в другой процесс DLL. Продвинутый отладчик умеет использовать аппаратные средства отладки, ну и, конечно, дизассемблировать.

Основной дизассемблер на сегодняшний день. Обладает множеством функций типа поддержки скриптов, графического режима или встроенных плагинов вплоть до эмулятора x86. Не тупой интерфейс — множество интуитивно понятных «горячих» клавиш и т. п. Проекту уже лет 15, и он единственный из дизассемблеров живёт активной жизнью и поныне: у других в новых версиях фичи почти не родятся. До сих пор таскает с собой DOS-GUI версию для олдфагов. Также известен нефиговой ценовой политикой.
Пишет его татарский расовый мудак по имени Ильфак Гуильфанов. Детали истории создания дизассемблера покрыты мраком, но известно, что Ильфаку, как и Биллу Гейтсу с DOS, добрые люди помогли написать первые версии. И задумывался он как инструмент для восстановления прошивок HDD. Дальше, непонятно как и почему, люди разошлись, и остался он один. Потом Ильфак всплывает с версией 3.x уже от лица фирмы Datarescue, которая купила проект. Начиная с версии 4.0, у него появляется GUI, написанный на BCB! С этого времени продукт начинает приобретать массовую известность в узких кругах по двум причинам:
Остановимся на втором пункте подробнее.
Ильфак, будучи на данном рынке монополистом, давно забил на пользователей хуй. Потому что берут и так. Любой юзер IDA, которому приходилось иметь дело с поддержкой, получал кучу отрицательных эмоций: получив продукт с кучей багов, вы предоставлены себе в их исправлении. Ошибки исправлять никто не спешит — можно легко прождать полгода, даже если баг вопиющий. Продукт практически не тестировался перед релизами и не тестится до сих пор. Юзеры IDA вынуждены хранить несколько версий, потому что в одной хорошо работает одна фича, в другой — другая, в третьей — третья.
А среди «неофициальных» юзеров Ильфак нелюбим за то, что без спроса берёт идеи. За счёт того, что IDA поставляется с SDK, юзеры могут делать свои плагины к IDA, и таки делают немало. Плагины пишутся как для того, чтобы исправить баги оригинальной функциональности, так и ради добавления своих фич для решения конкретных задач. Уровень альтруизма среди «неофициальных» юзеров высок, и исходники плагинов выкладываются на всеобщее обозрение. Так вот, примерно через полгода после появления полезных исходников это становится фичей IDA. У Ильфака на этот счёт железное алиби: «То, что тут придумали — это не новая идея, это меня пользователи попросили ещё год назад».
Вначале народная ненависть выливалась в троллинг на форуме официального русского сайта. Но потом всё быстро утихло, ибо Ильфак анально отгородил форум официальных юзеров, а с неофициальными общаться перестал. Посему примерно раз в год то китайцы, то албанцы, то русские (был интересный случай, когда народ скидывался на руборде, чтобы купить одну копию и поделиться), то немцы тырят с тренингов, кардят, хачат сервера с IDA и коммуниздят очередную версию. Чем каждый раз нереально доставляют целевой аудитории IDA. А официальные юзеры потом смотрят в закрытые форумы поддержки и скидывают цитаты баттхёрта Ильфака в публику, повышая градус веселья.
Потом Ильфак свалил с Datarescue и стал делать IDA от лица своей конторы Hex-Rays. Ходят слухи, что он нанял наконец программеров с прямыми руками, которые наконец начали чистить его говнокод. Поэтому версия 5.5 была воспринята с одобрением, и некоторые неофициальные пользователи даже начали помышлять о приобретении. Но эйфория продлилась недолго, баги снова были найдены, и всё вернулось на круги своя.
Ознакомиться с историей спионеривания можно тут. В июле 2011 года у антивирусной компании была упёрта полная версия декомпилятора версии 6.1. TEH DRAMA!
Дебаггер, работающий на нулевом уровне, на котором можно всё. Появляется по нажатию CTRL+D, и всё остальное — программы, драйвера и даже некоторые прерывания перестают работать. Переставало идти даже «время», и задебажившийся индивид мог потом реально фалломорфировать, осознав сколько прошло времени в «реальном мире». Заодно обрубалась модемная связь, вызывая лютый багет от забытого брейкпоинта при ночном дозвоне по дайлапу. Можно трассировать что угодно: драйвер HDD, USB-антенны и т. п. А ещё там работает мышь и можно делать скрины.
SoftIce вышел на рынок как отладчик уровня ядра совершенно неожиданно для самих создателей этого ядра — MS. Позиционировался как тулза «для нахождения багов в софте», но последние весьма разнообразны: сюда можно отнести MS Office, требующий ключ активации. Немаловажное преимущество: он умеет считывать при загрузке инфу о библиотеке, в процессе отладки показывая имена, например, Kernel.FindClose+105h.
Нынче похож на свежий навоз: его уже n лет никто не обновляет. И не будет — в связи с выпилом конторы разработчиков: Numega невозбранно была проебана за 30 сребреников мудацкой Compuware. В итоге всё закончилось тотальным выпилом как нумеговских проектов, так и собственно офиса бывшей Нумеги. А остатки Девпартнера отдали какому-то ебучему реселлеру Microfocus, потому что Compuware после тотального экстерминатуса Нумеги забил на все эти ваши девпартнеры-девшмартеры болт.
WinDbg — как бы быдлокодерам, испытывающим от слова «Майкрософт» жжение в области ануса, ни было обидно, это самый популярный kernel-mode отладчик со времён смерти SoftIce. Да и в user-mode Винбэг обеспечивает лютый вин, кладя болт на эти ваши Debugging API и позволяя, например, заглянуть в native code для процесса, в который уже впилен отладчик для managed code.
Syser — китайский дебагер уровня ядра с GUI. Пришёл на смену SoftIce, загнулся в 2011, проиграв войну новым 64-битным ядрам.
OllyDbg — отладчик третьего уровня, гуишный, симпатяффный, функционала выше крыши, применим для 95 % программ, а пропатчен ручками и для всех 98%. Но из-за того, что r3 среди профессионалов считатся не труъ-тулзой, подходящей скорее для скрипткидисов, чем для разбора чего-то реально сложного, автор положил на него хуй, и теперь отладчик разрабатывают новые умельцы, пафосно назвав OllyDbg 2.0. [Отечественная разработка http://www.ollydbg.de ], хоть и менее известна, чем SoftIce, вполне кошерна и к тому же бесплатна. Релизы выглядят хреново, но парни явно набираются опыта и идут в правильном русле.
Современные быдлоязыки программирования типа Java, C# и прочего .NOT'a вовсе и не требуют для своего взлома применения дизассемблеров и отладчиков. Весь исходный код легко можно получить в считанные секунды, а если кодер — лох и не применил даже обфускацию, то полученные исходники от авторских будут отличаться разве что отсутствием комментариев в первых. Впрочем, и для обычных сишных бинарников есть декомпиляторы, правда, полудохлые и малоюзабельные. Кому интересно, смотреть здесь и вот тут.
.NET Reflector — хороший инструмент для декомпиляции программ на C# и некоторых других языках. Авторы постоянно дорабатывают своё детище, вскорости обещают декомпилировать и другие основные языки. Изначально был бесплатен, но после появления широкой аудитории стал платным, впрочем, Reflector использовали для взлома платной версии.
dotPeek — детище небезызвестной JetBrains, к моменту выхода из альфы ставшее вполне себе годным инструментом, способным конкурировать с лидерами отрасли. Декомпилирует обфусцированную лапщичку, перед которой пасует даже знаменитый и всеми любимый .NET Reflector. Ах да, программа поставляется абсолютно бесплатно.
ILSpy — свободный аналог рефлектора от разработчиков SharpDevelop. Вполне юзабелен, но остановился в развитии — все люди кинуты на новую версию SharpDevelop.
JD, JavaDec, JavaByte, Cavaj, тысячи их… — декомпиляторы для Жабы. Инструментарий тут гораздо побогаче, чем для С#, но реально хитовых тулзов не наблюдается. Впрочем, есть смысл полуркать (открытые библиотеки: так, бесплатная idea9 community edition плюс это и вот это вполне могут помочь в декомпиляции коммерческого быдлокода.
Нередко код бывает обфусцирован. Зачастую помогают деобфускаторы. Для интерпретируемых языков (за исключением perl) обычно не требуются или легко самопишутся.
Для JavaScript — JSBeautifier.
Для шарпа один из лучших — de4dot.
PETools — тулза некоего NeoX (йодмен — человек, выливший йод на хуй). Пригодна для работы с PE-форматом. Конкурент — LordPE (умеет фиксить SizeOfImage в пебе), остальное из этой серии — УГ.
RSATool — GUI-программа для прокачивания скила по RSA. Автор — эгоист из ТМГ (илита сцены, ни одного нюка). Для факторизации не годна, лучше юзать msieve.
Для борьбы с реверсингом авторы используют всяческие трюки, чтобы их творения не были доступны анализу. Чем выше жадность и хреновее функционал, тем обычно более параноидальна защита, которая в клинических случаях может даже начать мстить (удалять файлы и т. п.), если почувствует, что к её попке приближается некто с отладчиком. Интересно, что глючащая защита может сработать там, где кряком и не пахло, и тогда простому пользователю пиздецъ.
Продвинутые программы редко содержат паранойю, например, WinRar.
Быдлокодинг. Как это ни удивительно, но быдлопроги зачастую обладают естественной защитой от анализа. Cкажем, проект на Visual Basic, скомпилированный в P-code, читать гораздо труднее, чем продукт полноценного C-программера. Также сложность представляет индусский стиль программирования — быдлокодер неумело пытается защитить своё творение путём искусственного раздутия кода, хотя тот и без всякой доработки может представлять собой такую НЕХ, что даже имея оригинальные исходники, хрен поймёшь, как оно работает.
Дзен-кодинг — использование хитросплетений паттернов проектирования и вообще кодогенерации шибко «умным» программистом приводит к созданию не менее отвратительного кода, который что в сорцах хуй проссышь, что в асме.
Пакеры сжимают программы, чтобы они занимали меньше места на диске и распаковывались в памяти. Per se защитой не являются, однако в нераспакованном виде анализировать сжатую программу невозможно. Для известных пакеров лучше всего найти анпакер, который вернёт программу в более-менее исходное состояние. Известные — UPX, ASPack, MEW, PECompact, NSPack.
Обфускация — превращение исходного/промежуточного/конечного (нужное подчеркнуть) исполняемого кода в кашу, которую невозможно читать. Из исходной инструкции обфускатор делает пять (а то и сотню, в случае <del>паранойи</del> пермутации), делающих то же, что и одна, плюс ещё 200, которые вообще ничего не делают, и 28 препятствующих эмулированию или отладке. Применяется как в «хороших» программах, чтобы перенести появление кряка, так и в «плохих», типа полиморфных вирусов, стремящихся оттянуть момент своей детекции — каждая следующая копия будет непохожа на предыдущую. Олсо пытается юзаться в илитной малваре типа рустока и прочей, в расчёте на то, что антивирусные вендоры будут сосать хуйцы. Кстати, есть такой сайтик http://www.ioccc.org, где проводится конкурсы на самую запутанную программу для UNIX. Победители конкурса — истинные шедевры кодописательства и кодозапутывания. Настоятельно рекомендуются к ознакомлению.
Антиотладка — приёмы для борьбы с отладкой. Для мелкософтовского виндувса достаточно IsDebuggerPresent(). Например, уныло посмотреть поле BeingDebugged в пебе, или посмотреть значение NtGlobalFlag. Это 2 самых говнометода, илита же предпочитает еблю с rdtsc (многопроцессорные системы сосут хуйцы), ядерные сплойты и парсинг физической памяти. На каждый такой приём существует антиприём, ну и так далее. И обычно это люто, бешено глючит, бсодит, и вообще, нормальные челы не отлаживают всякую хуиту на своих компах, а заставляют давиться этим калом эмуляторы: Virtual Box, VMWare, VirtualPC и т. д.
Краденые куски — часть кода программы выпиливается, а выполнение оригинального куска выносится вовне: в протектор, на удалённый сервер, донгл и прочая. Когда хацкер делает дамп, он получает не всю программу, а лишь её часть.
Виртуальные машины — часть кода программы транслируется в байткоды другого (не обязательно реального) процессора, и добавляется транслятор, который эти байткоды хавает и выполняет. Некоторые протекторы, такие как «Темида», превращают один грамм исходного быдлокода в 1-3 десятка кило нового говна.
Протекторы — проги, которые защитят ваше творение, особо не заставляя думать — знай сиди и бросай формочки в <del>де</del>билдере. Thinstaller, RCrypt, ASProtect, EXECryptor (привет Relayer), WL/Themida… много их. Могут содержать все вышеперечисленные пункты в невозбранном количестве и в самых невероятных сочетаниях, но обычно содержат баги в реализациях PRNG/метаморфов и прочей хуиты. Кстати, большая часть самых известных протов уже отошла в мир иной-не выдержали конкуренции с пиратами!
Обращения к взломщикам внутри исполняемого файла в виде ASCII-строк - и такое встречается часто! Начиная от "«злобные дяди хакиры, ни ламайте пожалуйста маю программку, нет денег на пиво»"® до всяких «yates stilL Here kinda Ooooh» и целых анекдотов про улитку в серьезных защитах. Действуют на хакеров-ломакеров сильнее, чем все вышеперечисленные приемы, заставляя последних давиться от хохота, тем самым оттягивая дату неминуемого взлома.
1=Вечер. Автобус. Едет. На первом сиденье сидят двое. У них коэф. интеллекта IQ=180: 
- Я вчера Гамлета в оригинале читал... Такое эстетическое наслаждение...
На другом сиденье сидят ещё двое. У них IQ=140: 
- Я вчера посмотрел "Андалузского пса" и нашёл коррелят с ранними картинами Пикассо...
На другом сиденье сидят двое. У них IQ=100: 
- Мы с другом час назад посмотрели "От заката до рассвета". Как там тёлка говорит тёлке, что...
На другом сиденье сидят двое других. У них IQ=80: 
- Слышь, брат! Помнишь, какое пойло мы в мерсе пили, когда ноги какой-то б..яди торчали в окне...
А на задней площадке стоят двое с IQ=40: 
- Ну вот, вскрываю прогу твоим дебаггером...