Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Отображение константы для PE файла   Найти похожие ветки 

 
xShadow ©   (2004-02-27 15:26) [0]

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


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

MMF + поиск в нем


 
xShadow ©   (2004-02-27 15:37) [2]

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


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

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


 
xShadow ©   (2004-03-02 14:57) [4]

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


 
Digitman ©   (2004-03-02 16:29) [5]


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


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


 
xShadow ©   (2004-03-02 16:51) [6]

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:55) [7]

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

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


 
xShadow ©   (2004-03-02 17:01) [8]

Сорри!



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
11-1063273021
dataMaster
2003-09-11 13:37
2004.04.25
Panel и edgeStyle


11-1064995894
chuckloon
2003-10-01 12:11
2004.04.25
OLEAutomation server + KOL клиент


3-1080632730
miwa
2004-03-30 11:45
2004.04.25
С Refresh-ем не умею работать.


4-1077865783
Ozone
2004-02-27 10:09
2004.04.25
WMI


14-1080885396
snake1977
2004-04-02 09:56
2004.04.25
Office 2000