Овощи.

Тема в разделе "WASM.HEAP", создана пользователем Clerk, 9 окт 2010.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Здрасте.
    Вот флудят, флудят.. конекретный вопрос. Вот топик http://www.wasm.ru/forum/viewtopic.php?id=38895.
    Задача:
    Есть функция X, это кэлбэк который известен. Функция Y вызывает функцию X, причём есть множество промежуточных функций. Тоесть Y() -> A() -> B() -> C()... -> X(). Число функций не известно. Также не известен адрес возврата из функции A() в функцию Y(), так как она не экспортируется и поиск сложен. Как получить управление при возврате из функции Y() без патча ?

    Кто тут может это решить ?
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    запретить в X чтение из стека, ловить исключения. только как вы Y опознаете?
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qqwe
    Каким образом это сделать ?
    Как вы опознаете Y() ?
    Известен адрес Y и X.
     
  4. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Точки останова (аппаратные) ставить можно?
    Тогда просто ставим её на первую инструкцию Y и смотрим на первое dword стека - это и есть адрес возврата в A. Остаёться лишь поставить бекпойнт на него.
    Кстати, ещё если по условию стек изменять можно, то надо подменить адрес возрата на наш и вторая точка останова не потребуется. А в конце нашей процедуры запихиваем в стек старый адрес и делаем ret. А ещё проще - jmp [old_addr].
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KIV
    Хардварные брейки требуют обработку исключений, что сделать нельзя, например изза IRQL.
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    если прога на ebp фреймах, то что мешает спуститься по ним до нужного уровня?

    old ebp == [ebp]
    ret pt == [ebp + 4]

    а что мешает тогда схватить Y на входе?
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qqwe
    Как определить что возврат выполняется в Y(), если адрес возврата из A() не известен ?
     
  8. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Как я понимаю в обработчике одного исключения вполне может вызваться другой - сам процессор против не будет, но в Windows (а быть может и других ОС) если исключение произошло во время обработки прерывания будет BSOD. Если я прав, то можно временно изменить элемент IDT на свой собственный, который будет лишён этого недостатка. А потом восстановить. Если нельзя вызывать прерывания, то и переключения контекста не произойдёт, поэтому другие задачи не пострадают от временного изменения IDT. Поправьте, если я не прав, ибо это лишь мои догадки.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KIV
    Не нужны никакие исключения.
     
  10. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    если у нас есть адрес и нам надо узнать в функции Y он или нет, то достаточно просканировать память начиная с Y в поисках первого ret. Это и будет точка выхода из A. Компиляторы ЯВУ как правило генерируют лишь один эпилог, а преждевременные return лишь jmp на эпилог. Однако если функция писалась на асме, то точек выхода может быть несколько и мой подход не сработает.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Некоторая идея. Когда мы попадаем в колбек(если я правильно понял, то колбэк это наша функция), то ничто нам не мешает проанализировать содержимое стека. Мы знаем адрес Y и эмпирически можем прикинуть или даже точно узнать размер этой функции. При анализе стека мы можем сразу откинуть достаточно большую часть значений не подпадающих под критерий возможности вызова из Y(значения меньшие адреса Y и превосходящие наш эмпирический максимум.) Далее надо взять очередное подходящее значение из стека, посмотреть что лежит по-этому адресу, если это call xx, то с большой долей вероятности мы нашли что хотели. Далее наверняка мы легко сможем узнать размер стековых данных Y, ну а далее дело за малым. Чтобы уж наверняка не промахнуться, можно проанализировать и инструкцию по адресу возврата из Y, там должно лежать call Y, а это признак стопудового попадания в бинго.
    Кстати, можно сразу начинать искать это самое бинго. ^)
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ещё там могут быть вещи типа call [eax]. В общем это не 100% решение, но думаю имеет право на жизнь.
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Только по-моему этот вопрос не раз обсуждался? Дизассемблировали Y нашли все call сравнили адрес возврата с call+5 и всё. Последовательное сканирование не подойдёт, т.к. функция может быть раскидана по частям.
    Подменить адрес возврата в стековом фрейме
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Как вы узнаете размер функции, которая размазана по всему модулю, как это обычно бывает в системных модулях ?
    KeSqueer
    Норм., ида и олли делают фактически тоже самое. Вот как это конкретно решить ?
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Тогда не будем ничего брать эмпирически, хотя в конкретном случае и можно сделать доп. ограничение сверху.
     
  16. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Не понял, что значит "конкретно". Последовательность действий, которые нужно осуществить в колбэке, чтобы управление после выхода из Y попало куда нужно?
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    А если так ?
    Код (Text):
    1. A:
    2.     ...
    3.     jmp A1
    4. B:
    5.     ...
    6.     jmp B1
    7. A1:
    8.     ...
    9.     jmp A2
    10. B1:
    11.     ...
    12.     jmp B2
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Не понял, при чём тут вообще jmp?
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Ну вы говорите про какието лимиты и ограничения, код обычно вперемешку идёт с другим кодом, а не просто линейная процедура.
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Лимиты не обязательны и без них данный алгоритм работоспособен. Можно ограничить целым модулем, а можно вообще не ограничивать.