PDA

View Full Version : سوال در مورد فایلهای pe



شبیر کریمی
شنبه 30 مرداد 1389, 11:38 صبح
سلام کسی میدونه چرا باید بعد از map کردن فایلهای pe با وجود اینکه با استفاده از RVA میتونیم به داده های درون فایل مثلا ImportDirectory دسترسی داشته باشیم باید این RVA رو تبدیل به Offset کنیم؟

مثلا بعد از بدست آوردن RVA زیر باید اونو تبدیل به File Offset کنیم؟

DWORD dwImportDirectory= RVA2Offset(pImageBase, pimage_nt_headers->

OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].

VirtualAddress);

lord_viper
پنج شنبه 04 شهریور 1389, 23:42 عصر
چون فایل pe اولا از ادرس ایمیج بیس لود میشه و اینکه هرسکشن در مکان خاصی از حافظه لود میشن بر مبنای alignment خاص و RVAها هم بر همین اساس هستن که در فایل PEبرمبنای fileAlignmentبوده برای همین صرف map کردن کافی نیست

شبیر کریمی
جمعه 05 شهریور 1389, 23:02 عصر
حالا فرض كنيد كه بخوام توابع Import شده ماژول خودم رو بدست بيارم و چون توسط خود لودر ويندوز لود شده(بطور دستي مپ نشده) پس آدرس هاي rva درونش بايد درست باشه و ديگه نيازي به تبديل به آفست فايل نداشته باشيم(البته مطمئن نيستم كه اينطوري باشه) و اين كد رو نوشتم ولي جواب نميده:

var
PDOS:PImageDosHeader;
pnt:PImageNtHeaders;
base:dword;
PImportDescriptor:PIMAGE_IMPORT_DESCRIPTOR;
PThunk:PIMAGE_THUNK_DATA;
PImportByName:PIMAGE_IMPORT_BYNAME;
begin
base:=GetModuleHandle(0);
pdos:=PImageDosHeader(base);
pnt:=PImageNtHeaders(base+pdos._lfanew);
datadirectory:=pnt.OptionalHeader.datadirectory[1].VirtualAddress;
PImportDescriptor:=PIMAGE_IMPORT_DESCRIPTOR(base+d atadirectory);
PThunk:=PIMAGE_THUNK_DATA(Base+PImportDescriptor.F irstThunk);
Name:=Pchar(Dword(Pthunk.IMportByName.name[0])+Base);

end;

و انتظار داشتم كه نام اولين تابع از اولين dll درون name قرار بگيره اما خطا ميده و برنامه متوقف ميشه .
ميشه بگين كجاها اشباه كردم؟

lord_viper
شنبه 06 شهریور 1389, 22:56 عصر
شما باید چک کنین اولین ایتم valid هست یا نه
مقادیر باید مخالف nilباشه


PThunk:=PIMAGE_THUNK_DATA(Base+PImportDescriptor.F irstThunk);
if PThunk<>nil then
Name:=Pchar(Dword(Pthunk.IMportByName.name[0])+Base);