Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых)

 eXeL@B —› Программирование —› Получить адрес возврата из стека
Посл.ответ Сообщение


Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 сентября 2017 13:14 · Поправил: ajax
· Личное сообщение · #1

нужен адрес возврата из процедуры. на x64 может быть дофига прологов, в зависимости от наполнения кодом. каждый раз дебажить/дизасмить и смотреть, что изменилось - не гут.
Code:
  1. Procedure GetStack;
  2. Asm
  3.   push   rax
  4.   mov    rax,[rsp+20h+8+8+8]
  5.   mov    RetAddr,rax
  6.   pop    rax
  7. End;
  8.  
  9. Procedure AAA;
  10. Begin
  11. GetStack;
  12. ...
  13. End;

процедур типа AAA может быть очень много. все с разными параметрами. прежде, чем отвечать, вдумайтесь всякие StackBackTrace и т.п. не применимы

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

Создано: 16 сентября 2017 13:44 · Поправил: Kindly
· Личное сообщение · #2

а почему сохранять во временную rax? когда-то под x86 писал примитивнейший код, с записью адреса возврата в свою секцию или в область с атрибутом записи

Code:
  1. ; ESP TRICK START
  2. MOV DWORD PTR DS:[svoya_yachejka_1],ESP
  3. MOV DWORD PTR DS:[svoya_yachejka_2],EAX
  4. MOV EAX,DWORD PTR DS:[ESP]
  5. MOV DWORD PTR DS:[svoya_yachejka_1],EAX
  6. MOV EAX,DWORD PTR DS:[svoya_yachejka_2]
  7. ADD ESP,4         
  8.  
  9. ;PATCH CODE HERE
  10.  
  11. ; ESP TRICK END
  12. MOV DWORD PTR DS:[svoya_yachejka_2],EAX
  13. MOV EAX,DWORD PTR DS:[svoya_yachejka_1]
  14. MOV DWORD PTR DS:[ESP-4],EAX
  15. MOV EAX,DWORD PTR DS:[svoya_yachejka_2]
  16. ADD ESP,-4

если задача
ajax пишет:
нужен адрес возврата из процедуры.

то вполне можно финтить и возвращаться по сохраненному адресу.

-----
Array[Login..Logout] of Life





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 сентября 2017 13:53 · Поправил: ajax
· Личное сообщение · #3

потому что, есть разнообразие, компилер же генерит
Code:
  1. 4F0730                 push    rbx
  2. 4F0731                 sub     rsp, 20h
  3. 4F0735                 mov     rbx, rcx
  4. 4F0738                 call    GetStack
  5. ...
  6. 4F0770                 push    r13
  7. 4F0772                 push    rdi
  8. 4F0773                 push    rsi
  9. 4F0774                 push    rbx
  10. 4F0775                 sub     rsp, 38h
  11. 4F0779                 mov     rbx, rcx
  12. 4F077C                 mov     esi, edx
  13. 4F077E                 mov     edi, r8d
  14. 4F0781                 mov     r13, r9
  15. 4F0784                 call    GetStack

это не x86, в чем и нюанс

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 сентября 2017 15:08
· Личное сообщение · #4

жаль что не msvc
там вроде есть
https://msdn.microsoft.com/en-us/library/s975zw7k.aspx




Ранг: 338.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 16 сентября 2017 15:20
· Личное сообщение · #5

ajax

А зачем вам адрес возврата ?

Просканить стек и найти указатель на процедурное ветвление очевидно.

-----
vx




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 16 сентября 2017 16:44 · Поправил: dosprog
· Личное сообщение · #6

ajax пишет:
процедур типа AAA может быть очень много. все с разными параметрами.


.. и с разным количеством локальных переменных..




Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 16 сентября 2017 16:55 · Поправил: UniSoft
· Личное сообщение · #7

А такое не подойдет?
Code:
  1. procedure TForm1.btn1Click(Sender: TObject);
  2. var
  3.   p: Pointer;
  4. begin
  5.   p := ReturnAddress;
  6.   edt1.Text := Format('%p', [p]);
  7. end;


delphi не юзаю...
а в msvc есть функция _ReturnAddress();



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 16 сентября 2017 17:32
· Личное сообщение · #8

Сделать на каждую процедуру ассемблерную обертку, чтобы сохраняла адрес возврата в TLS.



Ранг: 58.0 (постоянный), 13thx
Активность: 0.020.01
Статус: Участник

Создано: 16 сентября 2017 20:46
· Личное сообщение · #9

Ты какую проблему-то решить хочешь?




Ранг: 338.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 16 сентября 2017 23:38
· Личное сообщение · #10

kunix

Замена адреса возврата и сохранение его в локальном хранилище - это техника виксов(маршрутизация) и не совместима с защитой, особенно на 64.

Вопрос в том, зачем нужно получать адрес возврата ?

-----
vx





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 17 сентября 2017 09:55
· Личное сообщение · #11

все вышеприведенное не катит. повторю, это x64. клерк - хочу знать, какая из процедур вызвала мою

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 17 сентября 2017 10:41 · Поправил: UniSoft
· Личное сообщение · #12

ajax
Так а все-таки чем же не подходит встроенная интринсик функция ReturnAddress?
она прекрасно справляется и в x64... активно юзается в том-же system.pas
Все же компилятору то лучше знать, где лежит адрес возврата.

ну или как альтернатива: AddressOfReturnAddress, в случае если нужен именно адрес где лежит адрес возврата.

http://chuacw.ath.cx/blogs/chuacw/archive/2014/05/30/undocumented-delphi-routines.aspx

| Сообщение посчитали полезным: ajax, Gideon Vi


Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 17 сентября 2017 10:48
· Личное сообщение · #13

ajax пишет:
какая из процедур вызвала мою

Вопрос процедуры вызывающие вашу, всё ваша программа, или могут вашу процедуру использовать другие программы?

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 17 сентября 2017 11:20
· Личное сообщение · #14

ну можно поизвращаться, а что там в делфи макросы есть ?
можно нашлепать равного кода где

push some_magic_valN;
callfunc();
pop;

а в callfunc() поискать по стеку и найти пред последнее значение перед some_magic_valN

если так неугодны документированы способы))




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 17 сентября 2017 11:34 · Поправил: ajax
· Личное сообщение · #15

UniSoft офигеть, катит!
ClockMan все мое

-----
От многой мудрости много скорби, и умножающий знание умножает печаль



 eXeL@B —› Программирование —› Получить адрес возврата из стека
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати