Как хукнуть функции браузера?

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 5 сен 2017.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А точнее - Firefox'a.
    Тут балуюсь FingerPrint'ами, которые может оставить/получить браузер. И вроде как почти все так или иначе получается отключить или подменить кроме rect'ов. Проверить вот тут.
    Вроде юзается функция object.getClientRects()
    Собственно вопрос, как и где перехватить эту функцию чтобы подсунуть другие данные.

    Благодарю за внимание.
     
  2. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Mozilla предостовляет доступ к private symbols к компилированым бинарникам от firefox. Качаем символы, из них узнаём положение сей функции. Подцепиваем стандартными методами: prologue detour (переписываем первые инструкции сей функции на jmp на перехват) или vtable hooking (если сей функции является виртуальной, переписываем ей function pointer в vtbl структуре). Последний метод более надёжный и лёгкий (на пример, можно использовать InterlockedCompareExchangePtr для корректной установки перехвата в присутствие параллельных потоков, вкл. возможность что они читает тот самый vtable function pointer одновременно с его перехватом.
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А попроще никак? :) Чтоб не зависить версий браузера. ..на уровне winapi ставить хук.
     
  4. Indy_

    Indy_ Well-Known Member

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

    ТЗ не корректно. В данном случае следует посмотреть начинку целевой апи и найти возможность фильтрации без изменения её кода. Или как то изменить cfg вызывающего кода, что бы выполнение прошло на нужный указатель.

    Всегда код адресуется непосредственно, на колбек имеется прямой указатель. При этом можно внести поправки в этот указатель, изменить его.

    Ну а код менять - забудьте про это, это нельзя делать.
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Почему? Все так делают уже десятки лет и работает, как часы.
     
  6. Minzdrav

    Minzdrav Well-Known Member

    Публикаций:
    0
    Регистрация:
    21 мар 2017
    Сообщения:
    1.082
    Я со старого компа зашёл вчера на Ютуб. А он мне пишет
    - вы не можете пользоваться ютубом ваш Фаирфокс устарел.
    Теперь надо ОС менять, пароль не помню.
     
  7. Minzdrav

    Minzdrav Well-Known Member

    Публикаций:
    0
    Регистрация:
    21 мар 2017
    Сообщения:
    1.082
    Через ГРУБ вспомнил что можно пароль сбросить.
    Переустановил фаерфокс, зашло на Ютуб. Вобще
    обнаглели. Линкс не устарел а фаерфокс устарел.
    Как он вообще устареть может?
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    ТС, все там сводится к GDI обычному
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Ковырять еще не начал, да и плохо это у меня получается. А куда копать? В сторону Firefox\xul.dll (который кстати весит почти 50мб)?
    Попытался через KiFastSystemCallRet глянуть вызываются-ли:
    Код (Text):
    1. NtGdiConvertMetafileRect
    2. NtGdiCreateRectRgn
    3. NtGdiCreateRoundRectRgn
    4. NtGdiExcludeClipRect
    5. NtGdiGetBoundsRect
    6. NtGdiIntersectClipRect
    7. NtGdiRectangle
    8. NtGdiRectInRegion
    9. NtGdiRectVisible
    10. NtGdiRoundRect
    11. NtGdiSetBoundsRect
    12. NtGdiSetRectRgn
    13. NtUserDrawAnimatedRects
    14. NtUserGetMenuItemRect
    15. NtUserGetUpdateRect
    16. NtUserInvalidateRect
    17. NtUserValidateRect
    Но тишина.

    А это слишком нагло будет попросить назвать к каким именно gdi сводится дело? ))
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Да типа TextOut ExtTextOut и иже с ними. Но может и директХ там, я точно не припомю, недавно для Оперы делал, там GDI
     
  11. Indy_

    Indy_ Well-Known Member

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

    Вывод текста в gdi может быть не явным, тоесть формируется спец запрос и при вызове любого сервиса выводится текст. Сделано для быстрой обработки, что бы не вызывать много раз ядро.
     
  12. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Ну там хардкор с шадовом точно не юзают
     
  13. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    В опере к примеру берется TextOutW стандартный, там клиентректы не надо
     
  14. Indy_

    Indy_ Well-Known Member

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

    TextOut() именно и использует batching, запрос на вывод формируется в памяти(TEB) и функция возвращает управление без вызова сервисов. Тогда пакет будет обработан при следующем вызове любого сервиса. Так как тс смотрит по сервисному логу, то вполне вероятно что там и не будет ожидаемых сервисов.
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Вот например посмотрел стандартный блокнот 7-ки, сервис который выводит текст в ShowCaret(): NtUserShowCaret, так как это первый сервис, который был вызван после TextOut().