windows - Behov for flytninger i en exe

Indlæg af Hanne Mølgaard Plasc

Problem



Hvorfor er der behov for flytningstabel, når hvert element i en exe er i en relativ forskydning fra billedets base? Jeg mener selv om billedet bliver afvist af en positiv modsætning på 0x60000, hvorfor er der til flytningstabel, da vi alligevel ville bruge RVA'er, som ville være i forhold til den nye base?

Bedste reference


Pointen er, at koden ikke får adgang til globals (globale variabler og funktionsadresser) via RVA eller overhovedet. De er tilgængelige via deres absolutte adresse. Og denne adresse skal ændres, hvis den eksekverbare ikke blev indlæst på den foretrukne adresse.


Flyttetabellen består af nøjagtigt af disse steder. Det er en tabel over alle de steder, der skal justeres af forskellen mellem den faktiske basisadresse og den foretrukne.


BTW, EXE'er, i modsætning til DLL'er normalt don 't indeholder flytningstabeller. Dette skyldes, at de er det første modul, der skal kortlægges i adressepladsen, derfor kan de altid indlæses på deres foretrukne adresse . Situationen er forskellig for DLL'er, som normalt indeholder flytningstabeller.


P. S. I Windows 7 kan EXE indeholde flytningstabel, hvis de foretrækker at blive indlæst i tilfældig adresse. Det er en sikkerhedsfunktion (ynkelig IMHO)





Det skal nævnes, at funktionsadresser ikke altid er tilgængelige med deres absolutte værdi. På x86-forgreningsinstruktioner (som jmp, call og etc.) har et 'kort' format, som virker med den relative forskydning. Sådanne steder behøver ikke at nævnes i flytningstabellen.

Andre referencer 1


For en EXE-fil er der ikke behov for flytningstabellen, fordi det eksekverbare billede altid er indlæst på den foretrukne adresse. Flyttetabellen kan sikkert fjernes.