PDA

View Full Version : استخراج توابع import table از فایل PE



alamdar_761
چهارشنبه 16 بهمن 1392, 23:12 عصر
سلام دوستان
من میخوام توابع import table را از یک فایل PE استخراج کنم
و تا یه جاهایی پیش رفتم اما تو یک قسمت گیر کردم
کدها را یه نگاهی بندازین


var
hfile:dword;
idh:TImageDosHeader;
inh:TImageNtHeaders;
iid:TImageImportDescriptor;
idd:TImageImportByName;
dwread:dword;
begin
hfile:=createfile(pchar(edit1.Text),GENERIC_READ,F ILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
SetFilePointer(hfile,0,nil,FILE_BEGIN);
ReadFile(hfile,idh,64,dwread,nil);
if idh.e_magic=IMAGE_DOS_SIGNATURE then
begin
SetFilePointer(hfile,idh._lfanew,nil,FILE_BEGIN);
readfile(hfile,inh,248,dwread,nil);
SetFilePointer(hfile,inh.OptionalHeader.DataDirect ory[1].VirtualAddress,nil,FILE_BEGIN);
readfile(hfile,iid,inh.OptionalHeader.DataDirector y[1].Size,dwread,nil);
edit2.Text:=inttohex(iid.Name,8);

end;

end;


این سه خط آخر را درست نوشتم!!! یعنی VirtualAddress میشه محل Import table ؟
چجوری باید از طریق VirtualAddress به import table دسترسی پیدا کنم؟

lord_viper
پنج شنبه 17 بهمن 1392, 07:52 صبح
کد زیر رو ببین
باید offset یا همون rva رو تبدیل به va بکنی

با کدی مثل کد زیر



function ImageRvaToVa(NtHeaders: PImageNtHeaders; Base: Pointer;
Rva: ULONG; var LastRvaSection: PImageSectionHeader): Pointer;
var
NtSection: PImageSectionHeader;
begin
Result := nil;
NtSection := LastRvaSection;
if (LastRvaSection = nil) or (Rva < NtSection^.VirtualAddress) or
(Rva < NtSection^.VirtualAddress + NtSection^.SizeOfRawData) then
NtSection := ImageRvaToSection(NtHeaders, Base, Rva);
if NtSection = nil then Exit;
if LastRvaSection <> nil then
LastRvaSection := NtSection;
Result := Pointer(DWORD(Base) + (Rva - NtSection^.VirtualAddress) +
NtSection^.PointerToRawData);
end;

مثال از بدست اوردن لیست import table


procedure TForm1.Button1Click(Sender: TObject);
var
hModule: Cardinal;
pIMAGE_DOS_HEADER: PImageDosHeader;
pIMAGE_NT_HEADERS: PImageNtHeaders;
pIMAGE_FILE_HEADER: PImageFileHeader;
pIMAGE_OPTIONAL_HEADER: PImageOptionalHeader;
pIMAGE_DATA_DIRECTORY: PImageDataDirectory;
pIMAGE_SECTION_HEADER: PImageSectionHeader;
pIMAGE_IMPORT_DESCRIPTOR: PIMAGE_IMAGE_IMPORT_DESCRIPTOR;
pIMAGE_IMPORT_BYNAME: PIMAGE_IMPORT_BY_NAME;
SectionName: Array [0..7] of Char;
DLLName: PChar;
i, s, f: Integer;
begin
hModule := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'NOTEPAD.EXE'));
pIMAGE_DOS_HEADER := Ptr(hModule);
Memo1.Lines.Add('e_magic = $' + IntToHex(pIMAGE_DOS_HEADER^.e_magic, 8));
if (pIMAGE_DOS_HEADER.e_magic = IMAGE_DOS_SIGNATURE) then
begin
pIMAGE_NT_HEADERS := Ptr(hModule + Cardinal(pIMAGE_DOS_HEADER^._lfanew));
Memo1.Lines.Add('Signature = $' + IntToHex(pIMAGE_NT_HEADERS^.Signature, 8));
if (pIMAGE_NT_HEADERS^.Signature = IMAGE_NT_SIGNATURE) then
begin
pIMAGE_FILE_HEADER := @pIMAGE_NT_HEADERS^.FileHeader;

Memo1.Lines.Add('NumberOfSections = $' +
IntToHex(pIMAGE_FILE_HEADER^.NumberOfSections, 8));
Memo1.Lines.Add('SizeOfOptionalHeader = $' +
IntToHex(pIMAGE_FILE_HEADER^.SizeOfOptionalHeader, 8));

pIMAGE_OPTIONAL_HEADER := @pIMAGE_NT_HEADERS^.OptionalHeader;

Memo1.Lines.Add('AddressOfEntryPoint = $' +
IntToHex(pIMAGE_OPTIONAL_HEADER^.AddressOfEntryPoi nt, 8));
Memo1.Lines.Add('AddressOfEntryPoint = $' +
IntToHex(pIMAGE_OPTIONAL_HEADER^.AddressOfEntryPoi nt + hModule, 8) + ' (Original)');

Memo1.Lines.Add('DATA_DIRECTORY');

for i := 0 to 15 do
begin
pIMAGE_DATA_DIRECTORY := @pIMAGE_OPTIONAL_HEADER^.DataDirectory[i];
Memo1.Lines.Add('i = $' + IntToHex(i, 8));
Memo1.Lines.Add('VirtualAddress = $' +
IntToHex(pIMAGE_DATA_DIRECTORY^.VirtualAddress, 8));
Memo1.Lines.Add('Size = $' +
IntToHex(pIMAGE_DATA_DIRECTORY^.Size, 8));
Memo1.Lines.Add('-------------------------------');
end;

Memo1.Lines.Add('SECTIONS');

for s := 0 to pIMAGE_FILE_HEADER^.NumberOfSections - 1 do
begin
pIMAGE_SECTION_HEADER := Ptr(hModule + Cardinal(pIMAGE_DOS_HEADER^._lfanew) +
SizeOf(TImageNtHeaders) + (SizeOf(TImageSectionHeader) * Cardinal(s)));
for i := 0 to 7 do
SectionName[i] := Chr(pIMAGE_SECTION_HEADER^.Name[i]);
Memo1.Lines.Add('Section Name = ' + String(SectionName));
Memo1.Lines.Add('Characteristics = $' +
IntToHex(pIMAGE_SECTION_HEADER^.Characteristics, 8));
Memo1.Lines.Add('VirtualAddress = $' +
IntToHex(pIMAGE_SECTION_HEADER^.VirtualAddress, 8));
end;

Memo1.Lines.Add('IMPORTS');

pIMAGE_DATA_DIRECTORY := @pIMAGE_OPTIONAL_HEADER^.DataDirectory[1];

s := 0;
while (Cardinal(s) < pIMAGE_DATA_DIRECTORY^.Size) do
begin
pIMAGE_IMPORT_DESCRIPTOR := Ptr(hModule + pIMAGE_DATA_DIRECTORY^.VirtualAddress +
Cardinal(s));
Memo1.Lines.Add('OriginalFirstThunk = $' +
IntToHex(pIMAGE_IMPORT_DESCRIPTOR^.OriginalFirstTh unk, 8));
if (pIMAGE_IMPORT_DESCRIPTOR^.OriginalFirstThunk <> 0) then
begin
DLLName := Ptr(hModule + pIMAGE_IMPORT_DESCRIPTOR^.Name1);
Memo1.Lines.Add('DLLName = ' + String(DLLName));

f := 0;
while (pCardinal(Ptr(hModule + pIMAGE_IMPORT_DESCRIPTOR^.OriginalFirstThunk +
(SizeOf(Cardinal) * Cardinal(f))))^ <> 0) do
begin
pIMAGE_IMPORT_BYNAME := Ptr(hModule + pCardinal(Ptr(hModule +
pIMAGE_IMPORT_DESCRIPTOR^.OriginalFirstThunk + (SizeOf(Cardinal) * Cardinal(f))))^);
Memo1.Lines.Add('Name1 = ' + String(pIMAGE_IMPORT_BYNAME^.Name1));
Inc(f, 1);
end;
end;
Inc(s, SizeOf(IMAGE_IMAGE_IMPORT_DESCRIPTOR));
end;
end
else Memo1.Lines.Add('NOT PE VALID!');
end
else Memo1.Lines.Add('NOT VALID APP!');
FreeLibrary(hModule);
end;

alamdar_761
جمعه 18 بهمن 1392, 16:21 عصر
ممنون بابت جواب اما چرا توابع import را که میخواد در memo نشون بده به صورت حروف چبنی نشون میده؟؟
البته یه چندتا خطا هم میداد که یکم تغییرش دادم (دلفی من XE2 است)
نمیشه با کد خودم توضیح بدید !