Сейчас на форуме: vsv1, Alf (+4 невидимых)

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

Ранг: 20.4 (новичок), 8thx
Активность: 0.030
Статус: Участник

Создано: 18 июня 2015 00:03
· Личное сообщение · #1

Вот призадумался над такой вещью: допустим стек, в привычном понимании не существует (что-то типа naked для всех процедур программы). У нас есть какая-то область памяти, где стандартными командами MOV [const], reg32(и т.п.) мы ведем обмен данными. Много ли мы выгадаем по отмизации от освободившихся регистров ESP, EBP? Я, кстати, не видел ни разу, чтобы в протекторах были подобные трики.



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

Создано: 18 июня 2015 00:07
· Личное сообщение · #2

А каким образом "все процедуры программы" станут выполнять возврат?..

Что-то сегодня прям день вопросов..




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

Создано: 18 июня 2015 00:33
· Личное сообщение · #3

hello пишет:
Я, кстати, не видел ни разу, чтобы в протекторах были подобные трики.

а что в этом необычного? делать свой "стек" для обмена данными между процедурами прежде всего нужно для удобства в некоторых случаях, например, свой call 007F2064:
Code:
  1. <007F2064>
  2. ; volume id patch
  3.          ; ESP TRICK START
  4.          MOV DWORD PTR DS:[007F26A0],ESP
  5.          MOV DWORD PTR DS:[007F26B0],EAX
  6.          MOV EAX,DWORD PTR DS:[ESP]
  7.          MOV DWORD PTR DS:[007F26A0],EAX
  8.          MOV EAX,DWORD PTR DS:[007F26B0]
  9.          ADD ESP,4
  10.          ; ESP TRICK END
  11.          ; PROGRAM CODE START
  12.          CALL DWORD PTR DS:[51B1A8]         ; GetVolumeInformationA
  13.          ; PROGRAM CODE END
  14.          ; PATCH START
  15.          PUSH EAX  
  16.          MOV EAX,DWORD PTR DS:[ESP-10]
  17.          MOV DWORD PTR DS:[EAX],106351C7
  18.          POP EAX
  19.          ; PATCH END
  20.          ; ESP TRICK START
  21.          MOV DWORD PTR DS:[007F26B0],EAX
  22.          MOV EAX,DWORD PTR DS:[007F26A0]
  23.          MOV DWORD PTR DS:[ESP-4],EAX
  24.          MOV EAX,DWORD PTR DS:[007F26B0]
  25.          ADD ESP,-4
  26.          ; ESP TRICK END
  27.          RET


007F26A0
007F26B0
это временные ячейки для хранения данных для корректного возврата при различных манипуляций с патч-кодом в секции с атрибутами rwe. предполагаю, что запись в регистр проца быстрее, чем в память.

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




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

Создано: 18 июня 2015 00:42 · Поправил: dosprog
· Личное сообщение · #4

)) Фух. Так речь идёт о перестановке ESP на свой собственный стек.. Витиевато однако.

Регистр EBP использовать никто не заставляет, с ним просто удобнее, - а ESP всё равно не должен указывать куда попало.

Это делалось в обязательном порядке в резидентных DOS-программах, чтобы не разрушить чей-нибудь стек при работе резидента.

Также это применялось в различных DOS-защитах для противодействия отладке.

Например:

Code:
  1. model tiny
  2. .code
  3. org 100h
  4. start:
  5.         cli       ;; чтобы сработавшее прерывание не разрушило конец этой процедуры
  6.         mov cs:stk,sp
  7.         mov sp, offset stk    ;; теперь стеком пользоваться нельзя
  8.  
  9.         nop
  10.         nop
  11.         nop
  12.         nop
  13.         ;..................... тут отладчик будет разрушать конец этой же процедуры
  14.         ;.....................
  15.         ;.....................
  16.         ;.....................
  17.  
  18.         mov sp, cs:stk
  19.         sti
  20.         ret
  21.         ;=====
  22. stk dw ?
  23. end start


В WIN32-программах такие выверты от отладки не спасут.





Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 18 июня 2015 07:29
· Личное сообщение · #5

Вообще тема довольно забавная.
Kindly пишет:
делать свой "стек" для обмена данными между процедурами прежде всего нужно для удобства в некоторых случаях

Я в одной проге, для себя тоже так делал свой стек с блекджеком и ... Сравнительно давно эт было.
Еще добавлял, что-то типа:
Code:
  1. XOR ESP, ESP
  2. или
  3. MOV ECX, EAX
  4. XOR EAX, ESP
  5. XOR EAX, ECX
  6. ...
  7. MOV ESI, [EAX+0x4]

Такое отсуствие здравого рассудка, запутывало Иду и вводило в некоторый ступор Hex-Rays




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 июня 2015 10:49
· Личное сообщение · #6

Любой внешний вызов потребует стека, поэтому весь этот онанизм не имеет какого-либо смысла. Костыли с эмуляцией стека в нужных местах с лихвой покроют весь профит от 1 лишнего регистра.

| Сообщение посчитали полезным: ClockMan, plutos, DenCoder

Ранг: 20.4 (новичок), 8thx
Активность: 0.030
Статус: Участник

Создано: 18 июня 2015 12:34
· Личное сообщение · #7

Archer пишет:
Любой внешний вызов потребует стека

Да, но ведь можно обойтись без CALL. Обычные безусловные/условные переходы. А регистр ESP как раз под возврат использовать
Code:
  1. MOV ESP, retaddr
  2. JMP ESP
  3. Или
  4. JMP [ESP]

VM так и поступают, кстати.
А XOR ESP, ESP это конечно весело.




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

Создано: 18 июня 2015 12:40
· Личное сообщение · #8

hello пишет:
Да, но ведь можно обойтись без CALL

А если внутри Call находятся десятки саll как ты будешь выкручиваться?
hello пишет:
JMP [ESP]

Значит ты уже что то вписал в стек а я яй а ведь

hello пишет:
Программа без использования стека



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





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 июня 2015 13:23
· Личное сообщение · #9

hello
Ещё раз: любой внешний вызов, типа винапи, будет ожидать аргументы, как и адрес возврата, в стеке. Не говоря об исключениях, вызовах из ядра, типа APC и тд. И не пытайтесь рассказать, что будете писать хоть сколько-нибудь серьёзное приложение без этого всего.
Не говоря о том, что при множестве вложенных call для хранения всей цепочки адресов возврата ты изобретёшь свой стек с квадратными колёсами.

| Сообщение посчитали полезным: ullf

Ранг: 20.4 (новичок), 8thx
Активность: 0.030
Статус: Участник

Создано: 18 июня 2015 16:45
· Личное сообщение · #10

Archer пишет:
будет ожидать аргументы, как и адрес возврата, в стеке.

Да это понято. Тут согласен. Я имею ввиду, прежде всего, замену стека в большинстве главных фунок программы. А критические вызовы WinAPI пусть юзают стек.
ClockMan пишет:
Значит ты уже что то вписал в стек а я яй а ведь

ESP, в данном случае, указывает на секцию. text



Ранг: 7.0 (гость)
Активность: 0.020
Статус: Участник

Создано: 19 июня 2015 21:56
· Личное сообщение · #11

hello пишет:
ESP, в данном случае, указывает на секцию. text

и что? это все херня. толку нуль. призводительность не возрастет

Добавлено спустя 1 минуту
только не говорите, что напишете ось для того, чтобы вообще стек не юзать



Ранг: 20.4 (новичок), 8thx
Активность: 0.030
Статус: Участник

Создано: 19 июня 2015 22:46
· Личное сообщение · #12

motoroller пишет:
напишете ось для того, чтобы вообще стек не юзать

По крайней мере, это может использоваться для всяких протекторов,чтобы ослеплять существующие анализаторы.способ конечно дурной, но с оглядкой на говностарфорс, всяко может быть.
motoroller пишет:
толку нуль. призводительность не возрастет

Самый оптимальный вариант освободившегося лишнего регистра ESP -в долгих циклах, но не слишком длинных. И без использования внешних вызовов WinAPI.
Я понимаю, что это некоторый бред, но кто его знает, что станет трендом лет через пять



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

Создано: 19 июня 2015 23:39 · Поправил: dosprog
· Личное сообщение · #13

hello пишет:
И без использования внешних вызовов WinAPI.


Вообще без вызовов процедур.


hello пишет:
но кто его знает, что станет трендом лет через пять

Это - не станет. Было уже лет ..надцать назад

ClockMan пишет:
Самый оптимальный вариант перевести код( и то не весь) на FPU регистры......

Ну вот, ещё наУчите ..






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

Создано: 20 июня 2015 00:44
· Личное сообщение · #14

hello пишет:
Самый оптимальный вариант освободившегося лишнего регистра ESP -в долгих циклах

Самый оптимальный вариант перевести код( и то не весь) на FPU регистры......

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




Ранг: 20.4 (новичок), 8thx
Активность: 0.030
Статус: Участник

Создано: 20 июня 2015 07:20
· Личное сообщение · #15

ClockMan пишет:
Самый оптимальный вариант перевести код( и то не весь) на FPU регистры......

Тогда уж добавить SSE2 по вкусу, а именно их регистры, для хранения всяких массивов и строк вместо стека. Впрочем, это немного очевидно.




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

Создано: 25 июня 2015 09:26
· Личное сообщение · #16

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

А так, чтобы избавиться на x86/x64 полностью от стека - невозможно! Если только свою ось изобребсти, и то стека не будет только лишь в юзермоде! )

-----
IZ.RU


| Сообщение посчитали полезным: TLN
 eXeL@B —› Вопросы новичков —› Программа без использования стека
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати