Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Импортированыые функции EXE фаила ( PE формат)   Найти похожие ветки 

 
LDGuest   (2004-04-14 12:07) [0]

Ребята есть следующая проблема:
надо получить список всех функций, которые импортируються исполняемым фаилом из dll библиотек.
( я пишу программу анологичную tdump.exe )


 
Digitman ©   (2004-04-14 12:23) [1]

в случае только стат.импорта сканируй директорию импорта импортирующего модуля

во всех прочих случаях задача не имеет конечного решения


 
tesseract ©   (2004-04-14 12:30) [2]

Динамически линкуемую библиотеку можно определить Api-spy если запустить её с листом всех стандартных функций.


 
LDGuest   (2004-04-14 12:31) [3]

проблема в том что в некоторых модулях нет секции .idata, а
tdump.exe и отладчики показывают импортированные функции! млин!


 
Digitman ©   (2004-04-14 12:54) [4]

структура _IMAGE_OPTIONAL_HEADER содержит поле
DataDirectory: packed array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES-1] of TImageDataDirectory;

обращение к области первого дескриптора в директории импорта осущ-ся
pImpDir := PImageImportDescriptor(hImporter + pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)


 
Игорь Шевченко ©   (2004-04-14 14:48) [5]

LDGuest   (14.04.04 12:31)

procedure TPEImage.LoadImports;
var
 RawOffset: Integer;
 ImportDescriptor: PIMAGE_IMPORT_DESCRIPTOR;
 DllName: string;
 PFunctionsAddress: PDWORD;
 ImportAddress: DWORD;
begin
 with NtHeaders^.OptionalHeader.DataDirectory[
     IMAGE_DIRECTORY_ENTRY_IMPORT] do begin
   if (VirtualAddress = 0) or (Size = 0) then
     Exit;
   RawOffset := RawAddress(VirtualAddress);
 end;
 ImportDescriptor := PIMAGE_IMPORT_DESCRIPTOR(RawData + RawOffset);
 while ImportDescriptor^.Name <> 0 do begin
   RawOffset := RawAddress(ImportDescriptor^.Name);
   if RawOffset <> 0 then
     DllName := UpperCase(StrPas(RawData + RawOffset));
   if ImportDescriptor^.Characteristics = 0 then
     RawOffset := RawAddress(ImportDescriptor^.FirstThunk)
   else
     RawOffset := RawAddress(ImportDescriptor^.Characteristics);
   PFunctionsAddress := PDWORD(RawData + RawOffset);
   while PFunctionsAddress^ <> 0 do begin
     ImportAddress := PFunctionsAddress^;
     FImports.Add(GetImportedFunctionName(DllName, ImportAddress));
     Inc(PFunctionsAddress);
   end;
   Inc(ImportDescriptor);
 end;
end;

function TPEImage.GetImportedNameFromIATEntry(IATEntryRVA: DWORD;
 FullInfo: Boolean): string;
var
 RawOffset: DWORD;
begin
 RawOffset := RawAddress (IATEntryRVA);
 Result := StrPas(RawData + RawOffset + SizeOf(Word));
 if FullInfo then
   Result := Format("%s (Hint=%.4x)", [Result,
     PIMAGE_IMPORT_BY_NAME(RawData + RawOffset)^.Hint]);
end;

function TPEImage.RawAddress(VirtualAddress: Cardinal): Cardinal;
var
 I: Integer;
 Position: Cardinal;
begin
 Result := 0;
 for I := 0 to Pred(FSections.Count) do
   if (Sections[I].VirtualAddress <= VirtualAddress) and
      (VirtualAddress < Sections[I].VirtualAddress +
       Sections[I].SizeOfRawData) then begin
     Position := VirtualAddress - Sections[I].VirtualAddress;
     Result := Sections[I].PointerToRawData + Position;
     Break;
   end;
end;




Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
14-1081635133
Soft
2004-04-11 02:12
2004.05.02
Соционика или типизация человеческой личности.


14-1081422644
Oksana
2004-04-08 15:10
2004.05.02
Люди, дайте совет


14-1081451242
УНЯ
2004-04-08 23:07
2004.05.02
Ж


6-1077816770
rrew
2004-02-26 20:32
2004.05.02
TServerSocket &amp; ClientSocket


14-1081492943
peypivo
2004-04-09 10:42
2004.05.02
О явлениях которые мы не можем изменить и о тех кто пытается.