Domanda

Io non sono informato bene per il compilatore magia.L'atto di trasformazione leggibile il codice (o il non davvero leggibile istruzioni di Montaggio) in codice macchina è, per me, la scienza del razzo combinato con la magia.

Io di circoscrivere l'oggetto di questa domanda per Win32 file eseguibili (.exe).Quando apro questi file in un specializzato spettatore, posso trovare le stringhe (di solito 16b per carattere) sparsi in vari punti, ma il resto è solo spazzatura.Suppongo che il illeggibile parte (la maggioranza) è il codice macchina (o forse le risorse, come le immagini, ecc...).

C'è qualche semplice modo di leggere il codice macchina?Aprire il file exe come un flusso di file e la lettura byte per byte, come si potrebbe trasformare questi singoli byte in Assemblea?C'è una semplice mappatura tra questi byte di istruzione e le istruzioni di Montaggio?

Come è l' .exe scritto?Quattro byte per l'istruzione?Di più?Di meno?Ho notato che alcune applicazioni possono creare file eseguibili proprio così:per esempio, in ACD see si può esportare una serie di immagini in una presentazione.Ma questo non deve essere necessariamente una presentazione SWF, ACD Vedere è anche in grado di produrre Eseguibile presentazioni.Come si fa?

Come faccio a capire cosa succede all'interno di un file EXE?

È stato utile?

Soluzione

OllyDbg è uno strumento fantastico che smonta un file EXE in istruzioni leggibili e consente di eseguire le istruzioni one by-one. Ci dice anche ciò che le funzioni API del programma utilizza e, se possibile, gli argomenti che essa offre (a patto che gli argomenti si trovano sullo stack).

In linea generale, le istruzioni della CPU sono di lunghezza variabile, alcuni sono un byte, altri sono due, un po 'di tre, circa quattro ecc Dipende in gran parte dal tipo di dati che l'istruzione si aspetta. Alcune istruzioni sono generalizzati, come "mov", che dice alla CPU per spostare i dati da un registro della CPU per un posto nella memoria, o viceversa. In realtà, ci sono molte istruzioni diverse "mov", quelle per la gestione di 8 bit, 16 bit, i dati a 32 bit, quelli per lo spostamento di dati provenienti da diversi registri e così via.

Si potrebbe prendere PC Assembly Language Tutorial del Dr. Paul Carter che è un livello libro ingresso gratuito che parla di montaggio e come la CPU Intel 386 opera. La maggior parte di esso è applicabile anche al giorno moderno consumatore CPU Intel.

Il formato EXE è specifico a Windows. Il punto di ingresso (vale a dire la prima istruzione eseguibile) si trova di solito nello stesso luogo all'interno del file EXE. E 'tutto un po' difficile da spiegare tutto in una volta, ma le risorse che ho fornito dovrebbe contribuire a curare almeno un po 'della vostra curiosità! :)

Altri suggerimenti

È necessario un disassemblatore che trasformerà il codice macchina in linguaggio assembly. Questo Wikipedia link descrive il processo e fornisce link a disassemblers liberi. Naturalmente, come dici tu che non capisci il linguaggio assembly, questo potrebbe non essere molto informativo -? Che cosa esattamente stai cercando di fare qui

Il file eseguibile che si vede è Microsofts PE formato (Portable Executable). Si tratta essenzialmente di un contenitore, che contiene dati specifici su un programma e dei dati programma stesso diviso in diverse sezioni qualche sistema operativo. Ad esempio di codice, le risorse, i dati statici sono memorizzati in sezioni separate.

Il formato della sezione dipende da ciò che è in essa. La sezione di codice contiene il codice macchina secondo l'architettura di destinazione eseguibile. Nei casi più comuni si tratta di Intel x86 o AMD-64 (lo stesso EM64T) per i binari di Microsoft PE. Il formato del codice macchina è CISC e proviene indietro al 8086 e precedenti. L'aspetto importante di CISC è che la sua dimensione di istruzione non è costante, è necessario iniziare a leggere al posto giusto per ottenere qualcosa di prezioso da esso. Intel pubblica buoni manuali sul set di istruzioni x86 / x64.

È possibile utilizzare un disassembler per visualizzare il codice macchina direttamente. In combinazione con i manuali si può intuire il codice sorgente maggior parte del tempo.

E poi c'è MSIL EXE: Gli eseguibili .NET in possesso di Microsofts Intermediate Language, questi non contengono codice specifico per il computer, ma il codice .NET CIL. Le specifiche per che sono disponibili online presso l'ECMA.

Questi possono essere visualizzati con uno strumento come riflettore.

Il contenuto del file EXE sono descritti in Portable Executable . Esso contiene il codice, dati e istruzioni a OS su come caricare il file.

C'è un 1: 1 mapping tra il codice macchina e il montaggio. Un programma disassembler eseguirà l'operazione inversa.

Non c'è un numero fisso di byte per l'istruzione su i386. Alcuni sono un singolo byte, alcuni sono molto più a lungo.

È possibile utilizzare il debug dalla riga di comando, ma è difficile.

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F

Se è come estranei a voi come sembra, non credo che un debugger o disassembler è essere di aiuto - è necessario imparare la programmazione assembler prima; studiare l'architettura del processore (un sacco di documentazione scaricabile da Intel). E poi dal momento che la maggior parte del codice macchina viene generato da compilatori, è necessario capire come i compilatori generano codice -. Il modo più semplice di scrivere un sacco di piccoli programmi e poi smontare loro per vedere che cosa il vostro C / C ++ è trasformato in

Un paio di libri che ti aiuterà a capire: -

Per avere un'idea, impostare un punto di interruzione su un codice interessante, e poi passare alla finestra CPU.

Se siete interessati in più, è più facile per compilare brevi frammenti con Free Pascal utilizzando il parametro -al.

FPC permette di emettere l'assembler generato in una moltitudine di formati Assembler (TASM, MASM, gas) utilizzando il parametro -A, e si può avere il codice pascal originale intercalate nei commenti (e più) per un facile CrossReference.

Perché è compilatore ha generato assemblatore, al contrario di assemblatore da exe smontato, è più simbolico e più facile da seguire.

Win32 formato exe su MSDN

Io suggerirei di prendere un po 'di codice sorgente di Windows C e costruire e avviare il debug in Visual Studio. Passare alla vista smontaggio e scavalcare i comandi. Si può vedere come il codice C è stato compilato in codice macchina -. E guardare funzionare passo-passo

Proprio in relazione a questa domanda, qualcuno ancora leggere le cose come CD 21?

Mi sono ricordato Sandra Bullock in uno spettacolo, in realtà la lettura di una schermata di numeri esadecimali e capire cosa fa il programma. Un po 'come la versione corrente di lettura del codice a matrice.

se leggete roba come CD 21, come si fa a ricordare le diverse varie combinazioni?

Sia la vostra curiosità e il vostro livello di comprensione è esattamente dove mi trovavo in un punto. I altamente Codice: Il linguaggio nascosto del hardware e software . Questo non rispondere a tutte le domande che fate qui, ma sarà far luce su alcuni degli aspetti magici del tutto nere di computer. E 'un libro di spessore, ma di facile lettura.

ACD Vedere è probabilmente approfittando del fatto che .I file EXE non fare l'errore controllo sulla lunghezza del file o qualsiasi cosa oltre la lunghezza del previsto porzione del file.A causa di questo, si può fare un .EXE file che aprirà le sue auto e carico di tutto, al di là di un dato punto di dati.Questo è utile perché si può poi fare una .EXE che funziona su un dato insieme di dati da soli la virata che i dati sulla fine di una scritto appositamente .EXE

(Non ho idea di che cosa esattamente ACD see è in modo da prendere con un grosso grano di sale, ma io fare so che alcuni programma vengono generati in questo modo.)

La familiarità con il montaggio a basso livello (e mi riferisco assemblaggio di basso livello, non "macro" e quel toro) è probabilmente un must. Se davvero si vuole leggere il codice macchina prima stessa direttamente, di solito si usa un editor esadecimale per questo. Per capire quali sono le istruzioni, tuttavia, la maggior parte delle persone sarebbe usare un disassembler per convertire che nelle istruzioni di montaggio appropriati. Se sei uno della minoranza che vuole comprendere il linguaggio macchina stessa, credo che ci si vuole il Manuali Intel® 64 e IA-32 Architetture dello sviluppatore di software. Volume 2 copre specificamente il set di istruzioni, che si riferisce alla query su come leggere il codice macchina stessa e come assemblaggio riferisce ad esso.

Ogni istruzione è in codice macchina conservata in una speciale area di memoria all'interno della CPU. Primi libri Intel ha concesso il codice macchina per le loro istruzioni, così si dovrebbe cercare di ottenere tali libri in modo da capire questo. Ovviamente la macchina oggi non codeis facilmente disponibili. Quanto sarebbe bello è un programma che può invertire esadecimale in codice macchina. O farlo manualmente _ !!  noioso

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