نقل قول: سوال در مورد فایلهای pe
چون فایل pe اولا از ادرس ایمیج بیس لود میشه و اینکه هرسکشن در مکان خاصی از حافظه لود میشن بر مبنای alignment خاص و RVAها هم بر همین اساس هستن که در فایل PEبرمبنای fileAlignmentبوده برای همین صرف map کردن کافی نیست
نقل قول: سوال در مورد فایلهای pe
حالا فرض كنيد كه بخوام توابع 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 قرار بگيره اما خطا ميده و برنامه متوقف ميشه .
ميشه بگين كجاها اشباه كردم؟
نقل قول: سوال در مورد فایلهای pe
شما باید چک کنین اولین ایتم valid هست یا نه
مقادیر باید مخالف nilباشه
PThunk:=PIMAGE_THUNK_DATA(Base+PImportDescriptor.F irstThunk);
if PThunk<>nil then
Name:=Pchar(Dword(Pthunk.IMportByName.name[0])+Base);