2009-03-11 21 views
8

È possibile trovare molte informazioni sugli aspetti interni di un'applicazione tramite la riflessione, è esposto da .NET BCL (libreria di classi base) e rende banale il recupero dell'IL reale per qualsiasi metodo .NET.Riflessione inversa?

ingegneria inversa su Wikipedia:

ingegneria inversa è il processo di scoperta dei principi tecnologici di un dispositivo, oggetto o dal sistema tramite analisi della sua struttura, la funzione e il funzionamento.

La riflessione avrebbe certamente soddisfatto come analisi della struttura. Ma dove tracci la linea tra l'introspezione e l'effettivo reverse engineering? E da un punto di vista legale, la riflessione è il reverse engineering?

risposta

8

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

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

Ad esempio, stavo scrivendo di recente 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 di basi per la sua applicazione web, non acquisirò 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 di un software della concorrenza utilizzando la riflessione, lo sta decodificando.

+1

Grazie Adrian, chiaramente riflessione è strumento deve essere utilizzato per molte cose non reverse engineering. Se miri a ottenere dettagli espliciti su un software della concorrenza, la riflessione sicuramente aiuta in questo. –

0

No. Con la riflessione, di solito stai solo parlando di un modo diverso di invocare metodi, o possibilmente guardando gli attributi del metodo.

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

6

Si deve mettere in discussione la definizione di Reverse Engineering quando la capacità di decompilare facilmente la lingua è una parte del linguaggio ala Reflection.

Con uno strumento come .NET Reflector mi sento come se le linee iniziassero davvero a sfocare!

Utilizzando un esempio di SO stesso, recentemente de-obfuscated the source code per l'Editor WMD. Direi che questo definisce Reverse Engineering molto più di quanto fa Reflection.

+0

Hai provato il plug-in di esportazione per Reflector? L'ho usato per salvare progetti dai quali ho perso il codice sorgente. Funziona quasi in modo impeccabile. –

0

Le domande legali devono essere rivolte agli avvocati. Gli avvocati fanno pagare soldi. Gli avvocati non assoldati possono costare ancora più denaro se vieni denunciato per non aver chiesto un avvocato.

Scommessa migliore: non è necessario chiedere. Microsoft ha già rilasciato la fonte per molti .NET. Vedi http://www.microsoft.com/resources/sharedsource/default.mspx.

-2

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

In linguaggi realmente orientata agli oggetti come Smalltalk o Sé, è quasi mai bisogno di riflessione e, se necessario, è di gran lunga più potenti di quelli offerti da .NET e Java.

Detto questo, credo che la riflessione sia ingegneria inversa, 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 ai nomi di hook predefiniti per trovare se tale funzione esiste, quindi può essere chiamata più tardi (ad esempio module_hook_name).

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

Riflesso non deve essere utilizzato ad eccezione di circostanze estreme, che è dove si possono vedere difetti dei linguaggi di programmazione.

+2

Risposta tendenziosa. La riflessione comporta un costo (nel tempo della CPU, nella memoria, nella complessità del linguaggio): in Smalltalk o Self non ne sei a conoscenza. Inoltre, non sembra di capire che cosa i metadati di riflessione viene utilizzato per, come il commento sottoclassi indica. –

+0

Capisco; Preferirei dire che non hai capito il mio punto: la riflessione è una pessima patch per fare cose che dovresti essere in grado di fare con un buon linguaggio. Il mio commento sulla sottoclasse è stato solo un esempio. – Seb

0

Tutto dipende dalla misura in cui si prende la riflessione. Se utilizzi uno strumento come Reflector o esegui autonomamente un codice simile, sarebbe il reverse engineering come se si stesse arrivando al codice sorgente.

Reflection può essere utilizzato per invocare metodi o esaminare attributi come detto da Don, ma può anche essere utilizzato per analizzare la struttura di un assembly e persino per dare un'occhiata al codice MSIL sottostante. Quindi un solo uso della riflessione potrebbe essere innocente e uno sarebbe il reverse engineering.

2

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

La riflessione da sola non è sufficiente per il reverse engineering. È possibile trovare informazioni sulla struttura del programma in questo modo ma è ancora necessario decompilare il codice. Strumenti come il riflettore aggiungono questa funzionalità.

2

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

Correttamente, il "reverse engineering" è quello di esaminare i risultati di un processo e lavorare all'indietro, per determinare come è arrivato. Generalmente, è fatto senza alcuna conoscenza del codice originale e generalmente produce un processo molto diverso.

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

"Disassembly" (ovvero "Reflection") è solo l'azione di leggere i byte sul disco rigido e assegnare loro un significato. Questo è esattamente ciò che fa la CPU quando esegue il codice. Qui, lo stiamo semplicemente rendendo leggibile. Di nuovo, nonostante le paurose minacce dei detentori del copyright, è perfettamente legale.

Vendere il codice di qualcun altro (o usarlo da solo) in un modo che eviti al titolare del copyright di trarre profitto dal suo lavoro, è illegale, ma non stiamo parlando di questo qui.

+0

La riflessione sicuramente aiuta, non direi che è l'esatto contrario, ma non è correlato alla comprensione dell'assemblaggio X86. –

+0

"Nonostante le minacce spaventose dei detentori del copyright, è perfettamente legale." - Ora come non-americano ho sentito parlare del DMCA americano che, a quanto ho capito, lo rende illegale? L'esempio chiave che ricordo fu un tizio che decodificò il driver nVidia per Mandrivia (quindi Mandrake) non poteva entrare in America come sarebbe stato arrestato sotto di esso? Sto fraintendendo il DMCA? –

+0

Beh no, Reflection (http://en.wikipedia.org/wiki/Reflection_%28computer_science%29) è più che un semplice smontaggio. – MaD70

3

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

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

Come per un punto di vista legale, Vi suggerisco di avere a guardare la legge siete preoccupati per trovare la definizione di reverse engineering.

4

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

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

2

penso che si sta parlando di due cose diverse qui:

  • riflessione è una tecnica, che può essere utilizzato per il reverse engineering (tra le altre cose).
  • reverse engineering è un'azione che può, ma non deve necessariamente, l'uso di riflessione per il raggiungimento dei suoi obiettivi.

Da un punto di vista legale, dipende dal tuo obiettivo, se stai utilizzando la riflessione a scopo di reverse engineering.

Naturalmente IANAL, ma credo che il reverse engineering non è illegale di per sé. Si può diventare un'attività illegale per delega, vale a dire attraverso la violazione dei diritti d'autore, ecc

0

Reflection è un termine generale di informatica che era in uso decenni prima che l'introduzione di Microsoft .NET Framework (di SUN JVM). L'idea era non finalizzata al reverse engineering dell'applicazione. Che in contesti specifici può essere usato per questo scopo è solo accidentale. Come altri hanno scritto, la riflessione è uno "strumento".