Есть ли способ найти pid процесса сокета-партнера?

У меня есть следующий случай:

  • Два приложения (мой и сторонний) на iOS должны взаимодействовать через TCP/IP
  • Я могу изменить код своего приложения, но не стороннее приложение
  • Невозможно изменить протокол (потому что я не могу изменить стороннее приложение).

В моем приложении я хочу убедиться, что я говорю с правильным приложением.

Я знаю, как я могу получить одноранговый порт с geetpeername

То, что я ищу, - это способ вычислить pid процесса, который использует этот порт.

Я нашел аналогичный вопрос: Как вы определяете PID однорангового TCP-соединения на одном устройстве iOS? Однако в его случае оба порта находятся в одном приложении.

Отказ от ответственности: я в порядке с частным API. Он не будет отправлен в AppStore. Тем не менее, я ищу решение для не взломанного телефона.

Обновление 1

Я сказал, что мне нужен PID, потому что известны способы получения связи между идентификатором PID и идентификатором приложения (с использованием sysctl).

Вообще говоря, я не забочусь о PID как таковой. Моя забота - выяснить, что такое приложение на другой стороне сокета.

1 ответ

У меня нет решения для этого, но если бы я попытался это сделать, я бы сделал следующее:

В системе UNIX вы можете использовать команду lsof, чтобы определить, какие процессы открывают файлы. Сюда входят сокеты, а lsof позволяет определить pid процесса, используя данный порт. Например, используйте

lsof -n -P -i :443

если вы пытаетесь определить, какой процесс использует порт 443 (HTTPS), который может дать (в OS X):

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox 81615 myname 112u IPv4 0xffffff8017379a40 0t0 TCP 192.168.2.7:52521->74.125.28.103:443 (CLOSE_WAIT)

Версия с открытым исходным кодом lsof для Дарвина, я считаю, можно найти здесь. Поэтому вы можете попробовать начать с main.c и использовать эти аргументы командной строки, перейдите по коду, пока не найдете используемые системные вызовы.

Конечно, возможно, что необходимые вызовы не будут работать при запуске в процессе с привилегиями пользователя. Но, может быть, нет? Если в источнике lsof есть проверка безопасности, вы можете, конечно, удалить это, если вы сами скопируете и вставьте исходный код.

В любом случае, возможно, стоит попробовать, если никто не предложит другого ответа.

Примечание. lsof доступен для телефонов с джейлбрейком, и я просто попробовал использовать текущие версии Cydia. Они не работали для меня в 5.1.1 или 6.1.2. Не знаю, почему. Я предполагаю, что если они были в репозитории, то в какой-то момент кому-то удалось переносить lsof в iOS.

licensed under cc by-sa 3.0 with attribution.