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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2016, 19:36   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Получить регистр ESP, у программы запущенной в памяти

Доброго времени суток! Сообственно сабж. Хочу получить регистр esp, в чужой программе которая запущена в памяти(использования дебаггеров и прочих инструментов не нужно), как это можно реализовать?
Подозреваю что в каком-то конкретном смещении указывается значение регистра esp(просьба не материть если оно не так ), подскажите как это сделать, копать в сторону дизассемблера на делфи?

Последний раз редактировалось Winexcel; 25.07.2016 в 19:59.
Winexcel вне форума Ответить с цитированием
Старый 25.07.2016, 19:55   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

В своей программе или чужой?
В свой к примеру так:
Код:
function GetESP:DWord; register;
assembler;
asm
mov result, esp
add result, 16
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
caption:=format('%x',[GetESP]);
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.07.2016, 19:59   #3
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
В своей программе или чужой?
В свой к примеру так:
Код:
function GetESP:DWord; register;
assembler;
asm
mov result, esp
add result, 16
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
caption:=format('%x',[GetESP]);
end;
Спасибо за ответ. Но вопрос стоял именно в чужой, как получить у своей и так ясно
Winexcel вне форума Ответить с цитированием
Старый 25.07.2016, 20:15   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Копайте в сторону написание собственного отладчик. При остановке все регистры сохраняются в структуре TContext.
Код:
  GetThreadContext(HThead,Context);
  Context.Esp;
За основу проще взять класс от Розыча.
https://habrahabr.ru/post/178159/
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.07.2016, 20:20   #5
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Копайте в сторону написание собственного отладчик. При остановке все регистры сохраняются в структуре TContext.
Код:
  GetThreadContext(HThead,Context);
  Context.Esp;
За основу проще взять класс от Розыча.
https://habrahabr.ru/post/178159/
Большое спасибо, стоит покурить.
А вот это не то что я думаю?

e_sp? Это случаем не смещение регистра?
Winexcel вне форума Ответить с цитированием
Старый 25.07.2016, 20:36   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
e_sp? Это случаем не смещение регистра?
Во первых это заголовок exe файла для DOS. Выполняется только в ДОС, виндоус его пропускает и переходит к заголовку PE.
Во-вторых, e_sp - это начальное значение sp. Служит для задания размера стека во времена DOS, вернее для принудительного уменьшения.
В третьих это SP, а не ESP. 2 байта а не 4 байта.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.07.2016, 20:47   #7
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Во первых это заголовок exe файла для DOS. Выполняется только в ДОС, виндоус его пропускает и переходит к заголовку PE.
Во-вторых, e_sp - это начальное значение sp. Служит для задания размера стека во времена DOS, вернее для принудительного уменьшения.
В третьих это SP, а не ESP. 2 байта а не 4 байта.
Мне бы даже начальное значение получить , значит это выполнено не будет, и копать сюда не стоит, спасибо.
Winexcel вне форума Ответить с цитированием
Старый 25.07.2016, 21:05   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Winexcel Посмотреть сообщение
Мне бы даже начальное значение получить , значит это выполнено не будет, и копать сюда не стоит, спасибо.
начальное вам ничем не поможет(у каждого потока оно свое+текущее может улететь далеко+в винде оно не так фиксировано), и имейте в виду, регистры есть у потоков, а не у процессов.
если же вы внедряетесь вам дадут esp готовый.
иначе отладчик. как я много раз говорил, не пытайтесь молоток засунуть себе в одно место, им все же гвозди надо забивать.

если расскажете о цели может и подробнее советы дать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
эмуляции запущенной IDE Delphi + Debug beegl Общие вопросы Delphi 0 04.11.2015 14:36
как из одного процесса получить доступ к памяти, занятой другим процессом? Bиталий Qt и кроссплатформенное программирование С/С++ 7 09.02.2011 19:38
Экспонетна с точность ESP systemv Помощь студентам 1 10.11.2010 21:21
Экспонетна с точность ESP systemv Помощь студентам 1 09.11.2010 08:56
команда запущенной программе Артэс Общие вопросы C/C++ 3 05.03.2008 18:26