Удобный способ сохранения регистров

Тема в разделе "WASM.BEGINNERS", создана пользователем Entropy, 23 июл 2023.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    У меня как у новичка,часто возникает такой вопрос каким можно наиболее удобным способом сохранить те или иные регистры перед вызовом WinApi функции или любой другой функции из другой DLL-библиотеки,в тех или иных алгоритмах использую регистры для хранение тех или значений,изменение этих ранее подготовленных регистров становится причиной проблем.
     
  2. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    155
    на стек положи
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    стёк менять не желательно, я эти регистры использую для другого и не собираюсь передавать через них аргументы
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    pushad/popad. Если апя возвращает булеву переменную можно сравнение перед popad'ом вставить, а после него условный переход. Другая уловка - вписать в макрос stdcall нужные регистры после аргументов, после вызова pop'нуть, но это чисто ради красоты в исходнике.
     
  5. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    f13nd, в x64 такое прокатит ?
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Неа. Но сам х64 в большинстве случаев не катит.
     
  7. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    f13nd, единственный вариант который мне в голову приходит,так это создавать переменные, а затем сохранять в этих пременных значения регистров перед вызовом функции,но мне это кажется не удобным
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Чтобы был смысл так делать, значение должно использоваться многократно между пересылками в память и обратно.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Если ты такой стека-фоб и у тебя может работать не один поток, то не просто "статические" переменные, а thread-local переменные.
     
  10. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Ну типа это ход конем: спасать значение регистра от пожирания одной апёй, скармливая его другой апе, которая похоронит все остальные несохраненные значения регистров.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Далеко не обязательно. Ты можешь выделить буферы для сохранения контекста на куче для каждого потока и держать указатель на буфер на стеке потока. Это по сути тоже будет локальной для потока переменной. Можешь руками в TEB лазить и обойтись без вызова TLS'ых апишек, если легких путей не ищешь.
     
  12. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    А выигрыш тогда в чем, если и там и там память, адресуемая по базе в регистре? Ты как крелк, сам с чего-то решил, что нужны "статические" переменные и сам себе дал совет как их реализовать.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Чтобы не держать контекст на стеке, человек же не хочет на стеке.

    Я, как и любой другой магл, хочу казаться спецом, это нормально.
     
  14. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    "На стеке" подразумевает манипуляции с верхушкой стека, то есть пуши и попы, но в х64 чаще всего стек-фрейм по rsp адресуется (то, под чего в х32 обычно используется ebp). Это загадочное адресное пространство, где хранятся локальные переменные в процедурах у цэшников.
     
  15. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Если не собираетесь передавать аргументы через регистры, то х32 что-ли приложение?
    Тогда pusha/popa ваш вариант. Просто можно пушить не в системный стек, а создать фиктивный (например в секции-данных), и перед pusha записать его адрес в ESP. Это избавит от нудного сохранения/восстановления каждого регистра в переменные. Правда х64 не поддерживает pusha, поэтому там только ручками. Примерно так..

    Код (ASM):
    1. format   pe gui
    2. entry    start
    3. include 'win32ax.inc'
    4. ;//----------
    5. .data
    6. fp        dq   202307.158739
    7. align     16
    8. frame     rb   128    ;// фиктивный стек
    9. newStack  dd   0      ;// указатель на его макушку
    10. buff      db   0
    11. ;//----------
    12. .code
    13. start:  mov     ebp,esp
    14.         mov     esp,newStack
    15.         pusha                  ;// сохраняем сразу все регистры в "переменные"
    16.         mov     [newStack],esp
    17.         mov     esp,ebp
    18.  
    19. ;// здесь что-то делаем..
    20.        cinvoke  vsprintf,buff,<'Float = %lf',0>,fp
    21.         invoke  MessageBox,0,buff,<'Win32 Stack',0>,0
    22.  
    23.         mov     ebp,esp
    24.         mov     esp,[newStack]
    25.         popa                   ;// восстанавливаем регистры
    26.         mov     esp,ebp
    27.  
    28.         invoke  ExitProcess,0
    29. ;//----------
    30. section '.idata' import data readable
    31. library  msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',user32,'user32.dll'
    32. import   msvcrt,vsprintf,'vsprintf'
    33. include  'api\kernel32.inc'
    34. include  'api\user32.inc'
    35.  
     
    Mikl___ нравится это.
  16. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    Marylin, вот эта строчка вашего кода,тут где то Инди писал что нельзя переключить стёк на произвольный адрес,как вообще система отреагирует на то что я перезаписываю адрес указателя стёка ?
    Код (Text):
    1.  
    2. .code
    3.  mov     esp,newStack
    4.  
    --- Сообщение объединено, 5 авг 2023 ---
    а если функция принимает например 5 аргументов,эти 5 аргументов передам через стёк,а вот 6 аргументом я положу в стёк нужный мне регистр,такой вариант сработает ?
     
  17. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    моя Win7 x64 нормально реагирует, и код выше тому подтверждение,
    а вообще почитайте КК "Ассемблерные извращения - натягиваем стек" - там всё расписано.
    фрагмент статьи лежит здесь: https://evilfingers.com/publications/research_RU/asm-stack-hck.pdf
     
  18. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    да
    --- Сообщение объединено, 17 авг 2023 ---
    я для x64 это учту,спасибо
     
  19. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    а полная версия есть в наличии?...
     
  20. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    alex_dz, у меня нету.
    по ходу это фрагмент из какой-то книги.