Как при внедрении в процесс обратится к объекту Application?

Тема в разделе "WASM.BEGINNERS", создана пользователем frodo17, 12 май 2011.

  1. frodo17

    frodo17 New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    3
    Прочитал цикл легендарных статей о перехвате API функций в Windows NT . Во второй части(http://www.wasm.ru/article.php?article=apihook_2 ) говорится о методе "Внедрение процесса целиком". Который позволяет "работать во внедряемом кода с RTL и применять обьектно ориентированное программирование". Здесь у меня и начались проблемы, тестовый пример работает Ок, но сделать что то более полезное например достучаться к объекту Application приложения цели не получается. Очень пригодился бы небольшой пример. Хотя возможно я не правильно понял автора. Заранее спасибо.
     
  2. 9Demon

    9Demon New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2011
    Сообщения:
    33
    Одними kerne32 и user32 не отделаться, надо все DLLки подгрузить, которые использует программа.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да, насчет ООП (и отчасти RTL) автор явно "погорячился", т.к. при простом копировании собственного образа в другой процесс копируются только ссылки на динамические переменные (такие как string-и, глобальные объекты Application, Screen и т.п., внутренние данные менеджера кучи), а сами динамические блоки памяти ес-но не копируются, и соотв-но в чужом процессе эти ссылки указывают "в никуда" со всеми вытекающими отсюда последствиями. Поэтому при таком методе нельзя (ни явно, ни косвенно) обращаться ни к объекту Application, ни к другим дин.переменным, и к никаким RTL-операциям с дин.памятью, включая операции со string, создание объектов через TMyObject.Create и т.п.

    PS: В принципе, если хочется поэкспериментировать со string и\или созданием (простых не визуальных) объектов, то нужно первым делом переопределить менеджер кучи на свой собственный (основанный на виндовых HeapAlloc и т.п.) через SetMemoryManager. Но о работе с VCL-контролами, включая Application, лучше и не мечтать, т.к. при их создании\работе юзается куча ссылок на приватные дин.переменные модулей, которые в чужом процессе ес-но не валидны.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    а разве нельзя просто загрузить образ в память и выполнить EP и приложение будет думать что он только что создалось и инициализирует все сама. Тут я вижу только одну проблему, надо начинать с EP и то не факт, можно запустить свою функцию, которая установит все что ей надо ( например переменную "чужое приложение") и потом выполнит EP. а там if ( "чужое приложение )
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    spa
    Не все так просто, т.к. при инициализации предполагается, что некоторые переменные установлены в nil\0\false (например, приватная перемнная initialized менеджера кучи). Поэтому если запускать инициализацию, то нужно сначала восстановить секцию данных с диска. Плюс, ес-но пройтись по импорту и подгрузить все необходимые dll. Соотв-но управление нужно передавать не сразу на EP, а сначала на функцию загрузки необходимых dll (в которой ес-но нельзя юзать приблуды типа string и т.п.)
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    да, загрузить длл, секцию данных с диска и тогда еп, но все равно я думаю это вариант удобен.
     
  7. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Грузить нужно по нормальному - LdrLoadDll(), а не примитивное проецирование и настройка фиксапов. Чудесно так экзе грузятся и работают(я например броузер грузил так :)). Поиск.
     
  8. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    frodo17
    Если хочется подёргать чужие объекты хотя бы на уровне "только чтение" или "только вызов чужих методов, которые не порождают на выходе динамические объекты", код надо либо сочинять под в точности той же версией Delphi/BCB (причём ещё и с учётом апдейтов), либо ковырять отладчиком что там, где и как совместно с длительным раскуриваением на тему, как работает ООП в Delphi. А то внутреннее устройство объектов имеет свойство меняться от версии к версии. Причём чем интеллектуальнее объект, тем отчётливей эта затея становится похожей на полную ж0пу. По крайней мере, я над добычей строчек из StringGrid'а повозился изрядно, причём меня устраивало "грязное и быстрое" решение под одно-единственное приложение без претензий на универсальность.