Russian Qt Forum
Март 29, 2024, 05:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)  (Прочитано 5369 раз)
Bepec
Гость
« : Декабрь 09, 2016, 17:27 »

Собственно вопрос состоит в следующем.

Перехватывается процедура рисования текста стороннего приложения с помощью инжекта. Цель - определить в каком окне процесса рисуется данный текст, или если проще - получить HWND окна в котором производится рисование.

Перехватываемая функция
Код:
int WINAPI DrawTextW(
HDC hDC,          // дескриптор контекста устройства
LPCTSTR lpString, // текст для вывода
int nCount,       // длина текста
LPRECT lpRect,    // размеры поля форматирования
UINT uFormat      // параметры вывода текста
)
Внутри можем использовать всё что угодно для идентификации того, в каком окне это рисуется.

Pid процесса для всех окон одинаковый. Поток рисования тоже один. Все функции WinApi, которые позволяют получить данные об окне, требуют HWND окна, который нам неизвестен.
Размеры/положение окна недоступны, координаты рисования нам известны, но они локальные для опять таки окна.
Единственная подходящая функция HWND WindowFromDC(HDC), выдаёт ноль, т.е. устройство рисования не имеет прямой зависимости к окну...

Собственно прошу мозгового штурма.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 10, 2016, 09:47 »

Единственная подходящая функция HWND WindowFromDC(HDC), выдаёт ноль, т.е. устройство рисования не имеет прямой зависимости к окну...
Ну вообще-то оно не обязано, можно создать DC без окна, рисовать в нем, а потом шлепнуть это в окно. А перехват работает на простом тесте когда сами создаете окно и печатаете а нем заданный текст?

Перехватывается процедура рисования текста стороннего приложения с помощью инжекта. Цель - определить в каком окне процесса рисуется данный текст
Подобные "системные" задачи - бездарное разбазаривание интеллектуальных ресурсов. Т.к. кратность использования все равно единица, то лучше уж полазить отладчиком в стороннем приложении и найти как оно выводит, а потом уж может и перехватывать

Записан
Bepec
Гость
« Ответ #2 : Декабрь 10, 2016, 14:49 »

Я жду ваших предложений.

Найти в чужом приложении неизвестную структуру с неизвестными данными - довольно легко.
Найти нужную структуру - труднее.
Ещё труднее найти константный указатель на данную структуру.

Предложите другой способ перехвата рисуемого текста с окна чужого приложения. Шрифт/размер могут меняться, символы - полный набор юникода.

PS да, всё перехватывается. Да, всё стабильно работает на одном окне. Но в будущем возможно будет расширение функционала на несколько окон.

PPS а найти в памяти несколько таких структур, каким то образом соотнести их с окнами и выдирать оттуда данные - задачка на миллион.

PPPS а если вы подскажите литературу по вашему быстрому и простому способу лазания отладчиком в стороннем приложении, я буду только рад.
« Последнее редактирование: Декабрь 10, 2016, 16:21 от Bepec » Записан
Bepec
Гость
« Ответ #3 : Декабрь 18, 2016, 13:56 »

Аууу, Igors, куда вы делись, кладезь невыдаваемой фентезийной информации?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 18, 2016, 14:37 »

Аууу, Igors, куда вы делись, кладезь невыдаваемой фентезийной информации?
Улыбающийся Понимаете, говорить с человеком у которого "сдвинуты оценки" (скажем так) - ничего хорошего не выйдет. Это мелкий, грязный (бомжацкий) хак - и ничего более как бы Вы ни старались. Если по каким-то причинам он нужен - ну значит нужен, но никакой "общности" и перспектив он не имеет. А Вы тут
..расширение функционала ..
..задачка на миллион...
..жду ваших предложений..
Да бог с Вами, что-то удалось - ну и хорошо. Изменится хакаемое приложение - ну опять придется что-то городить (если удастся). Если автор приложения захочет это пресечь - пресечет. К этому надо спокойно, нормально относиться, не строить глупых иллюзий
 
Записан
Bepec
Гость
« Ответ #5 : Декабрь 18, 2016, 17:13 »

Так вы приведите "не хак".
Если вы видите его мелким, грязным, жутким хаком - приведите благопристойный вариант. А то сейчас ситуация как с хлебом - он черствый, он в луже, его есть противно даже бомжам... А другого нет.
И вы в данном случае тоже будете его есть. Просто вам ситуация не попадалась.

PS жду от вас дельных предложений "не хака".
PPS я ещё думаю, что вы хороший специалист, могущий дать совет. Если нет - так и скажите.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 19, 2016, 12:00 »

Так вы приведите "не хак".
Если вы видите его мелким, грязным, жутким хаком - приведите благопристойный вариант. .
Связаться с автором приложения, взять исходники и адаптировать их для своих нужд. На худой конец послать ему feature request. Если такой возможности нет (или она не укладывается в бюджет) - то по крайней мере попытаться в след раз не попадать в такой положение, альтернативы всегда есть. 

PPS я ещё думаю, что вы хороший специалист, могущий дать совет. Если нет - так и скажите.
Так я сразу и ответил
Ну вообще-то оно не обязано, можно создать DC без окна, рисовать в нем, а потом шлепнуть это в окно.
Хотя Вы это и без меня прекрасно знали. Да и этот вариант не единственный - напр можно через OpenGL рисовать. Так чего Вы хотите? "В WinAPI нету - но если очень хочется..". Если уж хакать, то Вы сформулировали задачу слишком узко - уперлись в перехват текста, и все. Тут и посоветовать нечего. Дайте больше инфы, может удастся подлезть с др стороны - на Вашей платформе обычно удается  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #7 : Декабрь 19, 2016, 13:37 »

Верес, ну раз вы уже перехватываете DrawTextW, то перехватывайте сразу и BitBlt. При вызове DrawTextW сохраняйте хендл контекста, куда выводился текст, дальше ждем вызов BitBlt с hdcSrc == сохраненному, берем hdcDesc и пытаемся по нему получить hWnd, если не получается, сохраняем уже этот контекст и дальше ждем BitBlt, пока он не окажется привязанным к окну.
Записан
Bepec
Гость
« Ответ #8 : Декабрь 19, 2016, 16:15 »

Просто и гениально, Old. О результатах отпишусь.

to Igors: перехват тектовых/числовых данных с экрана приложения, защищенного от чтения/записи памяти, зато разрешающего перехват функций winapi. Вариант "попросить исходники" кнечно идеален, но недостижим - приложение, а в особенности создатели приложения не должны быть в курсе Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 20, 2016, 09:23 »

..приложения, защищенного от чтения/записи памяти
Это про то масло что не содержит холестерина? (В любом ОС читать/писать в память др процесса просто так нельзя)
...приложение, а в особенности создатели приложения не должны быть в курсе Улыбающийся
Давно не брал в руки вындозный отладчик, но помню что все вызовы API он показывает прекрасно. Остановитесь на пойманном DrawText и смотрите какие вызовы API за ним следуют - а там видно будет чего перехватывать. Да, и месяги уже изучили?
Записан
Bepec
Гость
« Ответ #10 : Декабрь 20, 2016, 11:49 »

Уважаемый Igors, в любой ОС можно писать/читать в память процесса. Тот факт, что дебаггеры прекрасно работают в любой ОС это доказывает.
В данном случае стоит защита.

Как можно посмотреть вызовы WinApi, если при попытке чтения памяти приложение закрывается? Т.е. при попытке подключить отладчик к процессу следует закрытие приложения Улыбающийся

Мессаги WinApi тут не помогут, ибо приложение использует не "окошки" с данными, а рисует само картинку.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 20, 2016, 12:10 »

В данном случае стоит защита.

Как можно посмотреть вызовы WinApi, если при попытке чтения памяти приложение закрывается? Т.е. при попытке подключить отладчик к процессу следует закрытие приложения Улыбающийся
Первый раз слышу про такую мощную защиту Улыбающийся Приложение может "побороться" с отладчиком, напр завершиться если обнаружило его - но для этого оно сначала должно загрузиться и получить упр-е, т.е. стартовать из отладчика должно. Также если Вы "перехватываете" - то никто не может помешать брякнуться на Вашем же перехвате.

А без отладчика вслепую тыкать можно ну очень долго. Впрочем так Вам и надо - нечего лазить по чужим огородам  Улыбающийся
Записан
Bepec
Гость
« Ответ #12 : Декабрь 20, 2016, 18:03 »

Прямое чтение/запись памяти легко перехватывается хуком на эти функции. И добавить exit() ещё до их выполнения - дело секунд.

Если и можно обойти это ограничение, что равняется взлому защиты, то это задача не программиста, а хакера скорее Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.