Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отображение константы для PE файла [D6, Win2k]


xShadow ©   (2004-02-27 15:26:00) 

Возможно корявый сабж но суть такая:
Как по виртульному адресу типизированной константы вида
const STI: String[6] = '123321' отыскать её смещение в EXE файле.
Видел как это сделать для DOS EXE а как для PE 32.
Это вообще возможно?


xShadow   (2004-03-02 17:01:00) [1]

Сорри!


Digitman   (2004-03-02 16:55:00) [2]

ах вон оно что !

а в вопросе ты про ран-тайм ничего не сказал


xShadow   (2004-03-02 16:51:00) [3]

PE файл состоит из секций с указанием виртуального адреса, по нему то и можно сориентироваться.
Function GetVAtoRVA( const Dir: Dirs;
                    const NtHdr: TImageNtHeaders;
                    const VA: Cardinal ): Cardinal;
var I: Cardinal;
Begin
   //относительное виртуальное смещение
   Result := VA - NtHdr.OptionalHeader.ImageBase;

   //поиск секции к которой относиться виртуальный адрес
   for I := 1 to NtHdr.FileHeader.NumberOfSections - 1 do
   if ( Result >= Dir[I].VirtualAddress ) and
      ( Result <= Dir[I + 1].VirtualAddress ) then
      Begin //нашли
         //определение смещение в файле
         Result := Dir[I].PointerToRawData + ( Result - Dir[I].VirtualAddress );
         Break;
      end;

end;

Function GetConstDiskOffset( const D; var Off: Cardinal ): Integer;
var F    : File;
   OldFM: Integer;
   HDos : TImageDosHeader;
   NTHdr: TImageNtHeaders;
   Dir  : Dirs;
Begin
   OldFM := FileMode;
   FileMode := 0;
   AssignFile( F, ParamStr( 0 ) );
   {$I-}Reset( F, 1 );{$I+}
   Result := IOResult;
   if Result <> 0 then Exit;
   if ( GetDosHdr( F, HDos ) <> 0 ) or  //чтение DOS заголовка
      ( GetNtHdr( F, HDos, NtHdr ) <> 0 ) or //чтение PE заголовка
      ( GetDIRSections( F, NtHdr, Dir ) <> 0 ) then //чтение заголовков секций
   Begin
      CloseFile( F );
      Exit;
   end;

   //смещение константы
   Off := GetVAtoRVA( Dir, NtHdr, Cardinal( Addr( D ) ) );

   CloseFile( F );

   FileMode := OldFM;
end;

Вот код, не полный для краткости!
Но этот код валиден если Loader загрузил файл по адресу из заголовка EXE файла он же NtHdr.OptionalHeader.ImageBase


Digitman   (2004-03-02 16:29:00) [4]


> xShadow ©   (02.03.04 14:57) [4]


любопытно, при чем здесь заголовки какие-то


xShadow   (2004-03-02 14:57:00) [5]

MMF конечно весчь но разбираться не охото.
Реализовал через чтение заголовков EXE файла.
Кому интересно могу выложить.


Игорь Шевченко   (2004-02-27 15:44:00) [6]

CreateFileMapping, MapViewOfFile прочитать можно в F1


xShadow   (2004-02-27 15:37:00) [7]

Я где можно почитать про это дело MMF


Игорь Шевченко   (2004-02-27 15:33:00) [8]

MMF + поиск в нем


Наверх

Титульная страница Поиск, карта сайта Написать письмо