![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
можно ли как-либо отловить вызов dll в коде?
Starkom © (2002-04-17 12:26:00)Есть приложение, которое в вызывает dll, которая в свою очередь сама вызывает другие dll"ки. Может ли приложение отслеживать, какие dll"ки вызывает первая dll"ка?
Digitman (2002-04-17 14:53:00) [1]В дополнение :
Замечательную, кстати, "дыру" Борланд оставляет для желающих "поистязать" чужие приложения, написанные в Делфи)
При определенном желании и упорстве можно получить ПОЛНЫЙ контроль над объектом Application, "живущим" в АП "чужого" процесса, стартовавшего из EXE, сверстанного в Делфи и использующего объект TApplication)
Digitman (2002-04-17 14:40:00) [2]Можно, TCKB E; YF NJ GJIKJ? "поизвращаться" и куда более изощреннее)
Всякая Делфи-форма, существующая в run-time, имеет свое окно.
В процессе конструирования формы создаваемое окно получает уникальное св-во (с именем создаваемогого конструктором формы спец-но для этой цели глоб.атома), значение которого равно адресу экз-ра формы в памяти приложения (иными словами - копии того, что содержится в той самой переменной Form1 у автора). Дело за малым : найти любым удобным и доступным способом хэндл окна формы, получить хэндл глолб.атома, получить зн-е св-ва окна и привести его к известному заранее типу - классу целевой формы.
Подробности - в модуле controls.pas,
см. все, что связано с "магическим" объявлением в этом модуле :
var
WindowAtom: TAtom;
ControlAtom: TAtom;
Starkom (2002-04-17 14:31:00) [3]2 Виктор Щербаков:
:)) проще уж приложение COM-server"ом сделать. А при вызове функции из dll создавать клиент.
Starkom (2002-04-17 14:27:00) [4]2 Виктор Щербаков:
:)) проще уж приложение COM-server"ом сделать. А при вызове функции из dll создавать клиент.
Alx2 (2002-04-17 14:27:00) [5]>Starkom (17.04.02 14:18)
Опиши подробнее задачу. С трудом допираю. Почему Form1 не должна быть nil. Проблема в том, чтобы наблюдать Form1 у хоста?
Виктор Щербаков (2002-04-17 14:25:00) [6]
> я просто не въезжаю, как получить доступ к данным приложения
Положи их в проецированный файл. Если уж до конца извращаться, то туда можно положить адрес некоторой функции твоего хост-приложения, а длл, при получении управления будет вызывать эту функцию.
Starkom (2002-04-17 14:18:00) [7]2 Alx2: а как достучаться?
есть form1 на буттон1клик создаем
Thread:=TFormExecutor.Create(false);
в TFormExecutor.Execute вызываем внешнюю dll"ку - она потом вызывает мою dll"ку. Так в моей dll"ке Form1=nil!
я просто не въезжаю, как получить доступ к данным приложения.
Digitman (2002-04-17 13:49:00) [8]Все равно непонятно, что значит "получить управление"...
Если твою ф-цию в твоей же DLL кто-то вызывает, это вполне можно считать ситуацией, когда ты получил управление.
Alx2 (2002-04-17 13:41:00) [9]> как получить доступ к данным самого приложения?
Так получается, что адресное пространство едино и до всех данных своего приложения можно достучаться. Особливо, если структура известна.
Потом: почему именно до вызова своей функции? На первый взгляд все едино: что до вызова, что обработать то же самое в начале выполнения функции.
Starkom (2002-04-17 13:18:00) [10]в том то и дело, что одна dll"ка стороннего разработчика без исходных текстов. Как она устроена, я понятия не имею. Знаю только, что она вызывает функцию из dll"ки, написанной мной. Как раз и надо получить управление до вызова этой функции. Можно, конечно, делать это из самой функции, но тогда, как получить доступ к данным самого приложения?
Digitman (2002-04-17 13:11:00) [11]А не намудрил ли ты ?
Пусть твой хост-процесс грузит обе DLL (имена ж их и требуемые точки входа известны тебе) и вызывает их в сколь угодно сложном порядке в любых нужных потоках !
Starkom (2002-04-17 12:45:00) [12]Да, надо.
Дело не в том, чтобы узнать какие dll"ки использует первая dll"ка, это я и так знаю.
Я хочу запустить вызов первой dll"ки в потоке, чтобы другой поток получал управление непосредственно ДО вызова первой dll"кой нужной мне функции из другой, вполне определенной dll"ки и выполнял определенные действия.
Alx2 (2002-04-17 12:37:00) [13]Некоторые dll можно еще до запуска узнать из таблицы импорта.
Про остальные IMHO перехват API вызовов LoadLibrary, LoadLibraryEx. А это надо?