2014-04-19 1 views
1

기본적으로 사용자에게 카메라 피드가 표시되고이 앱이 실행 된시기를 알고 싶습니다. AVCaptureSession을 시작하고 어떤 앱이 시작했는지 감지 할 수있는 탈옥수 감지 방법?

나는 AVCaptureSession

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

-(void)startRunning;

하지만

가 작동하지 않습니다에 후크하려고 노력했다. sharedApplicationnull을 반환합니다. 나는 또한 %c(SpringBoard) 또는 objc_getClass("SpringBoard")에 메서드를 호출하려고했지만 동일한 결과가있었습니다. 이 외에도

, 내가 필터에 지정된 있지만 com.apple.springboard 같은 여러 번들을 사전을 메시지 프로그램에서 카메라를 열 경우에만 작동 후크, com.facebook.Facebook

내가 잘못 뭐하는 거지? AVCaptureSession 다른 앱에서 API를 사용하지 않습니까?

답변

1

SpringBoard 클래스는 SpringBoard 프로세스에만 존재하므로 %c(SpringBoard) 또는 objc_getClass("SpringBoard")은 다른 프로세스에서 nil을 반환합니다. 당신이 접선중인 응용 프로그램의 현재 번들 이름, 당신은 [[NSBundle mainBundle] bundleIdentifier]을 사용할 수 있습니다

얻을합니다. 이 정보를 보내려면 IPC/XPC 형식을 사용해야하며 알고 싶은 세션에 관한 추가 정보를 사용해야합니다. 수신단은 SpringBoard 프로세스 또는 개인 데몬이 될 수 있으므로 SpringBoard를 추가 작업으로 방해 할 수 없습니다.

"다른 앱에서 AVCaptureSession API를 사용하지 않습니까?"라는 질문에 따라 일부 응용 프로그램에서는 다른 클래스를 사용하여 이미지/비디오를 캡처하여이 훅을 쓸모 없게 만들 수도 있습니다. 탈옥수 개발자로서 나는 많은 다른 사람들처럼 애플 프로그래머가 엄격한 코딩 스타일을 따르지 않는다는 것을 발견했다. 같은 목적을 달성하는 다른 하위 수준 함수도있을 수 있습니다.이 경우 C 함수와 병렬로 클래스 덤프가 없으므로 더 많은 작업을해야합니다.

+0

저급 기능을 찾는 방향으로 나를 안내해 줄 수 있습니까? 아니면 응용 프로그램/개발자별로 무엇입니까? 그렇더라도 비디오 렌더링을 위해 다른 API를 사용할 수있는 앱이 너무 많아서 막 다른 골목에 이르렀거나 나쁜 타협을했다고 생각합니다. – oneNewbieCoder

+0

물론 하위 수준 기능의 경우 nm 및 otool과 같은 도구를 사용할 수 있습니다 (자세한 내용은 http://iphonedevwiki.net/index.php/Reverse_Engineering_Tools 참조). creker의 대답을 보았을 때, 그는 또한 IPC를 알림 형식으로 언급했습니다. AVCaptureSession이 호출 될 때 AVCaptureSession이 사용되는 시점을 알 수 있기 때문에이 방법으로 (적어도 우리가 생각한 것처럼) 말합니다. 파일을 사용하면 CPU주기를 낭비하는 폴링이 발생합니다. 막 다른 골목에 대해서는 실제로는 없습니다. 정보를 얻을 수있는 곳과 다른 개발자와 연락 할 수있는 곳이 많습니다. – uroboro

+0

@uroboro, 폴링은 그것을 수행하는 한 가지 방법입니다 (정기적으로 변경 사항을 확인하면 많은 CPU를 낭비하지 않을 것입니다). 'kqueue'를 사용하여 폴링없이 파일/디렉토리 변경 사항을 모니터링 할 수도 있습니다. – creker

1

가장 분명한 것은 모든 응용 프로그램에 후크를로드하는 것입니다. 이를 달성하기 위해 번들 필터로 com.apple.UIKit을 사용할 수 있습니다. 이렇게하면 AVCaptureSession -(void)startRunning 또는 UIImagePickerController 메서드를 사용하여 카메라 사용을 탐지하는 모든 응용 프로그램에 후크가로드됩니다.

이의 문제 - 당신은 샌드 박스 응용 프로그램 내에서 사용자 정보와 함께 통지를 보내도록 일부 IPC 메커니즘을 구현해야합니다. IPC API를 보낼 수있는 API를 모른다. 분산 알림은 샌드 박스 앱의 알림이있는 사용자 정보를 보낼 수 없으며 비어 있어야합니다. 다윈 알림 센터는 사용자 정보를 지원하지 않습니다. CFMessagePort도 작동하지 않습니다. XPC 일 수도 있지만 시도하지는 않았습니다.

한 가지 가능한 솔루션도 샌드 박스 응용 프로그램은 (http://iphonedevwiki.net/index.php/Seatbelt를) 쓰기 권한이 경우 디렉토리를 찾을 수 있습니다. 그렇게하면 몇 가지 데이터로 해당 디렉토리에 파일을 만들고 다윈 (Darwin) 알림을 사용자에게 전송할 수 있습니다. 예를 들어, 이러한 알림을 준수하는 데몬을 가정 해 봅시다. 그러면이 데몬은 파일을 찾아 통지에 첨부 한 데이터를 읽습니다.

"하위 수준 기능"은 카메라에 액세스하는 것과 같습니다. 기본적으로 카메라에 액세스 할 수있는 두 가지 방법이 있습니다 (AVCaptureSessionUIImagePickerController). 그것들은 앱 스토어 앱에서 사용할 수있는 유일한 공개 API입니다. 우리가 cydia 앱/비틀기에 대해 이야기하고 있다면 AVFoundation API가있을 때 아무도 신경 쓰지 않을 것이라고 생각합니다.

+0

불분명 한 점이 몇 가지 있습니다. 'AVCaptureSession'의 후크가''com.xyz.bundle'에 의해 사용 된 카메라 '라고 말하기 위해 파일에 쓸 수 없습니까? 왜 내가 알림이 필요하겠습니까? 또한'com.apple.UIKit'로 필터링해도 해결되지 않습니다. 이전과 마찬가지로'- (void) startRunning'으로 파일에 쓰려고했지만, 실제로 쓰는 메시지 앱에서 카메라를 열 때만 가능합니다. 그래서 IPC 메커니즘이 필요합니다. 앱 스토어의 다른 앱은? – oneNewbieCoder

+0

앱이 카메라를 사용하기 시작하면 바로 알아야한다고 생각했습니다. 'startRunning'을 호출하기 만하면 파일에 쓸 수 있습니다.'com.apple. UIKit' 필터는 UI가있는 모든 응용 프로그램에 맞게 조정해야합니다 (데몬의 경우'com.apple.avfoundation' 필터를 추가하는 것이 좋습니다). 왜 작동하지 않는 지 모르겠다. 적어도 'startRunning' 후킹이 작동하는지 테스트하려면 파일 쓰기 대신 NSLog를 사용하고 콘솔을 살펴보십시오 샌드 박스는 파일 쓰기를 거부 할 수 있습니다. – creker

관련 문제