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

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

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

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

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

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

Всем доброго дня! Есть программа определяющая таблицу импорта РЕ файлов, куда именно она выводит я нашел, количество выводимых функций тоже, но их имена не получается. Вот код
Код:
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;
  iibn : PImageImportByName;
  k:Integer;
  itd : PImageThunkData;
function va(rva : cardinal) : cardinal;
var
  LastSection: PImageSectionHeader;
begin
  LastSection := nil;
  Result := cardinal (ImageRvaToVa (imageinfo.FileHeader, imageinfo.MappedAddress,
                      Image^.FirstThunk, LastSection));
end;
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);
       k:=0;
       itd:= PImageThunkData (va (cardinal (Image.OriginalFirstThunk)));
       while itd.Ordinal <> 0 do
        begin
          if (itd.Ordinal shr 31) = 1 then
          begin
            List.add ('index: ' + inttostr (itd. Ordinal));
            inc (k);
          end
          else
          begin
            inc (k);
            iibn:= PImageImportByName (va (cardinal (itd^.AddressOfData)));
            List.add (' name: ' +  PansiChar(@iibn.Name));
          end;
          inc (cardinal (itd), sizeof (itd ^));
        end;
        inc (n);
        Image := Pointer(Integer(Image) + sizeof(IMAGE_IMPORT_DESCRIPTOR));
      end;
    end;
  end;
end;

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

Неужели не кто не работал с таблицой импорта
kotov-zhenja вне форума Ответить с цитированием
Старый 23.09.2015, 17:35   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я ее создавал (таблицу), и описывал это в статьях в журнале, который когда-то родился у нас в клубе. Но считывание никогда не делал. Хотя там ничего сложного нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2015, 17:56   #4
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Stilet большое спасибо что написал. Почти разобрался но особенность, не все функции выводит в 64 битных библиотеках. Вроде особенностей быть не должно, но.. если можешь посмотри вот код
Код:
type
   TDWordArray = array [0..$FFFFFFF] of DWORD;
var
  ulSize: Cardinal;
  Image: PIMAGE_IMPORT_DESCRIPTOR;
  Name: PansiChar;
  imageinfo: LoadedImage;
  pDummy: PImageSectionHeader;
  iibn : PImageImportByName;
  itd : PImageThunkData;

function va(rva : cardinal) : cardinal;
var
  LastSection: PImageSectionHeader;
begin
  LastSection := nil;
  Result := cardinal (ImageRvaToVa (imageinfo.FileHeader, imageinfo.MappedAddress,
                      rva, LastSection));
end;

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);
        inc (n);
      //  k:=0;
       itd:= PImageThunkData (va (cardinal (Image.Characteristics)));
       if itd<> nil then
       while itd.Ordinal <> 0 do
        begin
          if (itd.Ordinal shr 31) = 1 then
          begin
            List.add ('index: ' + inttostr (itd. Ordinal));
          end
          else
          begin
            iibn:= PImageImportByName (va (cardinal (itd.AddressOfData)));
            if iibn<>nil then List.add (' name: ' +  PansiChar(@iibn.Name))
            else List.add ('index: ' + inttostr (itd. Ordinal));;
          end;
          inc (cardinal (itd), sizeof (itd ^));
          inc (k);
        end;
        Image := Pointer(Integer(Image) + sizeof(IMAGE_IMPORT_DESCRIPTOR));
        //List.Add('    '+IntToStr(k));
      end;
    end;
  end;
end;
kotov-zhenja вне форума Ответить с цитированием
Старый 23.09.2015, 18:06   #5
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

и библиотека
http://files.webfile.ru/afac269abf9a...56f4699ffdf531
kotov-zhenja вне форума Ответить с цитированием
Старый 23.09.2015, 19:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

MapAndLoad, ImageDirectoryEntryToData... Мне такие функции незнакомы. Я бы просто читал из файла данные по позиции секции, потом по структуре таблицы импорта...
Ну не знаю, если время будет, попробую показать примером.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2015, 08:38   #7
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Спасибо, буду ждать
kotov-zhenja вне форума Ответить с цитированием
Старый 24.09.2015, 13:12   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Неужели в интернетах нет ни одного дампера PE-файлов на Delphi? Я в PE Tool думал со временем сделать подобное, но оно не в приоритетах.
Vapaamies вне форума Ответить с цитированием
Старый 24.09.2015, 18:18   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Неужели в интернетах нет ни одного дампера PE-файлов на Delphi? Я в PE Tool думал со временем сделать подобное, но оно не в приоритетах.
Как на счёт плугина к тоталкоммандыру?
1533231.jpg
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.09.2015, 09:03   #10
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Решение нашел, осталось лишь определить тип файла PE или PE+
Обещаю скинуть исходники по окончанию
kotov-zhenja вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение имени пользователя -Jack- Общие вопросы Delphi 17 23.08.2013 01:09
определение имени файла в функции ВПР cccp812 Microsoft Office Excel 5 08.04.2011 18:16
Определение имени файла 3BEPOBOY Microsoft Office Excel 2 28.12.2010 09:32
Определение имени таблицы динамично vlad_stv Microsoft Office Access 10 01.03.2010 12:54
определение пола по имени Psaf Microsoft Office Excel 4 18.02.2010 16:14