Задача про "кашерную заглушку"

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

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    такая ситуация: есть в одном ПО функция (экспортируется из длл), которая вызывается довольно часто... в ПО внедряется код (машинный код x86/x64)... в пролог функции ставится трамплин на внедренный код... код должен выполниться только один раз, до полезной нагрузки кодом происходит удаление трамплина и восстановления замененных байт функции... но все портит тот факт, что в ПО может быть несколько потоков... то есть примерно в 50% случаев до того, как внедренный код успеет восстановить оригинальный пролог функции, эту функцию успевает вызвать другой поток (а ведь код должен выполниться не более одного раза)... плюс в том, что известно, что если из функции вернуть 0, то ничего страшного с другим потоком не произойдет, а так же известно, что функция stdcall в x86 и fastcall в x64... вопрос в том, как грамотно сделать заглушку, чтобы при втором и последующих попытках прохождениях кода из функции возвращался 0 (как вернуть ноль я знаю, вопрос именно в заглушке)... и ещё одно условие: при внедрении код можно только исполнять и читать, права на запись самого себя у кода нет... как бы вы решали такую задачу?

    ЗЫ чем меньше размер кода заглушки - тем лучше...
    ЗЗЫ хоть и были фразы про машинный код, лучше предлагайте решение на ассемблере... так понятнее...
     
  2. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    CreateMutex подойдёт?
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Код (Text):
    1.     mov eax, [original_func_ptr]
    2.     xchg eax, [p]
    3.     jmp eax
    4. hook_code:
    5.     ......
    6.  
    7. p dd hook_code
    при первом прохождении в eax будет адрес hook_code, при последующих - original_func_ptr
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    нет, ну можно было бы сделать по какому-либо механизму синхронизации, но к сожалению это займет существенное количество байт... к тому же объект синхронизации нужно делать именованным для задачи...

    дело в том, что второй и более проход по коду может сделать только другой поток (со своим контекстом)...
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Rel
    и что?
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Тогда можно сделать глобальную переменную и при первом проходе выставить её, а потом перепрыгивать. Смотреть в сторону
    Код (Text):
    1. lock cmp [addr],0
    2. lock cmove [addr],1
    3. je kudanado
    кмове, только надо выбрать подходящий.
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Rel
    Код (Text):
    1. p dd hook_code
    это глобальная переменная, одна для всех потоков
    xchg eax, [p] обеспечивает атомарный доступ,
    этому коду пофиг на потоки %)
     
  8. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Код GoldFinch, действительно лучше.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Z3N
    Ибо фасм его компилит, как один из немногих тут ?
    Rel
    Модификация кода умерла вместе с Ремой.
     
  10. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Ну, если немного пошевелить мозгами, то становится понятно, что он лучше изза своей красоты и простоты. Мой код смотрится рядом с ним довольно неуклюже, также как и пост Clerkа
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Z3N
    А чего тогда сразу не CMPXCHG? Собссно, для того и придумано было...