воскресенье, 8 мая 2011 г.

Для самых маленьких. Реверс-инжиниринг


Работа над очередным переводом поста Марка Руссиновича обозначила необходимость создания нового поста в рубрику «Для самых маленьких». Лично я очень люблю эту рубрику: зачастую мы мало времени уделяем основам, а потом, как результат, говорим на разных языках, вкладывая в одни и те же термины совершенно разные значения. А знание терминов, я отношу к базовым знаниям предметной области.

Часто, принимая экзамен, хочется для себя уяснить, а что же этот человек знает или он вообще хоть что-то знает, и спрашиваешь терминологию…

IT область сейчас не относится к областям знаний и деятельности, в которых цена ошибки – жизнь, но грамотный специалист должен владеть терминологией безукоризненно.

Итак, сегодня у нас на повестке дне вопросы, связанные с обратной инженерией. Интересно? Тогда – поехали:

Обра́тная разрабо́тка (обратный инжиниринг, реверс-инжиниринг; англ. reverse engineering) — исследование некоторого устройства или программы, а также документации на него с целью понять принцип его работы и, чаще всего, воспроизвести устройство, программу или иной объект с аналогичными функциями, но без копирования как такового.

Вопрос плагиата оставляем за кадром. Как говорит одни из моих учителей: «Если ты скопировал и вставил, не читая, - это плагиат, а если прочитал, осмыслил, изложил своими словами – это уже уровень курсовой работы».

Суть реверс-инжиниринг в программировании – взять готовую программу и получить ее исходный код - так называемый листинг.

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

Поехали дальше: надеюсь, все знают, какой путь проходит код прежде чем стать рабочей программой. В общих чертах такой: код на языке высокого уровня – код на языке низкого уровня - машинный код – готовая программа. Здесь меня можно поправлять и уточнять, но у нас другая цель. Понять что программа – набор команд на понятном данному процессору языке. Едем дальше: понятный процессору язык – ассемблер. То есть, имея на руках экземпляр рабочей программы можно добыть код этой программы на ассемблере. Как?


Дизассемблер
— транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера.

Что делать с листингом на ассемблере? – изучать, и понимать, что делает каждый программный модуль. Страшно? А кто говорил, что будет легко.




  • Автоматические
  • Интерактивные

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

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

Прозвучал термин «транслятор». В данном посте определим его просто: транслятор – программное средство, позволяющее переводить код программы, написанной на более высоком уровне, в код более низкого уровня. И так по цепочке, до машинного кода.

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

Комментариев нет:

Отправить комментарий