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

Вниз

Еще раз про PE. А для анализа PE-файла его маппить?   Найти похожие ветки 

 
Bobby   (2005-07-18 13:37) [0]

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


 
Fay ©   (2005-07-18 13:41) [1]

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


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

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


 
Fay ©   (2005-07-18 13:47) [3]

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


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

Ув. 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 14:24) [5]

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


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

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

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

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


 
Poirot ©   (2005-07-18 16:09) [7]

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


 
Digitman ©   (2005-07-18 16:14) [8]


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


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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.053 c
6-1116571383
Net2
2005-05-20 10:43
2005.09.04
Включён ли компьютер


1-1123740259
lordverd
2005-08-11 10:04
2005.09.04
RichEdit и блокирование объектов


9-1115315231
grouzd[E]v
2005-05-05 21:47
2005.09.04
OpenGL - Lists vs. Arrays


1-1124115072
MegaVolt
2005-08-15 18:11
2005.09.04
ComboBox + ToolBar с большими кнопками = глюки


9-1115476689
grouzd[E]v
2005-05-07 18:38
2005.09.04
OpenGL - Стереометрия, мать ее!