![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запустить функцию в чужом процесе
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 не работает %(