Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Еще раз про PE. А для анализа PE-файла его маппить? [D7, WinXP]


Bobby ©   (2005-07-18 13:37:00) 

Привет уважаемым знатокам!
Читаю доку по PE-формату. Вижу примеры исходников. Не могу врубиться, зачем перед анализом структуры файла его отображают в память. Что за выгибон такой. Разница-то какая как его читать?


Bobby   (2005-07-19 09:47:00) [1]

Господа Randy Kath и Шевченко!


Digitman   (2005-07-18 16:14:00) [2]


> зачем перед анализом структуры файла его отображают в память
> Что за выгибон такой


кто посмел ? "выгибониваться" ?


Poirot   (2005-07-18 16:09:00) [3]

мб это буит полезно:)
http://www.rsdn.ru/article/baseserv/peloader.xml


Bobby   (2005-07-18 14:27:00) [4]

Разобрался...

Неправильно :
dwHdrOffset := SizeOf(IMAGE_DOS_HEADER)+SizeOf(_IMAGE_NT_HEADERS)+FPEDosHeader.e_lfanew;

Правильно :
dwHdrOffset := SizeOf(_IMAGE_NT_HEADERS)+FPEDosHeader.e_lfanew;


Fay   (2005-07-18 14:24:00) [5]

2 Bobby   (18.07.05 14:00) [4]
В формате PE я не шарю вАщЕ - необходимости не возникало.
Но выбраное тобой смещение выгладит подозрительно 8)
Кунуть в тебя букварём на почту?


Bobby   (2005-07-18 14:00:00) [6]

Ув. Fay, Вы вероятно шарите в вопросе. Можно ли еще вопрос по случаю. Я пишу класс-анализатор PE(Вообще меня интересует таблица импорта DLL, но хотелось бы разобраться во всем).
Я добрался до таблицы сессий и застопорился. Пытаюсь прочитать первое поле - _IMAGE_SECTION_HEADER.Name и получаю какую-то ерунду. Правильно ли я высчитываю смещение, по которому находится таблица _IMAGE_SECTION_HEADER ----
dwHdrOffset := SizeOf(IMAGE_DOS_HEADER)+SizeOf(_IMAGE_NT_HEADERS)+FPEDosHeader.e_lfanew;

Вот текст процедуры(мне кажется тут все ясно):

TImgSectionHeaders = array of _IMAGE_SECTION_HEADER;

// ***************************************************************************
//  Заполнить массив заголовков секций
// ***************************************************************************
procedure TPEexplorer.MakeSectionHdrArray;
var
i           : Integer;
dwSHLength  : DWORD;
pISHeader   : PImageSectionHeader;
dwReaded    : DWORD;
dwHdrOffset : DWORD;
begin
if Assigned(FImgSectionHeaders) then
 FImgSectionHeaders := nil;
SetLength(FImgSectionHeaders,FPENtHeaders.FileHeader.NumberOfSections);
dwSHLength := SizeOf(_IMAGE_SECTION_HEADER) * FPENtHeaders.FileHeader.NumberOfSections;
dwHdrOffset := SizeOf(IMAGE_DOS_HEADER)+SizeOf(_IMAGE_NT_HEADERS)+FPEDosHeader.e_lfanew;

MovePEPointer(FILE_BEGIN,dwHdrOffset);
pISHeader := AllocMem(SizeOf(_IMAGE_SECTION_HEADER));
try
 for i:= 0 to FPENtHeaders.FileHeader.NumberOfSections -1 do begin
   ZeroMemory(pISHeader,SizeOf(_IMAGE_SECTION_HEADER));
  if not ReadFile(FHandle,pISHeader^, SizeOf(_IMAGE_SECTION_HEADER),dwReaded,nil) then begin
   FLastError := GetLastError();
   SendStatusToGUI(format(EM_READ_FILE,[FLastError,SysErrorMessage(FLastError)]),GUI_CONTINUE);
   exit;
  end;
  FImgSectionHeaders[i].Name := pISHeader^.Name;
 end;
finally
 FreeMem(pISHeader);
end;
end;

И вот еще само чтение:

// ***************************************************************************
//  Set PE file pointer
// ***************************************************************************
function TPEexplorer.MovePEPointer(Origin: DWORD;   Offset: Integer): boolean;
var
dwResult : DWORD;
begin
ZeroLastError();
dwResult := SetFilePointer(FHandle,Offset,nil,Origin);
FLastError := GetLastError();
if (FLastError <> ERROR_SUCCESS) then
 SendStatusToGUI(format(EM_FILE_POS,[FLastError,SysErrorMessage(FLastError)]),GUI_CONTINUE);

result := ((dwResult = Offset) and (FLastError = ERROR_SUCCESS));
end;

Вроде все как у Питрека. А что-то неправильно...


Fay   (2005-07-18 13:47:00) [7]

2 Bobby   (18.07.05 13:45) [2]
>> Как-никак лишний код...
Это сначала. Потом как с памятью - удобно, понятно и читаемо. 8)


Bobby   (2005-07-18 13:45:00) [8]

Спасибо, конечно, знатокам виднее, но понять, чем именно удобнее я не догоняю. Как-никак лишний код...


Fay   (2005-07-18 13:41:00) [9]

2 Bobby   (18.07.05 13:37)
Удобнее.


Наверх

Титульная страница Поиск, карта сайта Написать письмо