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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2012, 11:13   #1
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию Подменить адрес возврата

Доброе время суток!

Что-то я туплю с достаточно простой задачей если кратко, то нужно программно организовать аналог try...finally...end т.е. подменить адрес возврата.

Допустим есть код вида:
Код:
procedure Y();
begin
  ......
end;

procedure X();
begin
  ......
end;

procedure Test(....);
begin
  X();
  ......
end;

procedure Caller(......);
begin
  Test(....);
end;
при этом цепочка вызовов будет иметь вид: Caller => Test => X => возврат в Test => возврат в Caller
В процедуре Х нужно модифицировать стек таким образом, чтоб цепочка приняла след. вид: Caller => Test => X => возврат в Test => возврат в Y => возврат в Caller

Думаю, что это вполне возможно, но что-то не соображу как.
Буду благодарен за помощь в решение вопроса
GreenWizard вне форума Ответить с цитированием
Старый 16.06.2012, 14:45   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В простейшем случае, если Test ничего в стеке не хранит, то
Код:
procedure Test();
begin
  X();
  asm
    push offset Y
  end;
end;
Somebody вне форума Ответить с цитированием
Старый 16.06.2012, 16:14   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Somebody, и будет испорчен стек.

нужно заменить старое значение.
то есть mov [esp],offset Y
примерно так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.06.2012, 19:25   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

проблема в том, что Test может что-угодно из себя представлять, любое число параметров/переменных
GreenWizard вне форума Ответить с цитированием
Старый 16.06.2012, 20:40   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Somebody, и будет испорчен стек.

нужно заменить старое значение.
то есть mov [esp],offset Y
примерно так.
Не, если mov [esp], то это возврат в Y вместо Caller, а надо сначала в Y, а потом в Caller. А при push offset это будет новый адрес возврата, а старый станет адресом возврата из Y.
Цитата:
Сообщение от GreenWizard Посмотреть сообщение
проблема в том, что Test может что-угодно из себя представлять, любое число параметров/переменных
С локальными переменными можно попробовать
Код:
{$W+}
procedure Test();
var
   ...
begin
  ...
  asm
    mov     eax, esi
    mov     edx, edi
    mov     esi, esp
    lea     edi, [esi-4]
    lea     ecx, [ebp+4]
    sub     ecx, esp
    rep movsb
    mov     esi, eax
    mov     edi, edx
    mov     [ebp], offset Y
    sub     ebp, 4
    sub     esp, 4
  end;
   ...
end;
А вот если произвольное количество параметров, это хуже.

Последний раз редактировалось Somebody; 16.06.2012 в 23:36.
Somebody вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
ошибка с адресом возврата Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 18.09.2011 12:30
адрес возврата n3sh Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 08.04.2011 21:19
Подменить IP-адрес при открытии URL (не через proxy) СТРАННИК Работа с сетью в Delphi 20 21.10.2010 17:09
подменить соурс в iframe fercmann JavaScript, Ajax 4 20.08.2008 01:06