Внедрить поток с LD_PRELOAD и безопасностью потока - PullRequest
1 голос
/ 17 февраля 2012

Я работаю над проектом по добавлению общей библиотеки в программу с LD_PRELOAD.

Моя внедренная библиотека создает новый поток, когда она внедряется в программу. Вся логика происходит в этом потоке (например, анализ сетевого трафика и т. Д.).

Сначала вы должны знать это о загружаемой программе. Это клиентское приложение, которое шифрует каждый пакет, записанный в статический буфер, и отправляет его на сервер. Я нашел функцию, которая шифрует и отправляет пакеты в клиенте, и я смог ее обойти. Так что теперь я могу просто изменить статический буфер и позволить функции «send» зашифровать буфер и отправить буфер на сервер.

enter image description here

Но теперь у меня есть проблема: что если я изменю содержимое статического буфера в потоке моей библиотеки (чтобы я мог отправить поддельный пакет), и в то же время поток программы тоже изменит статический буфер? Это может привести к сбою.

Мне нужна какая-то синхронизация.

Так что я думал о некоторых решениях:

  1. Найдите все функции в программе, которые изменяют буфер, обойдут их и добавьте мьютекс к этому вызову или что-то в этом роде. Хотелось бы, как целую вечность ...
  2. Найдите способ выполнить мой фрагмент кода, который изменяет буфер, в одном блоке. Так что мой кусок кода фактически выполняется сразу, без переключения потоков POSIX на другие потоки. Это вообще возможно?
  3. Сделайте мое приложение синхронным и плачьте.

Может кто-нибудь придумать лучшее решение? Или вы знаете, как сделать решение 2 возможным?

Заранее спасибо, Гиллис

1 Ответ

1 голос
/ 17 февраля 2012

Если вы удалили функцию 'send' и у вас есть код вашей 'detoured send' в вашей предварительно загруженной библиотеке, это означает, что когда основной поток вызывает 'send', ваш код 'detoured send' будет выполнен в контексте основного потока ваш поток в этот момент ничего не делает.Если у вас есть более одного «основного потока», который потенциально может вызывать «отправить», то вам нужна синхронизация в «отправке в обход».

В качестве альтернативы, вы действительно хотите обработать что-то в своем новом «введенном»Поток, который вы можете: 1) в «отправке в обход» (вызывается из контекста основного потока): передать данные в ваш поток и подождать, пока он не закончит обработку данных (обратите внимание: основной поток ожидает ).

...