2016-02-05 4 views
1

Мне было интересно, была ли эквивалентная версия либо в библиотеке, либо в виде syscall API-интерфейсов Windows, которые позволяют процессу взаимодействовать с другим пространством процесса, что означало бы изменение потока этого второго процесса. Это для инъекции .so в запущенном процессе, не убивая его.Эквивалент VirtualProtectEx/CreateRemoteThread в Linux?

Спасибо!

+0

Если это не по теме, я больше не знаю, что по теме. –

+0

Вы не должны запрашивать эквивалент Windows '' Foo' в Linux, вы должны объяснить свои цели и мотивацию и спросить, как это сделать в Linux. Нет никаких оснований полагать, что каждая функция в Windows имеет прямой эквивалент в Linux (и наоборот) –

+0

Мои цели и мотивации четко объясняются в конце моего сообщения, я цитирую: «Это нужно сделать .so в запущенном процессе не убивая его ». Я понимаю, что нет никакой причины, что каждая функция в Windows имеет прямой эквивалент в Linux, поэтому я сформулировал вопрос в стиле «да» или «нет». – Alex

ответ

3

может быть, посмотрите здесь: CreateRemoteThread in Linux

Я не знаю более простым способом, описанные там. В Windows у вас есть этот фантастический API, такой как VirtualProtectEx. В Linux вы будете писать .so, например, выполняет pthread_create в функции __attribute__((constructor)). Затем вы загрузите это .so через механизм LD_PRELOAD.

Следующая лучшая вещь для CreateRemoteThread будет манипулировать основной нитью процесса с помощью API ptrace. Но это предполагает

  1. Держа нить
  2. Сохранение его контекст
  3. аргументы Установочные для pthread_create
  4. Set IP для pthread_create и выполнить
  5. Восстановление старого контекста.

Я думаю, что манипулирование правами доступа к памяти также будет включать вызов mprotect из контекста процесса. Как уже упоминалось выше, самый простой способ сделать это не будет, используя ptrace, но используя предварительно скомпилированный общий объект.

3

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

Вот хороший учебник: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/

+0

'LD_PRELOAD' работает только в сочетании с запуском новых процессов. Кажется, что OP ищет способ ввести код в уже запущенный процесс, поскольку это то, что «CreateRemoteThread» делает в Windows. У Windows есть эквивалент 'LD_PRELOAD'. –

Смежные вопросы