Сейчас на форуме: jinoweb (+4 невидимых) |
eXeL@B —› Программирование —› Delphi. Список контролов в чужом приложении |
Посл.ответ | Сообщение |
|
Создано: 14 января 2020 13:46 · Личное сообщение · #1 Доброго дня, подскажите куда копать, что читать? Дано, есть x32 приложение, предположительно написанное на Delphi, в нем есть кастомный TPanel, и на нем куча кастомных TImage, при наведении на которые всплывает маленькое окошечко с некоторой инфой.. Как можно прочитать список этих контролов на TPanel и дополнить текст в всплывающем окошке своими данными (которые могут меняться, т.е. вшить ничего не получится)? пробовал стандартным FindControl, но происходит access violation ...в разделе программ для декомпилятора указана аннотация - "вместо содержания процедур pas файлов вы увидите виртуальный адрес памяти, где будет находится процедура во время работы исполняемого файла - знать этот адрес может быть полезно для того, чтобы поставить туда прерывание и отлаживать программы", теоретически я бы поставил прерывание на метод наведения мыши onMouseEnter, практически - я даже не знаю как это делать (но с удовольствием что-нибудь почитаю), да и непонятно что дальше с этим адресом делать, ведь в область памяти я не могу ничего записать.. спасибо! |
|
Создано: 14 января 2020 13:53 · Личное сообщение · #2 |
|
Создано: 14 января 2020 13:57 · Личное сообщение · #3 |
|
Создано: 14 января 2020 14:04 · Личное сообщение · #4 |
|
Создано: 14 января 2020 14:18 · Личное сообщение · #5 пишешь дллку, хукаешь метод типа "SetText" (имя в зависимости от контрола куда он выводиться), профит elite001 пишет: я бы поставил прерывание на метод наведения мыши onMouseEnter, практически - я даже не знаю как это делать F2 в OllyDbg. elite001 пишет: пробовал стандартным FindControl, но происходит access violation да ну, и как бы ты это заюзал в чужой проге) |
|
Создано: 14 января 2020 14:29 · Личное сообщение · #6 Есть две метода, позволяющие решить эту задачу. 1) Встроиться в RTTI этого приложения и написать dll в той же версии Delphi, что и exe. Это даст возможность оперировать с формой(в терминах Delphi) и находящимися на ней контролами и обработчиками их событий, с возможностью модификации и прочего. 2) Обойтись хуками WinAPI: TextOut, CreateWindow и т.п., через что там тултипы выводятся надо смотреть. Тогда, навесив небольшую логику можно фильтровать/модифицировать вывод текста, проверяя, что он именно на нужном тултипе выводится. Я бы посоветовал хуки, как более простой вариант для ТС. Гуглить: Delphi + WinAPI + hooks. |
|
Создано: 14 января 2020 14:56 · Личное сообщение · #7 |
|
Создано: 14 января 2020 15:03 · Поправил: GroundHog · Личное сообщение · #8 SReg пишет: хукаешь метод типа "SetText" (имя в зависимости от контрола куда он выводиться) Да, только имя контрола туда не передается, только неявный параметр TObject, я уже не помню, меняется он для статичных контролов от запуска к запуску или нет. Для создаваемых в рантайме должен. Впрочем, если ТС знает текст, который прилетает, этого достаточно ему будет. | Сообщение посчитали полезным: elite001 |
|
Создано: 14 января 2020 16:26 · Личное сообщение · #9 |
|
Создано: 14 января 2020 22:37 · Поправил: Модератор · Личное сообщение · #10 GroundHog Имя контрола и не нужно знать. И также, у нет данных от ТС по контролу, переопределен ли метод в нем или нет. По большому счету достаточно знать указатель на экземпляр и от этого можно плясать. f13nd как вы будете вытаскивать "все целиком, вместе с взаимосвязями" и самое главное зачем это делать? f13nd пишет: х32 приложения склонны хранить некоторую инфу в некоторых структурированных формах, чаще всего в виде связанных первичным ключем таблиц, называемых базами данных. Текст в контроле может быть содержимым полей нескольких таблиц, иногда выбранными по не совсем очевидным критериям из базы. Если задача эти данные заполучить - придется искать способ переработать базу, если дополнить их - тоже без хотя бы понимания как она устроена - мартышкин труд. Достаточно открыть исходники vcl, а это выглядит как обсуждение непонятно чего. | Сообщение посчитали полезным: elite001 |
|
Создано: 14 января 2020 22:52 · Поправил: f13nd · Личное сообщение · #11 SReg пишет: как вы будете вытаскивать "все целиком, вместе с взаимосвязями" и самое главное зачем это делать? elite001 пишет: есть x32 приложение, предположительно написанное на Delphi, в нем есть кастомный TPanel, и на нем куча кастомных TImage, при наведении на которые всплывает маленькое окошечко с некоторой инфой х32 приложения склонны хранить некоторую инфу в некоторых структурированных формах, чаще всего в виде связанных первичным ключем таблиц, называемых базами данных. Текст в контроле может быть содержимым полей нескольких таблиц, иногда выбранным по не совсем очевидным критериям из базы. Если задача эти данные заполучить - придется искать способ переработать базу, если дополнить их - тоже без хотя бы понимания как она устроена - мартышкин труд. Добавлено спустя 24 минуты SReg пишет: Достаточно открыть исходники vcl, а это выглядит как обсуждение непонятно чего. Для меня это тоже выглядит как обсуждение непонятно чего, потому что об объекте ни малейшего представления не дано. Поэтому общие рассуждения об абстрактных вещах. ----- 2 оттенка серого | Сообщение посчитали полезным: elite001 |
|
Создано: 16 января 2020 13:05 · Личное сообщение · #12 всем спасибо за наводки - в ApiMonitor поставил отслеживание вызова ShowWindow, нашел форму, которая всплывает, правда в саму форму информация выводится через DrawText.. форма висит в памяти и просто скрывается когда не нужна ?я же могу на это окно повесить новый event, что то типа onDrawText (нашел инфу про субклассинг и подмену функции отрисовки, но пока не понял можно ли это применять на чужие процессы)? также - при вызове EnumProps у данной формы находятся 2 свойства со странными именами (что то типа Delphi0002727 и Ofs0000004090), как я могу получить доступ к этим свойствам и их структуре, чтобы посмотреть что в них (что в них вообще может быть?)? |
|
Создано: 16 января 2020 14:18 · Личное сообщение · #13 elite001 пишет: я же могу на это окно повесить новый event В теории возможно, на практике нужны соответствующие знания. К тому же неизвестно как реализованы контролы в целевой программе, там могут использовать стандартные контролы винды (с такими работать проще), а могут быть самописные, т.е. по сути с точки зрения винды может быть обычная панелька, а в внутри нее все может рисоваться вручную собственным кодом, и тогда вклиниться в этой код чутка сложнее, чем просто добавить свой OnDrawText |
|
Создано: 16 января 2020 14:48 · Личное сообщение · #14 elite001 пишет: я же могу на это окно повесить новый event, что то типа onDrawText (нашел инфу про субклассинг и подмену функции отрисовки, но пока не понял можно ли это применять на чужие процессы)? На чужие нет, вам придется иньектировать вызов своей функции в процедуру отрисовки. Если вы, конечно, не хотите паскалевский код реверсировать ;) |
|
Создано: 17 января 2020 06:51 · Личное сообщение · #15 |
eXeL@B —› Программирование —› Delphi. Список контролов в чужом приложении |