Является ли рефлексия обратным инжинирингом? - PullRequest
8 голосов
/ 11 марта 2009

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

Обратный инжиниринг на Википедия :

Обратный инжиниринг процесс обнаружения технологические основы устройства, объект или система путем анализа его структура, функции и операции.

Отражение наверняка удовлетворит как анализ структуры. Но где вы проводите грань между самоанализом и реальным инжинирингом? А с юридической точки зрения является ли реверс-инжиниринг отражений?

Ответы [ 12 ]

8 голосов
/ 11 марта 2009

Граница между ними кажется размытой. Этично я бы подвел черту в мотивации программиста.

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

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

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

6 голосов
/ 11 марта 2009

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

С таким инструментом, как .NET Reflector Я чувствую, что линии действительно начинают размываться!

Используя пример из самой SO, они недавно де-обфускацировали исходный код для своего редактора ОМУ. Я бы сказал, что это определяет реверс-инжиниринг в большей степени, чем рефлексия.

4 голосов
/ 11 марта 2009

Отражение - это просто инструмент для чтения информации из сборки, так что само по себе это не реверс-инжиниринг.

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

3 голосов
/ 11 марта 2009

Я бы сказал, что Reflection - это всего лишь инструмент. Использование отражения не обязательно означает реверс-инжиниринг.

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

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

2 голосов
/ 11 марта 2009

Я думаю, что вы говорите здесь о двух разных вещах:

  • Отражение - это техника, которую можно использовать для обратного инжиниринга (среди прочего).
  • Обратное проектирование - это действие, которое может, но не обязательно, использовать отражение для достижения своих целей.

С юридической точки зрения, это зависит от вашей цели, если вы используете отражение для целей обратного инжиниринга.

Конечно, IANAL, но я считаю, что обратное проектирование само по себе не является незаконным. Это может стать незаконной деятельностью по доверенности , т. Е. В результате нарушения авторских прав и т. Д.

2 голосов
/ 11 марта 2009

На самом деле, это полная противоположность реверс-инжинирингу.

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

Несмотря на страшные угрозы со стороны правообладателей, это совершенно законно.

«Разборка» (иначе «Отражение») - это просто действие чтения байтов на жестком диске и присвоения им значения. Это именно то, что делает процессор, когда запускает код. Здесь мы просто делаем его читаемым человеком. Опять же, несмотря на страшные угрозы со стороны правообладателей, это совершенно законно.

Продажа чужого кода (или его использование самостоятельно) таким образом, чтобы владелец авторских прав не мог получать прибыль от его работы, является незаконным, но мы не говорим об этом здесь.

2 голосов
/ 11 марта 2009

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

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

0 голосов
/ 17 октября 2009

Отражение - это общий термин в области компьютерных наук, который использовался за десятилетия до введения Microsoft .Net framework (чем SUN JVM). Идея была , а не , направленная на обратное проектирование приложения. То, что в определенных контекстах его можно использовать для этой цели, просто случайно. Как написали другие, рефлексия - это «инструмент».

0 голосов
/ 11 марта 2009

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

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

0 голосов
/ 11 марта 2009

Отражение во многих языках, таких как .NET и Java, - это исправления для плохих синтаксисов, которые не позволяют свободно взаимодействовать с объектами.

В действительно объектно-ориентированных языках, таких как Smalltak или Self, вам вряд ли когда-нибудь понадобится рефлексия, и, если нужно, она намного более мощная, чем те, что предлагаются в .NET и Java.

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

В настоящее время я много работаю с Drupal (на основе PHP), который использует такие уродливые вещи, как объединение имен модулей в предопределенные имена ловушек, чтобы найти, существует ли эта функция, поэтому ее можно вызывать позже (например, module_hook_name).

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

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

...