![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изучаю PE заголовок...
Spawn © (2003-07-05 12:01:00)
...и вот появился такой вопрос. В одной статье написано, что поле Signature должно содержать ASCII код, обозначающий тип файла. Пробую делать так.
Base:=GetModuleHandle(nil);
ImageDosHeader:=PImageDosHeader(Base);
ImageNtHeaders:=PImageNtHeaders(Base+ImageDosHeader._lfanew);
ShowMessage(PChar(ImageNtHeader.Signature)); - так возникает Access Violetion
А если же я сделаю так
ShowMessage(PChar(Base+ImageDosHeader._lfanew)), то показывает сообщение с надписью "PE". Так в чем сдесь ошибка? Возможно, я еще не очень хорошо понимаю как нужно использовать указатели. Заранее спасибо.
AlexRush (2003-07-06 18:40:00) [1]
Если кому-то интересна тема, предлагаю глянуть rush-x-change.front.ru/peview.rar
Это исходнники моей проги, которая позволяет прсмотреть PE модуль подобно TDUMP"у.
P.S. Не судите строго, я ее писал, когда с ПЕ разбирался :)
Morfein (2003-07-05 20:40:00) [2]
MessageBox(0, @ImageNtHeaders.Signature, nil, 0);
R4D][ (2003-07-05 17:17:00) [3]
А я считаю, для порядка так сказать, для крайней ясности :)
Spawn (2003-07-05 16:52:00) [4]
Избыточность языка программирования получается
Poirot (2003-07-05 16:46:00) [5]
Сдаётся мне эта фишка осталась ещё от паскаля.... типа для совместимости!
VMcL (2003-07-05 15:51:00) [6]
>Spawn © (05.07.03 14:24)
Разницы нет.
Spawn (2003-07-05 14:24:00) [7]
Без значка указателя (^) абсолютно те же самые данные. То есть нет различия. И вообще обьясните мне плиз в чем разница записи ImageDosHeader._lfanew и ImageDosHeader^._lfanew ?
R4D][ (2003-07-05 12:26:00) [8]
Да, соответсвует. Если добавить такой код перед самыым end;, то сообщение не выдается:
if ImageNtHeaders^.Signature<>IMAGE_NT_SIGNATURE then ShowMessage("error");
R4D][ (2003-07-05 12:20:00) [9]Сигнатура это не указатель, а DWORD, поэтому писать, что это PCHAR - ересь. Так же, так как PImageDos(NT)Header - это указатель, то надо использовать символ ^. В общем я проэксперементировал и вот, что получил. Показывает 17744, что по-моему соответсвует "PE", хотя я могу ошибаться:
var
ImageDosHeader: PImageDosHeader;
ImageNtHeaders: PImageNtHeaders;
Base ( nil)
Сигнатура это не указатель, а DWORD, поэтому писать, что это PCHAR - ересь. Так же, так как PImageDos(NT)Header - это указатель, то надо использовать символ ^. В общем я проэксперементировал и вот, что получил. Показывает 17744, что по-моему соответсвует "PE", хотя я могу ошибаться:
var
ImageDosHeader: PImageDosHeader;
ImageNtHeaders: PImageNtHeaders;
Base : THANDLE;
begin
Base:=GetModuleHandle(nil);
ImageDosHeader:=PImageDosHeader(Base);
ImageNtHeaders:=PImageNtHeaders(Base+ImageDosHeader^._lfanew);
ShowMessage(IntToStr(ImageNtHeaders^.Signature));
end;