А точнее - Firefox'a. Тут балуюсь FingerPrint'ами, которые может оставить/получить браузер. И вроде как почти все так или иначе получается отключить или подменить кроме rect'ов. Проверить вот тут. Вроде юзается функция object.getClientRects() Собственно вопрос, как и где перехватить эту функцию чтобы подсунуть другие данные. Благодарю за внимание.
Mozilla предостовляет доступ к private symbols к компилированым бинарникам от firefox. Качаем символы, из них узнаём положение сей функции. Подцепиваем стандартными методами: prologue detour (переписываем первые инструкции сей функции на jmp на перехват) или vtable hooking (если сей функции является виртуальной, переписываем ей function pointer в vtbl структуре). Последний метод более надёжный и лёгкий (на пример, можно использовать InterlockedCompareExchangePtr для корректной установки перехвата в присутствие параллельных потоков, вкл. возможность что они читает тот самый vtable function pointer одновременно с его перехватом.
Flasher, ТЗ не корректно. В данном случае следует посмотреть начинку целевой апи и найти возможность фильтрации без изменения её кода. Или как то изменить cfg вызывающего кода, что бы выполнение прошло на нужный указатель. Всегда код адресуется непосредственно, на колбек имеется прямой указатель. При этом можно внести поправки в этот указатель, изменить его. Ну а код менять - забудьте про это, это нельзя делать.
Я со старого компа зашёл вчера на Ютуб. А он мне пишет - вы не можете пользоваться ютубом ваш Фаирфокс устарел. Теперь надо ОС менять, пароль не помню.
Через ГРУБ вспомнил что можно пароль сбросить. Переустановил фаерфокс, зашло на Ютуб. Вобще обнаглели. Линкс не устарел а фаерфокс устарел. Как он вообще устареть может?
Ковырять еще не начал, да и плохо это у меня получается. А куда копать? В сторону Firefox\xul.dll (который кстати весит почти 50мб)? Попытался через KiFastSystemCallRet глянуть вызываются-ли: Код (Text): NtGdiConvertMetafileRect NtGdiCreateRectRgn NtGdiCreateRoundRectRgn NtGdiExcludeClipRect NtGdiGetBoundsRect NtGdiIntersectClipRect NtGdiRectangle NtGdiRectInRegion NtGdiRectVisible NtGdiRoundRect NtGdiSetBoundsRect NtGdiSetRectRgn NtUserDrawAnimatedRects NtUserGetMenuItemRect NtUserGetUpdateRect NtUserInvalidateRect NtUserValidateRect Но тишина. А это слишком нагло будет попросить назвать к каким именно gdi сводится дело? ))
Да типа TextOut ExtTextOut и иже с ними. Но может и директХ там, я точно не припомю, недавно для Оперы делал, там GDI
RET, Вывод текста в gdi может быть не явным, тоесть формируется спец запрос и при вызове любого сервиса выводится текст. Сделано для быстрой обработки, что бы не вызывать много раз ядро.
RET, TextOut() именно и использует batching, запрос на вывод формируется в памяти(TEB) и функция возвращает управление без вызова сервисов. Тогда пакет будет обработан при следующем вызове любого сервиса. Так как тс смотрит по сервисному логу, то вполне вероятно что там и не будет ожидаемых сервисов.
Вот например посмотрел стандартный блокнот 7-ки, сервис который выводит текст в ShowCaret(): NtUserShowCaret, так как это первый сервис, который был вызван после TextOut().