Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PE 
:(
    Опции темы
Curve
Дата 20.3.2004, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.1.2004

Репутация: 1
Всего: 1



Возникла тут у меня проблемка-вопрос:
Возможно ли, читая из PE ехе-шника или dll узнать его размер. Ну, в смысле как можно посчитать вес всех заголовков и секций.
В Optional Header'е, кажется, есть CheckSum, но он как-то хитро считается, т.к у разных файлов он то больше реального размера, то меньше.... А в ДОС хидере вообще e_checksum всегда нулю равна... sad.gif
PM MAIL ICQ   Вверх
p0s0l
Дата 20.3.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



CheckSum - это контрольная сумма, к размеру файла не имеет никакого отношения. Тем более, что это поле не используется в виндах.
Посчитать вес всех заголовков и секций можно, но зачем ? А размер PE-файла = (адрес_последней_секции + размер__последней_секции). Всё что за этой секцией - мусор.
Вот как это выглядеть должно:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
 h : THandle;
 buf : pointer;
 bufAdr : cardinal absolute buf;
 size, tmp : cardinal;
 idh : PImageDosHeader absolute buf;
 ifh : PImageFileHeader;
 ioh : PImageOptionalHeader;
 ish : PImageSectionHeader;
 i : integer;

begin
 h := CreateFile('c:\windows\explorer.exe',
                 GENERIC_READ,
                 FILE_SHARE_READ+FILE_SHARE_WRITE+FILE_SHARE_DELETE,
                 nil,
                 OPEN_EXISTING,
                 FILE_ATTRIBUTE_NORMAL,
                 0);
 size := GetFileSize(h, nil);
 GetMem (buf, size);
 ReadFile (h, Buf^, size, tmp, nil);
 CloseHandle(h);

 ifh := PImageFileHeader(bufAdr + idh._lfanew + 4);
 ioh := PImageOptionalHeader(cardinal(ifh) + SizeOf(ifh^));
 ish := PImageSectionHeader(cardinal(ioh) + ifh.SizeOfOptionalHeader);

 size := 0;
 for i := 0 to ifh.NumberOfSections-1 do
 begin
   if (ish.PointerToRawData + ish.SizeOfRawData) > size then
      size := (ish.PointerToRawData + ish.SizeOfRawData);
   Inc (cardinal(ish), SizeOf(ish^));
 end;

 Caption := IntToStr(size);
 FreeMem (buf);
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
oleg1973
Дата 21.3.2004, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



имхо глупо
для чтения из файла один хрен делается CreateFile
ну а потом GetFileSize


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Curve
Дата 22.3.2004, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.1.2004

Репутация: 1
Всего: 1



Цитата(oleg1973 @ 21.3.2004, 02:06)
имхо глупо
для чтения из файла один хрен делается CreateFile
ну а потом GetFileSize

Нет, не глупо, как это всё заюзать я знаю. Просто мне это нужно smile.gif
А насчёт checksum - почему же она тогда равна чуть больше, чем размер самого файла (физически, т.е на диске?). Но, почему-то, она всё время на разное количество байт больше...
PM MAIL ICQ   Вверх
p0s0l
Дата 22.3.2004, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Curve, ты наверное про ImageSize (или как-то так поле обзывается) говоришь. А это не физический размер, а виртуальный, поэтому и отличается.



--------------------
С уважением, г-н Посол.
PM   Вверх
Curve
Дата 25.3.2004, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.1.2004

Репутация: 1
Всего: 1



Нет, я говорю про IMAGE_OPTIONAL_HEADER.CheckSum...
PM MAIL ICQ   Вверх
oleg1973
Дата 25.3.2004, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



чек сум необязательное поле
все от линкера зависит
можно и 0 поставить


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.