Domanda:
Differenza tra Win7 e Win8 PE loader?
Lars Brinkhoff
2015-12-18 18:36:53 UTC
view on stackexchange narkive permalink

È noto quali sono le differenze tra il caricatore PE di Windows 7 e Windows 8?

Sto cercando di creare a mano un semplice file immagine PE eseguibile. Funziona bene in Windows 7, ma viene rifiutato da Windows 8.

Il file è collegato qui: http://lars.nocrew.org/tmp/W7-ok.exe

  Dumper Microsoft (R) COFF / PE Versione 8.00.50727.762 Dump del file W7-ok.exePE firma trovata Tipo di file: VALORI DI INTESTAZIONE FILE DI IMMAGINE ESEGUIBILI Macchina 14C (x86) 0 numero di sezioni 0 tempo data stamp Thu Jan 01 00:00:00 1970 0 puntatore di file alla tabella dei simboli 0 numero di simboli E0 dimensione dell'intestazione opzionale 10F caratteristiche Rilocazioni eliminate Eseguibile Numeri di riga eliminati Simboli eliminati Word machine a 32 bit VALORI INTESTAZIONE OPZIONALE 10B magic # (PE32) 0.00 linker versione 0 dimensione del codice 0 dimensione dei dati inizializzati 0 dimensione dei dati non inizializzati 24C punto di ingresso (0040024C) 0 base del codice 0 base di dati 400000 immagine base (da 00400000 a 0040025B) 4 allineamento sezione 4 allineamento file 0.00 versione sistema operativo 0.00 versione immagine versione 4.00 sottosistema 0 versione Win32 25C dimensione dell'immagine 230 dimensione delle intestazioni 0 checksum 3 sottosistema (Windows CUI) 0 caratteristiche DLL 0 dimensione della riserva dello stack 0 dimensione del commit dello stack 0 dimensione della riserva dell'heap 0 dimensione del commit dell'heap 0 flag del caricatore 2 numero di directory 0 [0] RVA [dimensione] della directory di esportazione 1B8 [0] RVA [dimensione] del riepilogo della directory di importazione  
Una risposta:
peter ferrie
2015-12-25 00:02:49 UTC
view on stackexchange narkive permalink

La differenza è che Windows 8 richiede che tutte le strutture regolari (esportazioni, importazioni, TLS, gestori di eccezioni, rilocazioni ... cioè, tutto ciò che viene descritto dalle voci della directory dei dati) si trovi interamente all'interno di una sezione. L'unica eccezione è la Bound Import Table, che viene memorizzata esternamente a qualsiasi sezione, per evitare di "inquinare" i contenuti, poiché i dati della Bound Import Table vengono scartati dopo l'uso. La Bound Import Table è priva di significato anche in presenza di ASLR, comunque, poiché gli indirizzi non corrisponderanno quasi mai.

In assenza di qualsiasi sezione, devi trovare le basi DLL e risolvere le importazioni da solo.

Se crei una singola sezione per contenere la tabella di importazione, verrà caricata in entrambi gli ambienti.

Ho aggiunto una singola sezione .text per contenere tutto il codice, i dati e la tabella di importazione. Devo ancora provarlo in Windows 8.
Ora ho verificato che questo risolve il problema in Windows 8.
Inoltre ha dovuto aumentare il numero di directory di dati da 2. 16 funziona, sebbene tutti i puntatori ad eccezione dello IAT siano 0.
sì, ho trascurato il conteggio. Deve essere almeno 13, per coprire la directory IAT che viene controllata anche dal caricatore.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...