Domanda

Puoi scoprire molte cose sugli interni di un'applicazione attraverso la riflessione, è esposta dal .NET BCL (libreria di classi di base) e rende banale recuperare l'IL reale per qualsiasi metodo .NET.

Ingegneria inversa su Wikipedia :

  

Il reverse engineering è il   processo di scoperta del   principi tecnologici di un dispositivo,   oggetto o sistema attraverso l'analisi di   la sua struttura, funzione e funzionamento.

La riflessione sarebbe certamente soddisfacente come analisi della struttura. Ma dove traccia il confine tra introspezione e ingegneria inversa? E dal punto di vista legale, è il reverse engineering di riflessione?

È stato utile?

Soluzione

Il bordo tra i due sembra sfocato. Eticamente vorrei tracciare la linea nella motivazione del programmatore.

Se sta usando reflection per creare una libreria, uno strumento o un software simile che dovrebbe interagire con qualsiasi codice di terze parti che soddisfa determinati criteri, non lo vedrei come reverse engineering.

Ad esempio, di recente ho scritto una classe di base generica per i livelli di dati Linq2SQL. La classe base utilizza la riflessione per ottenere informazioni dettagliate sul layout del database e gestire correttamente gli aggiornamenti delle entità aziendali nidificate. Se qualcun altro usa la mia classe base per la sua applicazione web, non otterrei alcuna conoscenza del suo codice sorgente. Questo uso della riflessione non è certamente un reverse engineering.

Se, d'altra parte, il programmatore sta cercando di capire il funzionamento interno da parte del software di un concorrente usando la riflessione, lo sta retroingegnerizzando.

Altri suggerimenti

Bisogna mettere in discussione la definizione di Reverse Engineering quando la capacità di decompilare facilmente la lingua fa parte del linguaggio ala Reflection.

Con uno strumento come .NET Reflector sento che le linee iniziano davvero a sfocatura!

Utilizzando un esempio di SO stesso, hanno recentemente de-offuscato il codice sorgente per il loro editor WMD. Direi che questo definisce l'ingegneria inversa più che la riflessione.

Reflection è solo uno strumento per leggere le informazioni da un assieme, in modo che di per sé non sia il reverse engineering.

Se quindi si utilizzano queste informazioni per scoprire come è stato creato l'assembly, ad esempio utilizzando .NET reflector per produrre codice sorgente leggibile che potrebbe generare lo stesso codice IL, ovvero reverse engineering.

Direi che Reflection è semplicemente uno strumento. L'uso della riflessione non significa necessariamente ingegneria inversa.

Ad esempio, se si utilizza la riflessione per scoprire le firme di tutti i metodi pubblici e protetti in un assembly che non significherebbe il reverse engineering.

Per quanto riguarda il punto di vista legale, ti suggerisco di guardare la legge di cui sei preoccupato per trovare la definizione di reverse engineering.

Reflection è uno strumento che può essere utilizzato per molte cose, incluso il reverse engineering del codice. Reflection può essere utilizzato anche per molti altri scopi, l'implementazione di linguaggi dinamici è molto più semplice grazie ad esempio a reflection.

Anche la sola riflessione non è sufficiente per il reverse engineering. Puoi trovare informazioni sulla struttura del programma in quel modo ma devi ancora decompilare il codice. Strumenti come il riflettore aggiungono questa funzionalità.

In realtà, è l'opposto diretto del reverse engineering.

Correttamente, "reverse engineering" è guardare i risultati di un processo e lavorare all'indietro per determinare come è arrivato lì. In generale, viene eseguito senza alcuna conoscenza del codice originale e generalmente produce un processo molto diverso.

Nonostante le minacce spaventose dei detentori del copyright, è perfettamente legale.

" smontaggio " (aka "Reflection") è solo l'azione di leggere byte sul disco rigido e assegnare loro un significato. Questo è esattamente ciò che fa la CPU quando esegue il codice. Qui, lo stiamo solo rendendo leggibile dall'uomo. Ancora una volta, nonostante le minacce spaventose dei detentori del copyright, è perfettamente legale.

Vendendo il codice di qualcun altro (o usandolo tu stesso) in modo da evitare che il detentore del copyright tragga profitto dal suo lavoro, è illegale, ma non ne stiamo parlando qui.

Penso che tu stia parlando di due cose diverse qui:

  • Reflection è una tecnica che può essere utilizzata per il reverse engineering (tra le altre cose).
  • Reverse engineering è un'azione che può, ma non necessariamente deve, utilizzare la riflessione per raggiungere i suoi obiettivi.

Da un punto di vista legale, dipende dal tuo obiettivo, se stai usando la riflessione ai fini del reverse engineering.

Naturalmente IANAL, ma credo che il reverse engineering non sia illegale da solo. Può diventare un'attività illegale per procura , ovvero attraverso la violazione dei diritti d'autore ecc.

No. Con la riflessione, in genere stai solo parlando di un modo diverso di invocare i metodi o eventualmente di esaminare gli attributi del metodo.

Al contrario, mi aspetto che il prodotto del reverse engineering produca codice sorgente che posso guardare per capire gli algoritmi e le idee dell'autore, che è in genere ciò che stanno cercando di proteggere.

Le domande legali devono essere poste agli avvocati. Gli avvocati fanno pagare soldi. Non assumere avvocati può costare ancora più soldi se vieni citato in giudizio per non aver chiesto a un avvocato.

Migliore scommessa: non è necessario chiedere. Microsoft ha già rilasciato la fonte per un sacco di .NET. Vedi http://www.microsoft.com/resources/sharedsource/default.mspx.

Tutto dipende dalla misura in cui rifletti. Se usi uno strumento come Reflector , o codifichi qualcosa del genere, allora sarebbe un reverse engineering dato che stai effettivamente arrivando al codice sorgente.

Reflection può essere usato per invocare metodi o guardare attributi come ha detto Don, ma può anche essere usato per analizzare la struttura di un assembly e persino sbirciare all'interno del codice MSIL sottostante. Quindi un uso della riflessione potrebbe essere innocente e uno sarebbe il reverse engineering.

Reflection è un termine generale di informatica che era in uso decenni prima l'introduzione del framework Microsoft .Net (rispetto a SUN JVM). L'idea non era non finalizzata all'ingegnerizzazione delle applicazioni. Che in contesti specifici possa essere utilizzato per questo scopo è solo accidentale. Come altri hanno scritto, la riflessione è uno "strumento".

La riflessione in molti linguaggi come .NET e Java sono patch per sintassi inadeguate che non consentono di interagire liberamente con gli oggetti.

In linguaggi veramente orientati agli oggetti come Smalltak o Self, non hai quasi mai bisogno di riflessione e, se necessario, è di gran lunga più potente di quelli offerti da .NET e Java.

Detto questo, credo che la riflessione sia il reverse engineering, considerando che RE è più come capire il codice per fare qualcosa con esso piuttosto che rompere le protezioni degli altri.

Attualmente sto lavorando molto con Drupal (basato su PHP), che usa cose brutte come concatenare i nomi dei moduli a nomi di hook predefiniti per scoprire se esiste quella funzione, quindi può essere chiamata in seguito (ad esempio module_hook_name).

È molto utile, ma credo nei linguaggi OO reali che possono essere evitati classificando una sottoclasse di una classe astratta in grado di rispondere a qualsiasi messaggio e le sottoclassi potrebbero ignorarla.

La riflessione non dovrebbe essere usata se non per circostanze estreme, dove è possibile vedere i difetti dei linguaggi di programmazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top