Windows

       

Внедрение кода через функцию CreateProcess


Если Ваш процесс порождает дочерний, в который надо внедрить какой-то код, то задача значительно упрощается. Родительский процесс может создать новый процесс и сразу же приостановить его. Это позволит изменить состояние дочернего процесса до начала его выполнения. В то же время родительский процесс получает описатель первичного потока дочернего процесса. Зная его, Вы можете модифицировать код, который будет выполняться этим потоком. Тем самым Вы решите проблему, упомянутую в предыдущем разделе: в данном случае нетрудно установить регистр указателя команд, принадлежащий потоку, на код в проекции файла.

Вот один из способов контроля за тем, какой код выполняется первичным потоком дочернего процесса:

  • Создайте дочерний процесс в приостановленном состоянии.
  • Получите стартовый адрес его первичного потока, считав его из заголовка исполняемого модуля.
  • Сохраните где-нибудь машинные команды, находящиеся по этому адресу памяти.
  • Введите на их место свои команды. Этот код должен вызывать LoadLibrary для загрузки DLL.
  • Разрешите выполнение первичного потока дочернего процесса.
  • Восстановите ранее сохраненные команды по стартовому адресу первичного потока,
  • Пусть процесс продолжает выполнение со стартового адреса так, будто ничего и не было.
  • Этапы 6 и 7 довольно трудны, но реализовать их можно — такое уже делалось Уэтого метода масса преимуществ. Во-первых, мы получаем адресное пространство до выполнения приложения. Во-вторых, данный метод применим как в Windows 98, так и в Windows 2000. В третьих, мы можем без проблем отлаживать приложение с внед-

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

    Однако у него есть и недостатки. Внедрение DLL возможно, только если это делается из родительского процесса. И, конечно, этот метод создает зависимость программы от конкретного процессора; при eе переносе на другую процессорную платформу потребуются определенные изменения в коде.



    Содержание раздела