Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

запустить функцию в чужом процесе


juiceman ©   (2004-06-15 21:54:00) 

Допустим, внедряем свою библиотеку в адресные пространства всех процессов в системе (при помощи реестра). Как запустить на выполнение функцию этой библиотеки только в определенном процессе?


juiceman   (2004-06-25 23:50:00) [1]

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


Тимохов   (2004-06-22 14:45:00) [2]


> А вообще уже началась игра в телепатию.

согласен.


evvcom   (2004-06-22 14:31:00) [3]

Забыл:

> что он все же хочет подменить оконную функцию

а для этого организовывать доп. поток совсем не нужно.


evvcom   (2004-06-22 14:29:00) [4]

И еще автор пишет

> Подменить чужую оконную функцию конечного процесса, и при
> необходимости посылать ей условное сообщение. Она запустит
> функцию из спроэцированной библиотеки а потом прежнюю оконную.

т.е. более напрашивается, что он все же хочет подменить оконную функцию. Для этого в момет инициализации перехватываем CreateWindow(Ex) со всеми вытекающими последствиями.
А вообще уже началась игра в телепатию.


Тимохов   (2004-06-22 14:16:00) [5]


> И кто этому потоку пошлет сообщение?

В каком смысле?
А автор пишет:

> Требовалось в любой другой момент их вызывать

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

А вообще - самый верный ответ это 13.


evvcom   (2004-06-22 14:05:00) [6]


> при инициализации организовать в чужом процессе поток и
> заставить его ждать сообщений

И кто этому потоку пошлет сообщение?

В момент инициализации можно организовать перехват нужных функций, чтобы впоследствии управление передавалось твоей
функции.


Тимохов   (2004-06-22 12:24:00) [7]


> Вызывать в момент инициализации ? Требовалось в любой другой
> момент их вызывать

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


Digitman   (2004-06-22 12:17:00) [8]


> juiceman   (22.06.04 11:47) [12]


> в любой другой момент


а какие конкретно программные события ведут к необходимости вызова ф-ций в ДЛЛ-модуле ?


juiceman   (2004-06-22 11:47:00) [9]


> Digitman ©   (16.06.04 15:16) [9]
> непонятно, что тут мудрить
> в ходе иниц-ции экз-ра внедренного модуля ты получил управление
> и волен вызывать ЛЮБЫЕ ф-ции этого модуля

Вызывать в момент инициализации ? Требовалось в любой другой момент их вызывать


Digitman   (2004-06-18 08:49:00) [10]


> Это все из-за этого поганого внедрения через реестр - теперь
> внедряю через удаленные потоки и все ОК, попадаю сразу в
> цель


есть и третий вариант - глоб.хук

при установке глоб.хука (любого допустимого типа) система так же автоматически внедряет экз-р хук-модуля в АП GUI-процесса при его старте

так как хук-модуль - это, прежде всего, обычная ДЛЛ, он имеет ф-цию DLLEntryPoint(), которую система будет вызывать с параметром DLL_PROCESS_ATTACH для инициализации хук-модуля в контексте его загрузки .. известно, что если DLLEntryPoint(DLL_PROCESS_ATTACH) вернет системе ненулевой результат (DLL_INIT_FAIL), система воспринимает его как отказ инициализации модуля и немедленно выгружает образ модуля из АП процесса, сообщая вызывающему загрузку коду об отказе вызова LoadLibrary() .. в случае хук-ДЛЛ попытка ее загрузки производится не прикладным кодом процесса, а неявно самой системой .. рискну предположить, что и в этом случае существует возможность вернуть системе из DLLEntryPoint(DLL_PROCESS_ATTACH) результат, указывающий о невозможности загрузки хук-модуля в АП дан.процесса .. признаком , служащим сигналом для возврата из  DLLEntryPoint() с кодом отказа, служит неравенство имени тек.процесса и наперед известного имени (см. [2])


juiceman   (2004-06-16 23:37:00) [11]

Да, явно поспешил с вопросом. Задача была после внедрения выполнить нужный код в опр. процессе. Чуточку разобравшись уяснил как все сделать, тут действительно проблем нет.
Это все из-за этого поганого внедрения через реестр - теперь внедряю через удаленные потоки и все ОК, попадаю сразу в цель. Как вы сказали, это в 98-ой тоже работает, но испльзуя сторонний модуль. Так вроде она существует но ничего не делает.
По поводу GUI это и слону понятно что нет окна нет и его подкласса. Я же не говорил, что нужно выполнить код во всех процессах, мне нужен мой - а это GUI-приложение.


> Я повторюсь с вопросом: что такое интересное творишь ?

На самом деле я ничего такого интересного не творю а просто читаю Рихтера :) Вот хотелось-бы "Контроллер метала" написать, чтобы в сети если кто-то что-то дернул - сразу сигнал на сервер поступет. Еще хочу программу написать, чтобы можно было исходники  через нее предоставлять посторонним но они не могли их тупо копировать - набирать с экрана устанут, да и по времени юзания можно ограничить. Еще есть парочка идей...


Digitman   (2004-06-16 15:16:00) [12]


> Допустим, внедряем свою библиотеку


> Как запустить на выполнение функцию этой библиотеки


непонятно, что тут мудрить
в ходе иниц-ции экз-ра внедренного модуля ты получил управление и волен вызывать ЛЮБЫЕ ф-ции этого модуля


DeadMeat   (2004-06-16 14:29:00) [13]

> juiceman
Если я правильно понял, то ты внедрил свою библиотеку через реестр... Значит это в Win2k (помоему в Win9x, такое не проходит)... А соответсвтенно я не понял вот этого
Второй спосооб- удаленный поток. Тут было бы все проще, только в 98не работает %(
Ты ведь и так работаешь в Win2k, а значит можно и удалённым потоком пользоваться... Или я чего не понял...

P.S. Кстати, гдето читал, что CreateRemoteThread в Win9x всёже есть, и работает... Вот только не экспортируется...

---
...Death Is Only The Begining...


Digitman   (2004-06-16 13:32:00) [14]


> juiceman   (15.06.04 21:54)  


система внедряет модуль в АП GUI-процесса еще ДО создания каких бы то ни было окон

о каких оконных ф-циях может идти речь, если никаких окон еще нет в этот момент ?

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


Игорь Шевченко   (2004-06-16 13:04:00) [15]

Digitman ©   (16.06.04 12:36)

Я надеюсь, автор это тоже прочитает :) Конечно, ему адресовано


Digitman   (2004-06-16 12:36:00) [16]


> Игорь Шевченко ©   (16.06.04 12:06) [4]


Игорь, мне это известно .. ты бы это автору адресовал .. ибо он поставил знак равенства между "все процессы" и "GUI-процессы", ничтоже сумняшеся пришпандорив туда и Appinit_DLL и "оконную функцию"


Игорь Шевченко   (2004-06-16 12:06:00) [17]

Digitman ©   (16.06.04 12:00)


> далеко не все процессы в системе являются GUI-процессами
>


В такие с помощью реестра внедриться не получится. Насколько я понимаю, речь идет о внедрении при помощи параметра Appinit_DLL


Digitman   (2004-06-16 12:00:00) [18]


> в адресные пространства всех процессов в системе


> запустит функцию из спроэцированной библиотеки а потом прежнюю
> оконную


далеко не все процессы в системе являются GUI-процессами и, значит, рассуждать о наличии "оконной функции" во ЛЮБОМ процессе по меньшей мере наивно


Игорь Шевченко   (2004-06-16 01:05:00) [19]


> Допустим, внедряем свою библиотеку в адресные пространства
> всех процессов в системе (при помощи реестра). Как запустить
> на выполнение функцию этой библиотеки только в определенном
> процессе?


GetModuleFileName(0) ?

Я повторюсь с вопросом: что такое интересное творишь ?


juiceman   (2004-06-16 00:36:00) [20]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо