Тема: image address
Показать сообщение отдельно
  #12  
Старый 03.10.2015, 21:30
Аватар для a.n.d.r.e.w
a.n.d.r.e.w a.n.d.r.e.w вне форума
Прохожий
 
Регистрация: 01.07.2015
Сообщения: 28
Версия Delphi: delphi xe7
Репутация: 10
По умолчанию

в общем кактотак

Код:
program TestProj; 
... 
var
 data_m, data_f: pointer;
 ofs1, ofs2, pos: Cardinal;
 dh:TImageDosHeader;
 _text:TImageSectionHeader;
 ... 
begin
 data_m:=Addr(StartPointProc); //адрес какой-то функции в памяти процесса
 CopyMemory(@dh, pointer(HInstance), SizeOf(TImageDosHeader)) ; //читаем заголовок dos 
 CopyMemory(@_text, pointer(HInstance+dh._lfanew+
 sizeof(TImageNtHeaders)), SizeOf(TImageSectionHeader)) ; //читаем заголовок первой секции (секции кода) 
 ofs1:=Cardinal(data_m)-HInstance; //смещение адреса функции от начала имиджа
 ofs2:=ofs1-_text.VirtualAddress; //смещение адреса функции от начала секции
 pos:=_text.PointerToRawData + ofs2; //смещение адреса функции от начала файла
 ms:=TMemoryStream.Create; 
 ms.LoadFromFile(ParamStr(0)); //загрузим стрим из этого же EXE
 data_f:= ms.Memory;
 inc(Cardinal(data_f), pos); //получим адрес того же куска в памяти стрима 
//теперь если вычитать небольшой кусок данных из 
// data_m - памяти процесса 
// data_f - памяти стрима загруженного из файла 
//они будут эквивалентны
 
типа того
http://saveimg.ru/show-image.php?id=...f93eafbd5d213a
Ответить с цитированием