Моя задача:
Написать программу, которая будет получать текст с посторонних апликации. Обычный метод GetWindowText не всегда работает т к есть апликации которые скрывают свои window handles (HWND) от системы. Например ActiveX — ы или программа откомпилированная в VB. Статик текст в этих программах рисуется TextOut (у него нету собственного HWND).
Я написал программу перехватчик для API functions которые рисуют текст на экране:
DrawTextA
DrawTextW
DrawTextExA
DrawTextExW
TextOutA
TextOutW
ExtTextOutW
ExtTextOutA
TabbedTextOutA
TabbedTextOutW
Этот метод работает не во всех случаях. Мне кажется что я перегрузил не все API functions. Скажите мне пожалуйста есть ли ещё API функции, которые выводят текст или символы на DC.
Re: Получение текста с посторонней апликации(перехват API)
Здравствуйте, rus blood, Вы писали:
RB>А как твоя программа будет определять, какой именно текст надо взять? RB>Скажем, в том же случае со статиком на vb-программе ?
Прямоугольная область относительно окна родителя.
В этом случае можно вызвать перерисовку прямоугольника и прехватить DrawText.
Re: Получение текста с посторонней апликации(перехват API)
Здравствуйте, alexey_ma, Вы писали:
_>Я написал программу перехватчик для API functions которые рисуют текст на экране: _>DrawTextA _>DrawTextW
... _>TabbedTextOutA _>TabbedTextOutW
зачем кстати перехватывать A ф-ии если они в итоге все равно позовут W?
_>Этот метод работает не во всех случаях. Мне кажется что я перегрузил не все API functions. Скажите мне пожалуйста есть ли ещё API функции, которые выводят текст или символы на DC.
Конечно он не будет работать во всех т.к. это ненадежный путь по своей природе. не хочу обсуждать все минусы API hooking, здесь уже все сказано давно. Лично я стараюсь обходиться без таких вещей по возможности.
да и к примеру в новых версиях могут появиться новые GDI ф-ии — всего так вы не предусмотрите никогда.
Я бы пошел по пути mirror drivers и корректном перехвате GDI для NT платформ (NT4 потребует доп усилий, лучше ориентироваться на 2000+):
Суть проблемы у Вас в том, что сам движок GDI что-то может сделать в обход ваших перехватчиков, вызовы внутри ядра также не будут замечены (а их много — GDI оптимизирует несколько вызовов в 1 или наобоот что-то может разбить какой-то вызов в совершенно иные, которые Вами не перехватываются ибо вывод текста произойдет через вывод кэшированных глифов, т.е. картинками. Тут кстати новшества XP тем и прочие штучки дают интересные эффекты, мне говорили).
Если Вы спуститесь на уровень DDI (например почитав Feng Yang и DDK), то там написано, что весь вывод текста сведется к DrvTextOut в графическом драйвере (есть еще ф-я DrvGetGlyphMode которую в DDK относят к ф-м ответственным за вывод текста, но здесь это несущественно)
Вам следует перезватить ее в своем драйвере-фильтре GDI (mirror driver) и тогда все будет честно и ничто не пройдет мимо незамеченным. Конечно здесь речь идет о kernel development, Рихтер тут не понадобится.
... << Rsdn@Home 1.1.4 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Получение текста с посторонней апликации(перехват API
Погодь-погодь Движок GDI и правда много может насочинять, но без спросу он текст всяко выводить не станет, а попросить его можно только через апишки, так ведь?
Так что можно аккуратно проверять при запросе на вывод, пересекается ли выводимый текст с нужным прямоугольником, и если да — запоминать его. А потом можно как-то сшить это дело воедино (на случай, если вывод выполняется порционно). Опять же, если считать, что удалось перехвать все соответствующие апишки.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[2]: Получение текста с посторонней апликации(перехват API
V>Я бы пошел по пути mirror drivers и корректном перехвате GDI для NT платформ (NT4 потребует доп усилий, лучше ориентироваться на 2000+):
А не подскажете, где можно подробно почитать про mirror drivers ?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[3]: Получение текста с посторонней апликации(перехват API
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Погодь-погодь Движок GDI и правда много может насочинять, но без спросу он текст всяко выводить не станет, а попросить его можно только через апишки, так ведь?
Сам конечно сочинять не станет. В этом смысле перехватить все ф-ии можно действительно найти и перехватить и надеяться что из ядра никто не решит чего-то подрисовать (здесь я не уверен что никто не решит — в том-то и дело.) или наоборот GDI решит проигнорировать вызов! и что следующий сервис пак или winupdate не сломает чего-нибудь и т.п. свойственные API hooking методу проблемы. Зачем это надо когда есть легальные методы?
Думаю, о деталях внутренностей движка GDI применительно к тексту можно будет говорить поигравшись с DDIMon FengYang или написав свой или спросив кого-нибудь вроде sev, который специализируется на такого рода вещах не первый год.
SM>Так что можно аккуратно проверять при запросе на вывод, пересекается ли выводимый текст с нужным прямоугольником, и если да — запоминать его. А потом можно как-то сшить это дело воедино (на случай, если вывод выполняется порционно). Опять же, если считать, что удалось перехвать все соответствующие апишки.
ИМХО вместо того чтобы строить догадки о внутренностях GDI, все же проще разобраться с mirror driver методом — для указанной задачи он получится весьма простой.
... << Rsdn@Home 1.1.4 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: Получение текста с посторонней апликации(перехват API
KOA>А не подскажете, где можно подробно почитать про mirror drivers ?
соотв раздел в DDK/MSDN:
Display and Print Devices: Windows DDK
Mirror Drivers
PS don't forget about online MSDN on msdn.microsoft.com and online DDK on osr.com
... << Rsdn@Home 1.1.4 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: Получение текста с посторонней апликации(перехват API
Да ведь догадки о внутренностях здесь не причем. Отслеживать можно не то, что делает GDI, а то, что его просит сделать программа. Вот и вся идея. Хотя, согласен, API hooking — не лучшее решениев смысле перехвата абсолютно всех возможностей.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[5]: Получение текста с посторонней апликации(перехват API
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Да ведь догадки о внутренностях здесь не причем. Отслеживать можно не то, что делает GDI, а то, что его просит сделать программа. Вот и вся идея. Хотя, согласен, API hooking — не лучшее решениев смысле перехвата абсолютно всех возможностей.
Не опускаемся в бред Программа может попросить что-то сделать GDI только средствами вызова API GDI . В любом случае — все сводится к хукингу функций GDI. Либо я не понял, о чем вы вели речь
Впрочем, Valerio (пользуясь случаем — респект ) уже озвучил самый грамотный вариант: надо заинтересовать Евгения Суходолина на предмет пространной беседы по теме. Имхо — лично я узнал бы много нового, это точно.
Re[6]: Получение текста с посторонней апликации(перехват API
И бред тут тоже не причем!
Поясняю самого себя Согласен — с тем, что перехват вызовов API — не лучшая идея. Не согласен — с тем, что я высказываю домыслы про внутреннее устройство GDI, хотя сам в нем никогда не разбирался. Не согласен потому, что не высказываю: мои слова были о том, что необязательно знать, как GDI обслужит запросы приложения, а достаточно перехватить сами запросы.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[6]: Получение текста с посторонней апликации(перехват API
Приветствую!
> Впрочем, Valerio (пользуясь случаем — респект ) уже озвучил самый > грамотный вариант: надо заинтересовать Евгения Суходолина на предмет > пространной беседы по теме. Имхо — лично я узнал бы много нового, это точно.
А о чём там можно пространно беседовать? Всё основное Валерий уже
сказал. А остальное — детали реализации. И он прав на 100%, что перехват
API это ненадёжно и криво.