![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще раз про 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)
Удобнее.