Как обнаружить запуск джейлбрейк-твика AVCaptureSession и узнать, какое приложение запустило его?

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

Я пытался зацепить AVCaptureSession"s -(void)startRunning;

но

SBApplication *topApp = [(SpringBoard *)[UIApplication sharedApplication] _accessibilityFrontMostApplication];

не работает. Оказывается, зовет sharedApplication возвращается null, Я также пытался вызвать метод на %c(SpringBoard) или же objc_getClass("SpringBoard") но имел тот же результат.

Кроме того, ловушка работает только при открытии камеры в приложении Сообщения, хотя я указал в словаре фильтров несколько пакетов, как com.apple.springboard, com.facebook.Facebook и т.п.

Что я делаю неправильно? не AVCaptureSession API используется другими приложениями?

2 ответа

Решение

Класс SpringBoard существует только в процессе SpringBoard, поэтому %c(SpringBoard) или же objc_getClass("SpringBoard") вернет ноль на любом другом процессе.

Чтобы получить текущее имя пакета приложений, которые вы подключаете, вы можете использовать [[NSBundle mainBundle] bundleIdentifier], Вам придется использовать какую-то форму IPC/XPC для отправки этой информации, а также дополнительной информации о сеансе, о которой вы хотите знать. Принимающей стороной может быть либо процесс SpringBoard, либо личный демон, чтобы не забивать SpringBoard дополнительными задачами.

Что касается вашего вопроса "Не AVCaptureSession API, используемый другими приложениями?", Возможно, некоторые приложения используют другие классы для захвата изображений / видео, что делает этот хук бесполезным. Как разработчик джейлбрейка, я обнаружил, как и многие другие, что программисты Apple не придерживаются строгого кодирования Кроме того, могут быть другие функции более низкого уровня, которые достигают той же цели, и в этом случае вам придется проделать больше работы, так как отсутствует дамп класса, параллельный функциям C.

Самым очевидным было бы загрузить свой хук в каждое приложение. Для достижения этого вы могли бы использовать com.apple.UIKit как пакетный фильтр. Таким образом, ваш хук будет загружен в каждое приложение, где вы бы подключили AVCaptureSession -(void)startRunning или же UIImagePickerController методы обнаружения использования камеры.

Проблема в том, что вам нужно реализовать механизм IPC для отправки уведомлений с информацией о пользователях из изолированного приложения. Я не знаю ни одного IPC API, который мог бы их отправлять. Распределенные уведомления не могут отправлять информацию пользователя с уведомлениями из изолированного приложения - она ​​должна быть пустой. Центр уведомлений Дарвина не поддерживает информацию пользователя. CFMessagePort также не работает. Может быть, XPC делает, но я не пробовал.

Одним из возможных решений является поиск каталога, в котором даже изолированное приложение имеет права на запись ( http://iphonedevwiki.net/index.php/Seatbelt). Таким образом, вы можете создать в этом каталоге файл с некоторыми данными и отправить уведомление Дарвина вашему, скажем, демону, который будет наблюдать за этими уведомлениями. Затем этот демон найдет файл и прочитает данные, которые вы "прикрепили" к вашему уведомлению.

Что касается "функций нижнего уровня" для доступа к камере. По сути, есть два способа получить доступ к камере: AVCaptureSession а также UIImagePickerController, Это единственные открытые API, доступные для приложений AppStore. Если мы говорим о приложениях / настройках cydia, я не думаю, что кто-то будет беспокоиться, если у вас есть API-интерфейсы AVFoundation.

Другие вопросы по тегам