|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
File [EXE] come è fatto?
Salve raga, vorrei sapere se qualcuno di voi ha qualche guida semplice o appunto o qualcosa del genere in modo che io capisca bene o male come è fatto un file exe e in maniera un po' più approfondita sulle "Import Table" e "Export Table"..
Ho cercato un po' in rete ma ho trovato solo guide non semplici in inglese.. e qualcosa in italiano ma che in linea di massima per uno che come me non ne sa niente di queste cose.. sono a dir poco incomprensibili.. Grazie anticipate per l'aiuto.. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Vai su www.wotsit.org e cerca l'estensione exe. Ci troverai diversi documenti.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
Grazie.. ho scaricato questo --> Portable Executable Format [Micheal J. O'Leary]
..però il mio problema è che ho dei vuoti su dei concetti di base.. ma non posso nemmeno sapere tutto sennò non ci levo le gambe.. |
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
di' cos'è che non conosci e chi può ti darà un'infarinatura e qualche buon link a MSDN. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
Per ora ho trovato un link dove si tratta l'argomento PE in italiano.. vedo di dare una lettura a quello prima di porre altre domande in modo da vedere se alcune di esse riesco ad evitarle..
Grazie della disponibilità.. tornerò tra qualche giorno.. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
Ho dato un po' una lettura a questo file di testo, sono arrivato alle import table e viene fatto l'esempio con notepad.exe.. Intanto l'esempio non corrisponde a quello che faccio io.. cioè, lui dice che RVA è 00006000 e invece a me viene 00007604... quindi lui dice che sono già allineati e invece non è così.. e non capisco come si faccia l'allineamento dato che non lo spiega.. inoltre poi con il debugger vengono mostrate le dword a gruppi di 5 e dice che la prima dword riguarda una unoin: IMPORT FLAGS or OriginalFirstThunk e il valore di questo punta a un indirizzo che contiene le funzioni importate.. ma io non lo trovo sul debugger..
Sapete niente in merito? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Se hai un Visual C++ puoi usare l'utility DUMPBIN. Esempio:
DUMPBIN /HEADERS NOTEPAD.EXE Può essere molto utile per verificare i valori reali contenuti nei vari header.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#9 | |||||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
Quote:
Quote:
Quote:
tu vai a consultare la IAT originale, ok? leggi la prima entry; leggi il primo DWORD della prima entry; quel DWORD ti da tutte le informazioni necessarie per trovare il nome oppure la hint di quella funzione (non sempre le funzioni vengono importate "by name"). dopodiché, vuoi sapere il nome o la hint dell'N-esima funzione importata? fai la stessa cosa per l'N-esima entry della IAT. deve funzionare per forza, se non va avrai sbagliato qualcosa. |
|||||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
Scusate raga.. ma se non ho un esempio che posso seguire per rifare i vari step col pc.. per me è arabo..
Grazie per le risposte... ma sarà dura per me capire sta roba, non mollerò, ma non sarà semplice... |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
C'ho ripensato
Tanto per cominciare mi serve una cavia adatta: qual'è un file con una IT semplice che abbiamo tutti? il Notepad.exe! Andiamo nella Directory Table e per la IT troviamo: Import table: RVA: 00006000 SIZE: 8C quindi abbiamo indirizzo e grandezza. Ora 6000 è un RVA, quindi col FLC andiamocelo a convertire in raw offset, ed otteniamo... 6000 (allineamento perfetto). B0 61 00 00 - ED 6C 45 37 - FF FF FF FF - 8A 65 00 00 F0 63 00 00 - 18 61 00 00 - B3 C2 1F 37 - FF FF FF FF 9C 67 00 00 - 58 63 00 00 - CC 61 00 00 - EB 6C 45 37 FF FF FF FF - 92 6B 00 00 - 0C 64 00 00 - B8 60 00 00 72 C2 3E 35 - FF FF FF FF - F6 6C 00 00 - F8 62 00 00 C0 62 00 00 - ED 6C 45 37 - FF FF FF FF - 7A 6D 00 00 00 65 00 00 - A0 60 00 00 - EB 6C 45 37 - FF FF FF FF DA 6D 00 00 - E0 62 00 00 - 00 00 00 00 - 00 00 00 00 00 00 00 00 - 00 00 00 00 - 00 00 00 00 questi sono i 140 (8Ch) bytes. Per ora non compaiono nomi di funzioni o dll. Partiamo dalla Directory Table, che come al solito contiene le informazioni sulla IT stessa. Dobbiamo prendere in considerazione le prime 5 dwords, che ci identificano i seguenti valori: _____________________________________________________________________________ VALORE: | DWORD NELLA IT DI ESEMPIO | --------------------------------------------+-------------------------------+ Union: IMPORT FLAGS or OriginalFirstThunk | B0 61 00 00 | TIME/DATE STAMP | ED 6C 45 37 | FORWARDER CHAIN | FF FF FF FF | NAME RVA | 8A 65 00 00 | IMPORT ADDRESS TABLE RVA (FirstThunk) | F0 63 00 00 | --------------------------------------------+-------------------------------+ anche le dword successive vanno considerate a gruppi di 5, compreso l'ultimo gruppo di 5 dwords che serve per chiudere la Directory dell'IT. ()- Import Flags Questo dovrebbe rientrare nel campo "characteristics", ma in realtà la dword è una union tra il valore Characteristics e OriginalFirstThunk. Essendo il campo characteristics sempre a zero, la dword contiene il valore dell'OriginalFirstThunk, 000061B0, che punta alla struttura degli indirizzi ai nomi delle funzioni importate: 7A 65 00 00 - 68 65 00 00 - 20 65 00 00 - 4E 65 00 00 3C 65 00 00 - 2E 65 00 00 - 00 00 00 00 questi valori dunque puntano ai nomi delle funzioni (la NULL indica il termine della struttura), e questi indirizzi di nomi faranno parte degli OriginalFirstThunk (ne parleremo dopo). E le Characteristics? La union è come una struttura, solo che i membri di tale struttura possono essere utilizzati solo uno alla volta. Quindi il la union in questione può contenere O le characteristics O OriginalFirstThunk. Notate che sono 6 funzioni importate, e che l'ordine dei loro nomi non coincide con l'ordine dei loro puntatori (cosa che noterete se andate a vedere l'IT dal PEditor). In realtà questi indirizzi sono dei puntatori ad altre strutture, cioè: Struttura IMAGE_IMPORT_BY_NAME: word HINT byte NAME1 infatti prendiamo ad esempio il primo puntatore, 0000657A, punta alla stringa: 0000657A 6C 00 53 68 65 6C 6C 45 78 65 63 75 74 65 41 00 l.ShellExecuteA in cui i primi due byte sono la word HINT (006C) che rappresenta l'indice della funzione nell'ET della dll da cui stiamo importando la funzione, e poi il nome vero e proprio, ShellExecuteA in forma di array di byte terminati dallo 0. |
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
scusa ma sei sicuro di aver preso la entry giusta nella Import Directory Table? :|
e poi guarda che hai sicuramente fatto confusione tra la Import Address Table e la Import Directory Table: il primo dump che hai riportato hai detto che era una IAT, mentre invece è sicuramente una IDT. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
A me hanno detto di imparare bene le IAT... ma a sto punto non so nemmeno la differenza...
|
|
|
|
|
|
#15 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
in parole povere funziona così: in teoria ci stanno tante IAT e una sola IDT; la IDT è quella che va letta per prima e nella quale ogni entry descrive una IAT. ciascuna entry della IDT (assieme alla corrispettiva IAT) descrive le importazioni da un determinato modulo (ad esempio tu in un tipico exe per Windows avrai nella IDT una entry per kernel32.dll, una per user32.dll, una per gdi32.dll, e cos' via, e avrai altrettante IAT). questa è la teoria, ma alla fine nella pratica tutte le varie IAT sono messe una appresso all'altra in modo da formare un'unica grossa IAT il cui RVA sta anche scritto in un campo dell'header opzionale (tra le Data Directories
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
Grazie 71104...
In pratica ho capito che dumpando il codice si sfasano le IAT per cui è necessario fare l'allineamento per farle tornare in modo che il programma funzioni.. potete per piacere approfondirmi questo concetto? |
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
intendevi dire che l'RVA della tua IAT non corrisponde al suo offset nel file? ok, ma ribadisco che non vedo quali problemi ti creino gli RVA che non corrispondo agli offset: basta saperlo... |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
Sinceramente devo capirlo anch'io...
vabbè.. allora andiamo per gradi sennò faccio solo confusione: - per "offset" cosa si intende in pratica? |
|
|
|
|
|
#19 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 706
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:40.



















