Domanda

Quindi, è un decompilatore davvero una cosa che dà dà la fonte di un / piece compilato interpretato di codice? Perché per me che sembra impossibile. Come si potrebbe ottenere i nomi delle funzioni, le variabili, classi, ecc, se è stato compilato. O sto interpretando male la definizione? Come funziona? E qual è il principio generale alla base facendo uno?

È stato utile?

Soluzione

Hai ragione sulla tua definizione di un decompilatore: ci vuole un'applicazione compilata e produce codice sorgente per partita. Tuttavia, lo fa non nella maggior parte dei casi conoscono il nome e la struttura delle variabili / funzioni / classi - è solo supposizioni. Esso analizza il flusso del programma e cerca di trovare un modo per rappresentare che il flusso attraverso un determinato linguaggio di programmazione, in genere C. Tuttavia, poiché il linguaggio di programmazione di scelta (C, in questo esempio) è spesso a un livello superiore a quello dello Stato del programma sottostante (un binario eseguibile), alcune parti del programma potrebbe essere impossibile rappresentare con precisione; in questo caso, il decompilatore fallirebbe e si avrebbe bisogno di usare un disassembler. Questo è il motivo per cui molte persone amano offuscare il loro codice:. Lo rende molto più difficile per decompilers per aprirlo

Costruire un decompilatore non è un compito semplice. In sostanza, si deve prendere l'applicazione che si sta decompilazione (sia esso un file eseguibile o qualche altra forma di applicazione compilata) ed analizzarlo in una sorta di albero è possibile lavorare con in memoria. Si potrebbe quindi analizzare il flusso del programma e cercare di trovare schemi che potrebbero suggerire che una dichiarazione if / variabile / funzione / etc è stato utilizzato in una certa posizione nel codice. E 'tutto davvero solo un gioco indovinare:. Dovreste conoscere i modelli che il compilatore fa in codice compilato, quindi cercare quei modelli e sostituirle con il codice sorgente equivalente leggibile

Questo è tutto molto più semplice per i programmi di più alto livello come Java o .NET, in cui non si ha a che fare con istruzioni di montaggio, e le cose come le variabili sono per lo più curato per voi. Lì, non c'è bisogno di indovinare quanto appena direttamente tradurre. Si potrebbe non avere nomi esatti / metodo variabile, ma si può almeno dedurre la struttura del programma abbastanza facilmente.

Disclaimer: Non ho mai scritto un decompilatore e, quindi, non so tutti i dettagli di quello che sto parlando. Se siete veramente interessati a scrivere un decompilatore, si dovrebbe ottenere un libro sull'argomento.

Altri suggerimenti

Un decompilatore prende fondamentalmente il codice macchina e ritorna di nuovo al linguaggio che è stato formattato. Se non mi sbaglio, credo che le esigenze Decompiler di sapere che lingua è stato compilato, altrimenti non funzionerà.

Lo scopo fondamentale del decompilatore è quello di tornare al codice sorgente; per esempio, una volta il mio file Java ha danneggiato e l'unica cosa che ho potuto così di riportarlo era utilizzando un decompilatore (dal momento che il file di classe non è stato danneggiato).

Funziona dedurre una rappresentazione "ragionevole" (sulla base di alcuni euristica) di ciò che è nel codice oggetto. Il grado di somiglianza tra ciò che produce e quello che era originariamente non tende a dipendere pesantemente su quante informazioni sono contenute nel binario inizia da. Se si inizia con fondamentalmente un binario "puro", è generalmente bloccato con solo che compongono i nomi di "ragionevoli" per le variabili, come l'utilizzo di cose come i, j e k per gli indici di loop, e nomi più lunghi per la maggior parte degli altri.

D'altra parte, un linguaggio che supporti le esigenze introspezione per incorporare una grande quantità ulteriori informazioni sui nomi delle variabili, tipi, ecc, nel file eseguibile. In un caso come questo, decompilazione può produrre qualcosa di molto più vicino a quello originale, come ad esempio in genere mantenendo i nomi originali di funzioni, variabili, ecc In tal caso, il decompilatore può spesso produrre qualcosa di molto simile all'originale - forse perdendo poco più di formattazione e commenti

.

Questo dipende da quale lingua si sta decompilazione. Se si decompilazione qualcosa come C o C ++, quindi le uniche informazioni fornite a voi è nomi delle funzioni e argomenti (in DLL). Se avete a che fare con Java, quindi il compilatore di solito inserisce numeri di riga, i nomi delle variabili, campo e nomi dei metodi, e così via. Se non ci sono nomi di variabili, allora si otterrebbe nomi come localInt1, localInt2, localException1. O qualunque sia il compilatore è. E può dire la spaziatura tra le righe, a causa dei numeri di riga.

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