Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2015, 14:04   #1
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию Получение таблицы импорта pe файла

С экспортом разобрался, теперь бы получить импорт. Нашел статьи но не могу разобраться(
kotov-zhenja вне форума Ответить с цитированием
Старый 18.09.2015, 14:40   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

и все конечно знают о каком, куда и чего вы импорте/экспорте говорите.
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 18.09.2015, 14:43   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А точно так же. Есть секция импорта - ее и читать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2015, 14:49   #4
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Код:
type
   TDWordArray = array [0..$FFFFF] of DWORD;
 var
   imageinfo: LoadedImage;
   pImport: PImageImportDescriptor;
   dirsize: Cardinal;
   pDummy: PImageSectionHeader;
   i: Cardinal;
   pNameRVAs: ^TDWordArray;
   Name: string;
 begin
   List.Clear;
   if MapAndLoad(PansiChar(AnsiString(FileName)),PansiChar(AnsiString(path)), @imageinfo, True, True) then
   begin
     try
       pImport := ImageDirectoryEntryToData(imageinfo.MappedAddress,
         False, IMAGE_DIRECTORY_ENTRY_IMPORT, dirsize);
       if (pImport <> nil) then
       begin
         pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
           DWORD(pImport^.Name), pDummy);
         for i := 0 to pImport^.Name - 1 do
         begin
           Name := PansiChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
             pNameRVAs^[i], pDummy));
           List.Add(Name);
         end;
       end;
     finally
       UnMapAndLoad(@imageinfo);
     end;
   end;
 end;
вылетает вот тут
Код:
Name := PansiChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,

Последний раз редактировалось kotov-zhenja; 18.09.2015 в 14:59.
kotov-zhenja вне форума Ответить с цитированием
Старый 18.09.2015, 15:01   #5
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Количество импорта просто ужасно большое

Цитата:
и все конечно знают о каком, куда и чего вы импорте/экспорте говорите.
увы вы ошиблись, цели не те

помощь так и прет(( может тему в другой раздел надо

Последний раз редактировалось Stilet; 18.09.2015 в 21:47.
kotov-zhenja вне форума Ответить с цитированием
Старый 18.09.2015, 21:25   #6
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

А что именно ВЫ хотите увидеть и в каком виде?
ДралсяСошибками вне форума Ответить с цитированием
Старый 21.09.2015, 10:23   #7
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Количество импортируемых функций и их название.
Код:
procedure TForm1.ListDLLImport(const FileName, path: string; List: TStrings);
var
 hFile, hMap : THandle;
 iid : PIMAGE_IMPORT_DESCRIPTOR;
 itd : PImageThunkData;
 iibn : PImageImportByName;
 Image : pointer;
 ImageAdr : cardinal absolute Image;
 ifh : PImageFileHeader;
 ioh : PImageOptionalHeader32;
 nthdrs : PImageNtHeaders32;
 DirSize : cardinal;
 Dir : pointer;

 function va(rva : cardinal) : cardinal;
 var
   LastSection : PImageSectionHeader;
 begin
   LastSection := nil;
   Result := cardinal(ImageRvaToVa(nthdrs, Image, rva, LastSection));
 end;

begin

 hMap := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
 Image := MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
 nthdrs := (Image);

 ifh := @nthdrs^.FileHeader;
 ioh := @nthdrs^.OptionalHeader;

 dir := ImageDirectoryEntryToData (Image, FALSE, IMAGE_DIRECTORY_ENTRY_IMPORT, DirSize);
 iid := PIMAGE_IMPORT_DESCRIPTOR(dir);
 itd := PImageThunkData(va(cardinal(iid.FirstThunk)));
 while itd.Ordinal<>0 do
 begin
   if (itd.Ordinal shr 31) = 1 then
   begin
    // List.Add('index:');
     List.Add('index:' + inttostr(itd.Ordinal));
   end
   else
   begin
     iibn := PImageImportByName(va(cardinal(itd.AddressOfData)));
     List.add('name:' + PChar(@iibn.Name) + ' ' + inttostr(iibn.hint));
   //  List.add('name:');
   end;
   inc(cardinal(itd), sizeof(itd^));
 end;

end;
Вылетает при чтение адреса, но даже количество не совпадает

Последний раз редактировалось kotov-zhenja; 21.09.2015 в 10:30.
kotov-zhenja вне форума Ответить с цитированием
Старый 21.09.2015, 14:38   #8
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Сделал. Выкладываю код
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   List: TStrings;
   i: Integer;
   s: string;
 begin
   List := TStringList.Create;
  try
     ListBox1.Items.Clear;
     ListDLLExports(Edit1.Text,Edit2.Text, List);
     ListBox1.Items.Add(IntToStr(list.Count) + ' Exports functions in dll');
     s := 'List of functions:';
     for i := 0 to List.Count - 1 do
       ListBox1.Items.Add(List[i]);
   finally
     List.Free
   end;
   List := TStringList.Create;
   try
     ListBox2.Items.Clear;
     ListDLLImport(Edit1.Text,Edit2.Text, List);
     ListBox2.Items.Add(IntToStr(list.Count) + ' Imports functions in dll');
     s := 'List of functions:';
     for i := 0 to List.Count - 1 do
       ListBox2.Items.Add(List[i]);
   finally
     List.Free
   end;
 end;

procedure TForm1.ListDLLExports(const FileName,path: string; List: TStrings);
type
   TDWordArray = array [0..$FFFFF] of DWORD;
 var
   imageinfo: LoadedImage;
   pImport: PImageExportDirectory;
   dirsize: Cardinal;
   pDummy: PImageSectionHeader;
   i: Cardinal;
   pNameRVAs: ^TDWordArray;
   Name: string;
 begin
   List.Clear;
   if MapAndLoad(PansiChar(AnsiString(FileName)),PansiChar(AnsiString(path)), @imageinfo, True, True) then
   begin
     try
       pImport := ImageDirectoryEntryToData(imageinfo.MappedAddress,
         False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
       if (pImport <> nil) then
       begin
         pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
           ULONGLONG(pImport^.AddressOfNames), pDummy);
         for i := 0 to pImport^.NumberOfNames - 1 do
         begin
           Name := PansiChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
             pNameRVAs^[i], pDummy));
           List.Add(Name);
         end;
       end;
     finally
       UnMapAndLoad(@imageinfo);
     end;
   end;
 end;


procedure TForm1.ListDLLImport(const FileName, path: string; List: TStrings);
type
   TDWordArray = array [0..$FFFFFFF] of DWORD;
var
  ulSize: Cardinal;
  Image: PIMAGE_IMPORT_DESCRIPTOR;
  Name: PansiChar;
  Module: HMODULE;
  hFile, hMap : THandle;
  imageinfo: LoadedImage;
  pNameRVAs: ^TDWordArray;
  pDummy: PImageSectionHeader;
begin
   List.Clear;
   if MapAndLoad(PansiChar(AnsiString(FileName)),PansiChar(AnsiString(path)), @imageinfo, True, True) then
   begin
    Image := ImageDirectoryEntryToData(imageinfo.MappedAddress, false, IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
    if Image <> nil then
    begin
      while Image.FirstThunk <> 0 do
      begin
        Name := PansiChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
             Image^.Name, pDummy));
        List.Add(Name);
        Image := Pointer(Integer(Image) + sizeof(IMAGE_IMPORT_DESCRIPTOR));
      end;
    end;
  end;
end;
kotov-zhenja вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таблицы импорта и экспорта Alexey_68 Общие вопросы C/C++ 2 12.04.2013 23:15
Нюансы импорта данных их файла Snekich Microsoft Office Excel 3 07.12.2011 14:16
Обновление таблицы Access путем импорта данных из DBF TranzitZP Microsoft Office Access 9 11.04.2011 00:26
HELP! Необходим скрипт на VB, автоматизирующий стандартную процедуру импорта из текстового файла Kerguru Microsoft Office Access 1 17.12.2009 20:33
Создание билетов путем импорта из таблицы mistx Microsoft Office Excel 2 25.02.2009 09:02