Russian Qt Forum
Март 29, 2024, 05:31
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект) (Прочитано 5369 раз)
Bepec
Гость
Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
:
Декабрь 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
Сообщений: 11445
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #1 :
Декабрь 10, 2016, 09:47 »
Цитата: Bepec от Декабрь 09, 2016, 17:27
Единственная подходящая функция HWND WindowFromDC(HDC), выдаёт ноль, т.е. устройство рисования не имеет прямой зависимости к окну...
Ну вообще-то оно не обязано, можно создать DC без окна, рисовать в нем, а потом шлепнуть это в окно. А перехват работает на простом тесте когда сами создаете окно и печатаете а нем заданный текст?
Цитата: Bepec от Декабрь 09, 2016, 17:27
Перехватывается процедура рисования текста стороннего приложения с помощью инжекта. Цель - определить в каком окне процесса рисуется данный текст
Подобные "системные" задачи - бездарное разбазаривание интеллектуальных ресурсов. Т.к. кратность использования все равно единица, то лучше уж полазить отладчиком в стороннем приложении и найти как оно выводит, а потом уж может и перехватывать
Записан
Bepec
Гость
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #2 :
Декабрь 10, 2016, 14:49 »
Я жду ваших предложений.
Найти в чужом приложении неизвестную структуру с неизвестными данными - довольно легко.
Найти нужную структуру - труднее.
Ещё труднее найти константный указатель на данную структуру.
Предложите другой способ перехвата рисуемого текста с окна чужого приложения. Шрифт/размер могут меняться, символы - полный набор юникода.
PS да, всё перехватывается. Да, всё стабильно работает на одном окне. Но в будущем возможно будет расширение функционала на несколько окон.
PPS а найти в памяти несколько таких структур, каким то образом соотнести их с окнами и выдирать оттуда данные - задачка на миллион.
PPPS а если вы подскажите литературу по вашему быстрому и простому способу лазания отладчиком в стороннем приложении, я буду только рад.
«
Последнее редактирование: Декабрь 10, 2016, 16:21 от Bepec
»
Записан
Bepec
Гость
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #3 :
Декабрь 18, 2016, 13:56 »
Аууу, Igors, куда вы делись, кладезь невыдаваемой фентезийной информации?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #4 :
Декабрь 18, 2016, 14:37 »
Цитата: Bepec от Декабрь 18, 2016, 13:56
Аууу, Igors, куда вы делись, кладезь невыдаваемой фентезийной информации?
Понимаете, говорить с человеком у которого "сдвинуты оценки" (скажем так) - ничего хорошего не выйдет. Это мелкий, грязный (бомжацкий) хак - и ничего более как бы Вы ни старались. Если по каким-то причинам он нужен - ну значит нужен, но никакой "общности" и перспектив он не имеет. А Вы тут
Цитата: Bepec от Декабрь 10, 2016, 14:49
..расширение функционала ..
..задачка на миллион...
..жду ваших предложений..
Да бог с Вами, что-то удалось - ну и хорошо. Изменится хакаемое приложение - ну опять придется что-то городить (если удастся). Если автор приложения захочет это пресечь - пресечет. К этому надо спокойно, нормально относиться, не строить глупых иллюзий
Записан
Bepec
Гость
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #5 :
Декабрь 18, 2016, 17:13 »
Так вы приведите "не хак".
Если вы видите его мелким, грязным, жутким хаком - приведите благопристойный вариант. А то сейчас ситуация как с хлебом - он черствый, он в луже, его есть противно даже бомжам... А другого нет.
И вы в данном случае тоже будете его есть. Просто вам ситуация не попадалась.
PS жду от вас дельных предложений "не хака".
PPS я ещё думаю, что вы хороший специалист, могущий дать совет. Если нет - так и скажите.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #6 :
Декабрь 19, 2016, 12:00 »
Цитата: Bepec от Декабрь 18, 2016, 17:13
Так вы приведите "не хак".
Если вы видите его мелким, грязным, жутким хаком - приведите благопристойный вариант. .
Связаться с автором приложения, взять исходники и адаптировать их для своих нужд. На худой конец послать ему feature request. Если такой возможности нет (или она не укладывается в бюджет) - то по крайней мере попытаться в след раз не попадать в такой положение, альтернативы всегда есть.
Цитата: Bepec от Декабрь 18, 2016, 17:13
PPS я ещё думаю, что вы хороший специалист, могущий дать совет. Если нет - так и скажите.
Так я сразу и ответил
Цитата: Igors от Декабрь 10, 2016, 09:47
Ну вообще-то оно не обязано, можно создать DC без окна, рисовать в нем, а потом шлепнуть это в окно.
Хотя Вы это и без меня прекрасно знали. Да и этот вариант не единственный - напр можно через OpenGL рисовать. Так чего Вы хотите? "В WinAPI нету - но если очень хочется..". Если уж хакать, то Вы сформулировали задачу слишком узко - уперлись в перехват текста, и все. Тут и посоветовать нечего. Дайте больше инфы, может удастся подлезть с др стороны - на Вашей платформе обычно удается
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4349
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #7 :
Декабрь 19, 2016, 13:37 »
Верес, ну раз вы уже перехватываете DrawTextW, то перехватывайте сразу и BitBlt. При вызове DrawTextW сохраняйте хендл контекста, куда выводился текст, дальше ждем вызов BitBlt с hdcSrc == сохраненному, берем hdcDesc и пытаемся по нему получить hWnd, если не получается, сохраняем уже этот контекст и дальше ждем BitBlt, пока он не окажется привязанным к окну.
Записан
Bepec
Гость
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #8 :
Декабрь 19, 2016, 16:15 »
Просто и гениально, Old. О результатах отпишусь.
to Igors: перехват тектовых/числовых данных с экрана приложения, защищенного от чтения/записи памяти, зато разрешающего перехват функций winapi. Вариант "попросить исходники" кнечно идеален, но недостижим - приложение, а в особенности создатели приложения не должны быть в курсе
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #9 :
Декабрь 20, 2016, 09:23 »
Цитата: Bepec от Декабрь 19, 2016, 16:15
..приложения, защищенного от чтения/записи памяти
Это про то масло что не содержит холестерина? (В любом ОС читать/писать в память др процесса просто так нельзя)
Цитата: Bepec от Декабрь 19, 2016, 16:15
...приложение, а в особенности создатели приложения не должны быть в курсе
Давно не брал в руки вындозный отладчик, но помню что все вызовы API он показывает прекрасно. Остановитесь на пойманном DrawText и смотрите какие вызовы API за ним следуют - а там видно будет чего перехватывать. Да, и месяги уже изучили?
Записан
Bepec
Гость
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #10 :
Декабрь 20, 2016, 11:49 »
Уважаемый Igors, в любой ОС можно писать/читать в память процесса. Тот факт, что дебаггеры прекрасно работают в любой ОС это доказывает.
В данном случае стоит защита.
Как можно посмотреть вызовы WinApi, если при попытке чтения памяти приложение закрывается? Т.е. при попытке подключить отладчик к процессу следует закрытие приложения
Мессаги WinApi тут не помогут, ибо приложение использует не "окошки" с данными, а рисует само картинку.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #11 :
Декабрь 20, 2016, 12:10 »
Цитата: Bepec от Декабрь 20, 2016, 11:49
В данном случае стоит защита.
Как можно посмотреть вызовы WinApi, если при попытке чтения памяти приложение закрывается? Т.е. при попытке подключить отладчик к процессу следует закрытие приложения
Первый раз слышу про такую мощную защиту
Приложение может "побороться" с отладчиком, напр завершиться если обнаружило его - но для этого оно сначала должно загрузиться и получить упр-е, т.е. стартовать из отладчика должно. Также если Вы "перехватываете" - то никто не может помешать брякнуться на Вашем же перехвате.
А без отладчика вслепую тыкать можно ну очень долго. Впрочем так Вам и надо - нечего лазить по чужим огородам
Записан
Bepec
Гость
Re: Идентификация рисуемого окна по hDC из функции рисования текста. (winapi+инжект)
«
Ответ #12 :
Декабрь 20, 2016, 18:03 »
Прямое чтение/запись памяти легко перехватывается хуком на эти функции. И добавить exit() ещё до их выполнения - дело секунд.
Если и можно обойти это ограничение, что равняется взлому защиты, то это задача не программиста, а хакера скорее
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...