проблемы с перехватом

Тема в разделе "LANGS.C", создана пользователем XshStasX, 12 янв 2010.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вообще говоря код зависимый от версии виндовс некрасив, тем более для таких задач... я обычно делал две версии (x86 и x64), поскольку целевая винда была 32ух и 64ех разрядная хр и виста... различия делал с помощью "#ifdef _WIN64"... это не сложно, главное помнить, что в x86 ILP32, а в х64 - LLP64, ну и про fastcall winapi функции в x64)))

    это чет слишком замудренно на мой взгляд... зачем так делать, если можно подменить первые пять байт на трамплин и объявить функцию-подменку так же, как оригинал? (аттач не смотрел ;))
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    эх, жаль, что убрали возможность редактирования своих постов((( метод подмены пяти первых байт работать будет везде... в x64 соответственно будет "метод подмены девяти первых байт")))
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    XshStasX
    Это как раз твой pushad\popad никакого значения не имеют ;)
    Сам мозгом пошевели - при вызове WriteFile в стек заталкивается 5*4 байт параметров, которые при отсутствии твоего корявого перехвата нормально снимаются при выходе из функции WriteFile. Ты же своим перехватом ставишь jmp на свою ф-ю mess без параметров, поэтому при выходе из нее никакие параметры со стека не снимаются и соотв-но после возврата в функцию, вызвавшую WriteFile, происходит разбалнс стека
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    практика показала что имеют.
    1) делаем жамп
    2)делаем pushad(для того чтоб все регистры сохранить)
    3)заходим в нашую функ. она из стека ничего не берет, а токо помещает в стек
    при завершении нашей функ. все что она положила(push) в стек то и вытянет(pop) из него
    А вот если у нее были параметры то она могла что-то затереть, так как она делает( pop внутри себя)
    У меня после перехвата идет дальнейшие выполнение WriteFile (поэтому и снимать параметры из стека низя)
     
  5. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Не учитывая IDP, шадова калбэки и прочие кульные техники видим нормальное решение: Ставим хардварный брейк на системный стаб. Имеем всё движения потока. А модификация кода это злопогонь.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    если не сложно можна подробней ?
     
  7. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Аппаратные точки останова на системный шлюз. Но это к примеру. Обычно найдутся решения позволяющие не использовать перезапись кода. Это например калбэк до вызова целевого кода.
     
  8. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    хардварные бряки на IDT не гуд, оч лехко свалиться в синьку
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    я так понял это из ring-0?
     
  10. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Medstrax
    Никто и не предлагал ставить точки останова на дескрипторные таблицы, темболее из юзермода и под винь :)