Прочитал цикл легендарных статей о перехвате API функций в Windows NT . Во второй части(http://www.wasm.ru/article.php?article=apihook_2 ) говорится о методе "Внедрение процесса целиком". Который позволяет "работать во внедряемом кода с RTL и применять обьектно ориентированное программирование". Здесь у меня и начались проблемы, тестовый пример работает Ок, но сделать что то более полезное например достучаться к объекту Application приложения цели не получается. Очень пригодился бы небольшой пример. Хотя возможно я не правильно понял автора. Заранее спасибо.
Да, насчет ООП (и отчасти RTL) автор явно "погорячился", т.к. при простом копировании собственного образа в другой процесс копируются только ссылки на динамические переменные (такие как string-и, глобальные объекты Application, Screen и т.п., внутренние данные менеджера кучи), а сами динамические блоки памяти ес-но не копируются, и соотв-но в чужом процессе эти ссылки указывают "в никуда" со всеми вытекающими отсюда последствиями. Поэтому при таком методе нельзя (ни явно, ни косвенно) обращаться ни к объекту Application, ни к другим дин.переменным, и к никаким RTL-операциям с дин.памятью, включая операции со string, создание объектов через TMyObject.Create и т.п. PS: В принципе, если хочется поэкспериментировать со string и\или созданием (простых не визуальных) объектов, то нужно первым делом переопределить менеджер кучи на свой собственный (основанный на виндовых HeapAlloc и т.п.) через SetMemoryManager. Но о работе с VCL-контролами, включая Application, лучше и не мечтать, т.к. при их создании\работе юзается куча ссылок на приватные дин.переменные модулей, которые в чужом процессе ес-но не валидны.
leo а разве нельзя просто загрузить образ в память и выполнить EP и приложение будет думать что он только что создалось и инициализирует все сама. Тут я вижу только одну проблему, надо начинать с EP и то не факт, можно запустить свою функцию, которая установит все что ей надо ( например переменную "чужое приложение") и потом выполнит EP. а там if ( "чужое приложение )
spa Не все так просто, т.к. при инициализации предполагается, что некоторые переменные установлены в nil\0\false (например, приватная перемнная initialized менеджера кучи). Поэтому если запускать инициализацию, то нужно сначала восстановить секцию данных с диска. Плюс, ес-но пройтись по импорту и подгрузить все необходимые dll. Соотв-но управление нужно передавать не сразу на EP, а сначала на функцию загрузки необходимых dll (в которой ес-но нельзя юзать приблуды типа string и т.п.)
Грузить нужно по нормальному - LdrLoadDll(), а не примитивное проецирование и настройка фиксапов. Чудесно так экзе грузятся и работают(я например броузер грузил так ). Поиск.
frodo17 Если хочется подёргать чужие объекты хотя бы на уровне "только чтение" или "только вызов чужих методов, которые не порождают на выходе динамические объекты", код надо либо сочинять под в точности той же версией Delphi/BCB (причём ещё и с учётом апдейтов), либо ковырять отладчиком что там, где и как совместно с длительным раскуриваением на тему, как работает ООП в Delphi. А то внутреннее устройство объектов имеет свойство меняться от версии к версии. Причём чем интеллектуальнее объект, тем отчётливей эта затея становится похожей на полную ж0пу. По крайней мере, я над добычей строчек из StringGrid'а повозился изрядно, причём меня устраивало "грязное и быстрое" решение под одно-единственное приложение без претензий на универсальность.