Текущий архив: 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