Ho bisogno della dimensione del byte, IMAGE_OPTIONAL_HEADER.SizeOfImage sembra arrotondato al limite (non sicuro) ed è maggiore della dimensione reale del file.Come faccio a determinare la dimensione esatta del file immagine PE usando la sua intestazione?
risposta
IMAGE_OPTIONAL_HEADER.SizeOfImage
è la dimensione del file eseguibile/dll caricato nella memoria virtuale. Non è uguale alla dimensione del disco.
È possibile calcolarlo con VirtualAddress + VirtualSize
dell'ultima sezione.
IMAGE_OPTIONAL_HEADER.SizeOfImage
è il valore arrotondato al valore di IMAGE_OPTIONAL_HEADER.SectionAlignment
(in genere uguale alla dimensione della pagina).
if(LastSectionVirtualSize >= LastSectionSizeOfRawData)
{
if(LastSectionVirtualSize % LastSectionSectionAlignment)
{
TempValue = LastSectionVirtualSize - (LastSectionVirtualSize % LastSectionSectionAlignment) + LastSectionSectionAlignment ;
}
else
{
TempValue = LastSectionVirtualSize ;
}
}
else
{
if(LastSectionSizeOfRawData % LastSectionSectionAlignment)
{
TempValue = LastSectionSizeOfRawData - (LastSectionSizeOfRawData % LastSectionSectionAlignment) + LastSectionSectionAlignment ;
}
else
{
TempValue = LastSectionSizeOfRawData ;
}
}
OH.SizeOfImage = TempValue + dwLastSecRVA ;
In realtà, la risposta accettata non è corretta. Per ottenere le dimensioni dell'eseguibile su disco, è necessario calcolare PointerToRawData
+ SizeOfRawData
dell'ultima sezione, non le controparti virtuali. Per un esempio vedere http://www.strchr.com/creating_self-extracting_executables
Si noti inoltre che alcuni compilatori amano aggiungere le informazioni di debug dopo l'ultima sezione. Assicurati di togliere le tabelle dei simboli o imposta la modalità di rilascio, a seconda del compilatore che usi, affinché funzioni.
Ho trovato alcune cose * al di fuori * di sezioni come la tabella dei certificati, dare un'occhiata a KERNEL32.DLL per esempio, la sezione di riposizionamento termina seguita dalla tabella dei certificati, così come anch'io avrei controllare la tabella della directory dei dati. – Lloyd