![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отображение константы для 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 + поиск в нем