Функции, которые не чистят за собой стек

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 4 авг 2017.

  1. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    352
    В винде есть функции, которые не чистят за собой стек полностью и оставляют в нем некоторые данные. Можете привести пример таких функций? По какому принципу их искать?

    Принятая в Windows конвенция вызова заставляет функции чистить за собой стек, и это осложняет поиск таких функций для антиэмульки.
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Aoizora,

    Не понятно. В си конвенции вызова стек чистит компилятор, не система, задайте иной прототип и будет вам отсутствие чистки стека.

    Есть процедуры с переменным числом аргументов, типо DbgPrint().

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

    Вы не сказали КАК и ЧТО вы будите искать в стеке, если он сместится.
     
  3. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    352
    Хочу попробовать обойти эмуляцию, отыскивая в стеке то, что функция не убрала за собой, потому что заглушки на API просто имитируют поведение функции, которое не соответствует выполнению функции на реальном процессоре. Вот думаю, если ли такие API, которые чистят свои аргументы, но оставляют что-то еще, какие-нибудь промежуточные значения.

    Что за трикс со смещением стека?
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Aoizora,

    Если при си конвенции вызова не очищен стек, в нём останутся аргументы функции, тоесть произойдёт смещение стека.

    Давайте рассмотрим стек подробно. Возьмём для примера сложную функцию, с большим уровнем вложенности, допустим загрузку модуля. Что будет в стеке после возврата и как вы это будите использовать ?

    > заглушки на API просто имитируют поведение функции, которое не соответствует выполнению функции на реальном процессоре.

    Был введён такой термин как атом, это виртуальный шлюз, код которого не доступен для чтения и выполнение которого не может быть изменено вызывающим кодом. Как пример - системный сервис. Это ядерный шлюз, который не использует текущий юзер стек и выполнятся как одна инструкция. Так же происходит вызов сложных функций в вм - она встречает сигнатуру шлюза, после чего запускается обработка интерфейса, без использования контекста потока.

    В отличие от атома, реальный код оставляет в стеке большие обьёмы данных. Но есть одна проблема, эти данные обычно - шум. Что бы привязать какой то участок этого буфера к реальной функции нужно использовать сложные методы(визоры, конструкторы).

    Выборка данных - хороший способ, но тоже не особо простой и не в две строки решается.