Сплайсинг в User-Mode на x86

Тема в разделе "WASM.WIN32", создана пользователем NDIS, 15 июл 2008.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    пожелание: пытайтесь кодить без махинаций и без "хек-приемов"

    Учитывайте, что до вас может стоять перехватчик и после вас.

    Неприятно когда кул-руткиты валят систему, а после восстановления кул-антивирусы валят ее повторно
     
  2. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Для этого пролога - да. Но и то: нужно считать значение в памяти по адресу [esp] (т.е. найти то, что было в ebp), а затем сменить контекст потоку, увеличив esp на 4 и изменив ebp с eip. И все это ради одной простейшей инструкции...

    Реализовать общий вариант отката инструкций - очень много делов, оно не стоит того. Действительно, лучший вариант, это
     
  3. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    каждая(почти) апя вызывает низкоуровненвую функу или чтонить из нтдлл или то,что выполнит SYSENTER через определенную такую оболочку типа:

    Код (Text):
    1. mov eax,syscode
    2. mov edi,const
    3. call  edi
    сплайсить такую оболочку довольно просто ;)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Альтернатива - найти инструкцию, которая занимает размер больше либо равный инструкции перехода, типо 5 или 2 байта, в случае 2 это короткий переход и тогда предётся искать свободное место в пределах +-128 байт, но обычно перед функцией есть свободное место, скопировать код в буфер. Это исключит проверку Eip потока. Либо использовать DR.
     
  5. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    a1ss
    не всегда применим такой сплайс, т.к. до SYSCALL'a выполнится еще куча r3-кода, насколько я понимаю...
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Неприменим только если функция полностью реализована в r3
     
  7. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    ну и что? ну пусть даже не всегда, но в большинстве случаев.. зато дизасмить не надо и сплайс обходится в редактирование 4х байт адреса и собсно размещением шеллкода.
     
  8. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    a1ss
    не буду разводить флейм) с синхронизацией проблема отпадает, это плюс..
    за идею спс в любом случае ;)
     
  9. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    дай список функций для сплайса
     
  10. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Если например использовать lock cmpxchg8b для атомарно записи 8 байт, то возникает вопрос, вот все говорят "А что если поток остановился на перазаписываемой инструкции, и при пробуждении он окажется на половине записной инструкции(например jmp 5байт)", поскольку операция атомарна то можно и не усыплять все потоки, так? потом если поток сам остановился( например какаято функция ожидания sleep,WaitForSingleObject. А не планировщик его усыпил когда у того кончился квант времени ) то eip этого потока полюбому не будет на нашей инструкции, а как быть с теми потоками которые остановил планировщик? это ведь происходит настолько быстро что пока будешь сканировать ситуация уже поменяется...

    Блин может я чего то не так понимаю, объясните пожалуйста... Реализовал перехват на основе lock cmpxchg8b, на однопроцессорной системе покачто работает стабильно
     
  11. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    NDIS
    Приведи список функций которые хочешь контролировать и в каких библиотеках.
    Есть идея, смысл в том что какая-то функция передает управление на код посредством ссылки в секции данных, а функции которые хотим контролировать её вызывают, например memmove её мы можем перехватить модификацией определенного указателя в секции данных, в обработчике делаем раскрутку стека, т.е. получаем каждый адрес возврата в цепочке (естественно делаем это до определенного момента), берем этот адрес возврата и идем до пролога функции и уже этот адрес сравниваем с адресом функции, которую хотим контролировать, если равны, изменяем адрес возврата в стеке на нашу процедуру обработчик, либо делаем какие-то другие действия вообще смотреть надо для определенной функции.
    Из недостатков то, что контролировать так можно только некоторые функции и только на определенном этапе, но все же можно и довольно эффективно.
    Из плюсов определить начальное значение переменной довольно сложно, и такой перехват сложно обнаружить, покрайнимере я не видел программ которые каким либо образом проверяют секцию данных на модификации.
     
  12. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    2FED
    Пока процессор не закончит исполнять инструкцию его прервать невозможно. Если она выполняется атомарно то процессор который первый захватил шину исполнит инструкцию, остальные его будут ждать.
     
  13. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    не ну допустим функция начинается так

    push ebp
    ;---------;Поток остановился сдесь, eip указывает на следующию инструкцию.
    mov ebp,esp
    ....

    тут в это время мы вместо этого пролога записываем
    jmp mem32

    и получается когда поток проснётся он вместо инструкции попадёт на адрес mem32.

    тоесть если поток сам себя усыпил врядли он на этом месте остановится, но как быть с планировщиком?
     
  14. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Запишется этот jmp mem32, нарушится последовательность, так нельзя делать. Следует модифицировать инструкцию размером равным либо большим новой.
     
  15. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    2FED
    прочитай тему с начала. уже обсуждалось.