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

Discussion in 'WASM.WIN32' started by Flasher, Sep 5, 2017.

  1. Flasher

    Flasher Member

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

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

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

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

    Flasher Member

    Blog Posts:
    0
    Joined:
    Jan 31, 2004
    Messages:
    640
    А попроще никак? :) Чтоб не зависить версий браузера. ..на уровне winapi ставить хук.
     
  4. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Flasher,

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

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

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

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    Почему? Все так делают уже десятки лет и работает, как часы.
     
  6. Minzdrav

    Minzdrav Well-Known Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2017
    Messages:
    1,082
    Я со старого компа зашёл вчера на Ютуб. А он мне пишет
    - вы не можете пользоваться ютубом ваш Фаирфокс устарел.
    Теперь надо ОС менять, пароль не помню.
     
  7. Minzdrav

    Minzdrav Well-Known Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2017
    Messages:
    1,082
    Через ГРУБ вспомнил что можно пароль сбросить.
    Переустановил фаерфокс, зашло на Ютуб. Вобще
    обнаглели. Линкс не устарел а фаерфокс устарел.
    Как он вообще устареть может?
     
  8. RET

    RET Well-Known Member

    Blog Posts:
    17
    Joined:
    Jan 5, 2008
    Messages:
    789
    Location:
    Jabber: darksys@sj.ms
    ТС, все там сводится к GDI обычному
     
  9. Flasher

    Flasher Member

    Blog Posts:
    0
    Joined:
    Jan 31, 2004
    Messages:
    640
    Ковырять еще не начал, да и плохо это у меня получается. А куда копать? В сторону Firefox\xul.dll (который кстати весит почти 50мб)?
    Попытался через KiFastSystemCallRet глянуть вызываются-ли:
    Code (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

    Blog Posts:
    17
    Joined:
    Jan 5, 2008
    Messages:
    789
    Location:
    Jabber: darksys@sj.ms
    Да типа TextOut ExtTextOut и иже с ними. Но может и директХ там, я точно не припомю, недавно для Оперы делал, там GDI
     
  11. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    RET,

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

    RET Well-Known Member

    Blog Posts:
    17
    Joined:
    Jan 5, 2008
    Messages:
    789
    Location:
    Jabber: darksys@sj.ms
    Ну там хардкор с шадовом точно не юзают
     
  13. RET

    RET Well-Known Member

    Blog Posts:
    17
    Joined:
    Jan 5, 2008
    Messages:
    789
    Location:
    Jabber: darksys@sj.ms
    В опере к примеру берется TextOutW стандартный, там клиентректы не надо
     
  14. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    RET,

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Вот например посмотрел стандартный блокнот 7-ки, сервис который выводит текст в ShowCaret(): NtUserShowCaret, так как это первый сервис, который был вызван после TextOut().