2011-11-19 10 views

risposta

9

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).

2
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 ; 
1

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.

+0

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

Problemi correlati