Русский / Russian English / Английский

Сейчас на форуме:
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Delphi. Список контролов в чужом приложении
Посл.ответ Сообщение

Ранг: 3.4 (гость)
Статус: Участник

Создано: 14 января 2020 13:46 New!
Цитата · Личное сообщение · #1

Доброго дня, подскажите куда копать, что читать?

Дано, есть x32 приложение, предположительно написанное на Delphi, в нем есть кастомный TPanel, и на нем куча кастомных TImage, при наведении на которые всплывает маленькое окошечко с некоторой инфой..
Как можно прочитать список этих контролов на TPanel и дополнить текст в всплывающем окошке своими данными (которые могут меняться, т.е. вшить ничего не получится)?

пробовал стандартным FindControl, но происходит access violation
...в разделе программ для декомпилятора указана аннотация - "вместо содержания процедур pas файлов вы увидите виртуальный адрес памяти, где будет находится процедура во время работы исполняемого файла - знать этот адрес может быть полезно для того, чтобы поставить туда прерывание и отлаживать программы", теоретически я бы поставил прерывание на метод наведения мыши onMouseEnter, практически - я даже не знаю как это делать (но с удовольствием что-нибудь почитаю), да и непонятно что дальше с этим адресом делать, ведь в область памяти я не могу ничего записать..

спасибо!

Ранг: 23.9 (новичок)
Статус: Участник

Создано: 14 января 2020 13:53 New!
Цитата · Личное сообщение · #2

Для того, чтобы дополнить текст вам вовсе не обязательно искать список контролов и ковыряться в дельфовском коде.
Вам нужно просто найти этот текст и поменять его в редакторе ресурсов (если вам повезет)

Ранг: 3.4 (гость)
Статус: Участник

Создано: 14 января 2020 13:57 New!
Цитата · Личное сообщение · #3

_MBK_ пишет:
Вам нужно просто найти этот текст и поменять его в редакторе ресурсов (если вам повезет)

увы, в том то и дело, что менять в ресурсах ничего не надо, т.е. программа остается как есть.. надо на основе того что всплывает дополнить своим текстом

Ранг: 23.9 (новичок)
Статус: Участник

Создано: 14 января 2020 14:04 New!
Цитата · Личное сообщение · #4

То есть вам надо модифицировать программу так, чтобы придать ей дополнительные функции? Подозреваю, что если у вас проблема уже с поиском контрола, то полный реверс ее в паскалевский код вы точно не осилите, а иначе навряд ли можно

Ранг: 306.6 (мудрец)
Статус: Модератор
CrackLab

Создано: 14 января 2020 14:18 New!
Цитата · Личное сообщение · #5

пишешь дллку, хукаешь метод типа "SetText" (имя в зависимости от контрола куда он выводиться), профит
elite001 пишет:
я бы поставил прерывание на метод наведения мыши onMouseEnter, практически - я даже не знаю как это делать

F2 в OllyDbg.

elite001 пишет:
пробовал стандартным FindControl, но происходит access violation

да ну, и как бы ты это заюзал в чужой проге)

Ранг: 20.2 (новичок)
Статус: Участник

Создано: 14 января 2020 14:29 New!
Цитата · Личное сообщение · #6

Есть две метода, позволяющие решить эту задачу.

1) Встроиться в RTTI этого приложения и написать dll в той же версии Delphi, что и exe. Это даст возможность оперировать с формой(в терминах Delphi) и находящимися на ней контролами и обработчиками их событий, с возможностью модификации и прочего.
2) Обойтись хуками WinAPI: TextOut, CreateWindow и т.п., через что там тултипы выводятся надо смотреть. Тогда, навесив небольшую логику можно фильтровать/модифицировать вывод текста, проверяя, что он именно на нужном тултипе выводится.

Я бы посоветовал хуки, как более простой вариант для ТС. Гуглить: Delphi + WinAPI + hooks.

Ранг: 23.9 (новичок)
Статус: Участник

Создано: 14 января 2020 14:56 New!
Цитата · Личное сообщение · #7

SReg пишет:
да ну, и как бы ты это заюзал в чужой проге)

Я так понял, он имел в виду Find Window в утилите SpyXX
Странно почему крэшится

Ранг: 20.2 (новичок)
Статус: Участник

Создано: 14 января 2020 15:03 · Поправил: GroundHog New!
Цитата · Личное сообщение · #8

SReg пишет:
хукаешь метод типа "SetText" (имя в зависимости от контрола куда он выводиться)

Да, только имя контрола туда не передается, только неявный параметр TObject, я уже не помню, меняется он для статичных контролов от запуска к запуску или нет. Для создаваемых в рантайме должен.
Впрочем, если ТС знает текст, который прилетает, этого достаточно ему будет.

| Сообщение посчитали полезным: elite001



Ранг: 240.4 (наставник)
Статус: Участник

Создано: 14 января 2020 16:26 New!
Цитата · Личное сообщение · #9

Наверное присоединюсь к мнению, что выдергивание текста с контролов какое-то баловство. Данные нужно вытаскивать все целиком, вместе с взаимосвязями, а вывод текста в контролы это только зацепка, откуда следует начинать рыть.

Ранг: 306.6 (мудрец)
Статус: Модератор
CrackLab

Создано: 14 января 2020 22:37 · Поправил: Модератор New!
Цитата · Личное сообщение · #10

GroundHog
Имя контрола и не нужно знать.
И также, у нет данных от ТС по контролу, переопределен ли метод в нем или нет.
По большому счету достаточно знать указатель на экземпляр и от этого можно плясать.
f13nd как вы будете вытаскивать "все целиком, вместе с взаимосвязями" и самое главное зачем это делать?

f13nd пишет:
х32 приложения склонны хранить некоторую инфу в некоторых структурированных формах, чаще всего в виде связанных первичным ключем таблиц, называемых базами данных. Текст в контроле может быть содержимым полей нескольких таблиц, иногда выбранными по не совсем очевидным критериям из базы. Если задача эти данные заполучить - придется искать способ переработать базу, если дополнить их - тоже без хотя бы понимания как она устроена - мартышкин труд.


Достаточно открыть исходники vcl, а это выглядит как обсуждение непонятно чего.

| Сообщение посчитали полезным: elite001



Ранг: 240.4 (наставник)
Статус: Участник

Создано: 14 января 2020 22:52 · Поправил: f13nd New!
Цитата · Личное сообщение · #11

SReg пишет:
как вы будете вытаскивать "все целиком, вместе с взаимосвязями" и самое главное зачем это делать?

elite001 пишет:
есть x32 приложение, предположительно написанное на Delphi, в нем есть кастомный TPanel, и на нем куча кастомных TImage, при наведении на которые всплывает маленькое окошечко с некоторой инфой

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

Добавлено спустя 24 минуты
SReg пишет:
Достаточно открыть исходники vcl, а это выглядит как обсуждение непонятно чего.

Для меня это тоже выглядит как обсуждение непонятно чего, потому что об объекте ни малейшего представления не дано. Поэтому общие рассуждения об абстрактных вещах.

| Сообщение посчитали полезным: elite001


Ранг: 3.4 (гость)
Статус: Участник

Создано: 16 января 2020 13:05 New!
Цитата · Личное сообщение · #12

всем спасибо за наводки - в ApiMonitor поставил отслеживание вызова ShowWindow, нашел форму, которая всплывает, правда в саму форму информация выводится через DrawText.. форма висит в памяти и просто скрывается когда не нужна
?я же могу на это окно повесить новый event, что то типа onDrawText (нашел инфу про субклассинг и подмену функции отрисовки, но пока не понял можно ли это применять на чужие процессы)?
также - при вызове EnumProps у данной формы находятся 2 свойства со странными именами (что то типа Delphi0002727 и Ofs0000004090), как я могу получить доступ к этим свойствам и их структуре, чтобы посмотреть что в них (что в них вообще может быть?)?

Ранг: 30.8 (посетитель)
Статус: Участник

Создано: 16 января 2020 14:18 New!
Цитата · Личное сообщение · #13

elite001 пишет:
я же могу на это окно повесить новый event

В теории возможно, на практике нужны соответствующие знания. К тому же неизвестно как реализованы контролы в целевой программе, там могут использовать стандартные контролы винды (с такими работать проще), а могут быть самописные, т.е. по сути с точки зрения винды может быть обычная панелька, а в внутри нее все может рисоваться вручную собственным кодом, и тогда вклиниться в этой код чутка сложнее, чем просто добавить свой OnDrawText

Ранг: 23.9 (новичок)
Статус: Участник

Создано: 16 января 2020 14:48 New!
Цитата · Личное сообщение · #14

elite001 пишет:
я же могу на это окно повесить новый event, что то типа onDrawText (нашел инфу про субклассинг и подмену функции отрисовки, но пока не понял можно ли это применять на чужие процессы)?

На чужие нет, вам придется иньектировать вызов своей функции в процедуру отрисовки. Если вы, конечно, не хотите паскалевский код реверсировать ;)

Ранг: 1.0 (гость)
Статус: Участник

Создано: 17 января 2020 06:51 New!
Цитата · Личное сообщение · #15

Возможно стоит применить вариант с IDR ? Если приложение написано на дельфи.

https://exelab.ru/f/?action=vthread&forum=3&topic=15434&page=47

Добавлено спустя 8 минут
Выложите файл в паблик и дело пойдет быстрее
 eXeL@B —› Программирование —› Delphi. Список контролов в чужом приложении

Видеокурс ВЗЛОМ