Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2015, 17:18   #1
A.N.D.R.E.W
 
Регистрация: 02.09.2012
Сообщений: 8
По умолчанию image address

Привет, форум!
Подскажите безграмотному, как определить адрес куска данных (области кода) в ехе файле и того же куска данных в памяти процесса созданного этим exe.

например делаю так
Код:
program TestProj;
...
var
Addr1, Addr2:Pointer;
Offs1, Offs2:Cardinal;
Data1, Data2: Pointer;
MS: TMemoryStream;
const
DataSize=32;
...
procedure Test; //некоторая функция
 begin
  Writeln('Hello, world');
 end;
...
Addr1:=Addr(Test);  //получаю адрес функции
Data1:=AllocMem(DataSize); //выделяю память под указатель
CopyMemory(Data1, Addr1, DataSize); //копирую кусок памяти 32байта
...
Offs1:=Addr1-HInstance; //определяю смещение от начала image ($00400000) 
MS.LoadFromFile('TestProj.exe'); //загружаю стрим из этого же  exe
MS.Position:=Offs1; //устанавливаю ранее полученное смещение
Data2:=AllocMem(DataSize); //выделяю память под указатель
MS.Read(Data2^, DataSize); //читаю кусок памяти 32байта
...
и получается что данные по указателям Data1 и Data2 разные.

Дальше ищу такой же блок данных в exe файле будем считать вручную просто перебором и сравнением байт в Data1 получаю некую позицию мемористрима Offs2, теперь если выполнить
Код:
MS.Position:=Offs2; //устанавливаю полученное вручную смещение
MS.Read(Data2^, DataSize); //читаю кусок памяти 32байта
...
данные по двум указателям одинаковые
но получается что Offs2 меньше Offs1 на 3072байта.

Собственно вопрос, что это за дельта?
Как зная адрес куска кода в памяти процесса найти тот же кусок в exe файле?
A.N.D.R.E.W вне форума Ответить с цитированием
Старый 24.09.2015, 17:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Как зная адрес куска кода в памяти процесса найти тот же кусок в exe файле?
Да скорее всего никак... Это загрузчик по своему усмотрению сажает в нужные секции памяти данные.
Ты хочешь узнать где физически находится начало функции Test?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2015, 17:36   #3
A.N.D.R.E.W
 
Регистрация: 02.09.2012
Сообщений: 8
По умолчанию

да. к примеру

образ exe файла с жесткого диска проецируется в виртуальное адресное пространство процесса так? значит зная адрес начала этого образа в памяти процесса я смогу найти что хочу.
Начало образа вроде как Pointer(Hinstance)

Последний раз редактировалось Stilet; 24.09.2015 в 17:42.
A.N.D.R.E.W вне форума Ответить с цитированием
Старый 24.09.2015, 17:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
зная адрес начала этого образа в памяти процесса я смогу найти что хочу.
Ну в теории да. Но тогда тебе придется читать РЕ заголовок, чтоб найти начало секции кода. Без разбора РЕ заголовка у тебя врядли что-то получится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2015, 17:46   #5
A.N.D.R.E.W
 
Регистрация: 02.09.2012
Сообщений: 8
По умолчанию

вот вот с этого места поподробнее )))
A.N.D.R.E.W вне форума Ответить с цитированием
Старый 24.09.2015, 18:41   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А чего тут подробнее?
Найти спецификацю типа http://cs.usu.edu.ru/docs/pe/ почитать как устроен РЕ и применить прочитанное.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2015, 19:13   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А еще учесть, что не все страницы могут быть в памяти одновременно.
p51x вне форума Ответить с цитированием
Старый 24.09.2015, 19:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
не все страницы могут быть в памяти одновременно.
Всмысле?...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.10.2015, 13:12   #9
A.N.D.R.E.W
 
Регистрация: 02.09.2012
Сообщений: 8
По умолчанию

наконец то нашлось время вернуться к своей задаче
в общем все получилось просто как и думал

Код:
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

Последний раз редактировалось A.N.D.R.E.W; 03.10.2015 в 13:19.
A.N.D.R.E.W вне форума Ответить с цитированием
Старый 20.10.2015, 19:29   #10
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

A.N.D.R.E.W
Про PE заголовки и всю эту лабуду на Exelab.ru расскажут подробно.
Они там эксперты в этой области.
Если нужно проецировать кусок кода в память, то я делал такую штуку года 2 назад. В Гугле полно примеров, CopyMemory никто не юзает. Правильнее выделять память через VirtualAlloc и туда проецировать бинарник свой.

Последний раз редактировалось calypso; 20.10.2015 в 19:32.
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation at address XXXXXX in module 'YYYYYY'. Read of address ZZZZZZ' nik-kang Помощь студентам 0 18.06.2012 22:22
Access violation at address 004733C4 in module 'loginin.exe'. Read of address 00000048' pavellyba Общие вопросы Delphi 2 18.08.2011 10:32
Access violation at address 00447E73 in modul Project.exe. Read of address 00000057. ArtGrek Общие вопросы Delphi 40 12.03.2011 22:03
Access violation at address 00478D0E in module 'Project1.exe'. Write of address 00000000 fondreykus-1 Общие вопросы Delphi 5 27.01.2010 14:25
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13