iPhone Hacking 성공 (Camera framework)

iPhone SDK에는 자세한 Reference와 함께 공개된 framework와 apple에서 공개하길 꺼려하는 private framework가 있습니다.

이 private framework 안에 Camera 라는 framework가 존재합니다.
(/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/System/library/PrivateFrameworks)

아래는 Camera framework 안에 정의되어 있는 함수 목록입니다.

PutSurface: freeBitmapData: _CameraDeviceGetPreviewSurface: CapturePreviewSurface: CameraDeviceDeallocate: CameraDeviceRegisterClass: CameraDeviceGetTypeID: CameraDeviceSetProperties: CameraDeviceStopPreview: CameraDeviceSetClient: CameraDeviceSetCaptureCallback: CameraDeviceSetImageQueueHelper: CameraDeviceScheduleWithRunLoop: CameraDeviceUnscheduleFromRunLoop: CameraDeviceCreate: CameraDeviceGetPropertiesCopy: CameraDeviceTakePhoto: CreateBGRABuffer: CameraDeviceStartPreview: CameraDeviceRecycleSurface: CameraDeviceCaptureCallback: CameraImageQueueHelperDeallocate: CameraImageQueueHelperRegisterClass: CameraImageQueueHelperGetTypeID: CameraImageQueueHelperGetQueue: CameraImageQueueHelperReleaseBuffer: CameraImageQueueHelperHandleCallback: CameraImageQueueHelperCreate: openJPEGDriverUserClientConnection: closeJPEGDriverUserClientConnection: encodeJPEGWithDriver: JPEGCompressSurface:

위의 함수 중에서 필요한 함수를 Reverse Engineering 해서 C코드 형태로 바꾸어
구현 내용을 파악하는데 성공하였습니다.

사실 Apple이 공개한 카메라 관련 라이브러리는 UIImagePickerController 달랑 하나 밖에 없습니다.
사진 밖에 찍을 수 없는 아주 제한적인 API이죠.
(더구나 UIImagePickerController 은 Memory Leak과 관련한 문제점들도 보고되고 있습니다.)

그러나 위에 열거된 함수를 사용하면 카메라의 모든 기능을 사용할 수 있습니다.
예를 들면 Preview를 원하는 크기에, 원하는 위치에 표시한다던지,
아니면 동영상을 녹화 한다던지, 특정 프레임만을 캡처한다던지 하는 등의 기능들을요.

함수 이름이 직관적이니 어떤 기능을 하는지는 쉽게 유추할 수 있을 겁니다.

저는 개인적으로
매 프레임이 callback 형태로 불려지게 되는데
그 callback 함수를 어떻게 사용해야 하는지를 알아내는데 시간이 좀 걸렸습니다.

동영상 캡처를 만드는 프로그램을 제작할 생각이 있다면 위의 함수들을 꼭 사용하거나
아니면 비슷하게 구현해야 합니다.
인터넷 상에 일부 돌아다니는 소스 중에는 타이머를 걸고 Window 화면 자체를  스크린샷처럼 찍어서 캡처하는 방식이 있는데
이 방법은 좀 구식인 것 같습니다.(이 방법은 frame rate이 10 frames/s 이상 나오질 않습니다.)

XCODE를 처음 깔고 9일만에 Reverse Engineering에 성공했을 만큼
비교적 ARM 아키텍트는 쉬우니 RE가 가능하신 분들은 한번 도전해보시기 바랍니다.

p.s. Reverse Engineering을 어떻게 했는지, 함수들을 어떻게 사용하는지에 관련된 질문은 사절입니다. ^^;;

chaoskcuf
프로그래밍/iPhone 2009/02/02 00:11

트랙백 주소 : http://chaoskcuf.com/trackback/181

댓글을 달아 주세요

  1. statcomp 2009/08/06 06:55  수정/삭제  댓글쓰기

    리버스 엔지니어링 하는 방법은 다음 페이지를 참조하세요

    http://arstechnica.com/apple/news/2008/ ··· orks.ars

    • chaoskcuf 2009/08/06 10:52  수정/삭제

      역시 Erica Sadun 아티클이군요.. +_+

      저도 리버스 엔지니어링할 때 저분 도움 상당히 많이 받았습니다~

  2. lovegizmo 2009/11/13 15:00  수정/삭제  댓글쓰기

    lovegizmo@gmail.com

    '소스 중에는 타이머를 걸고 Window 화면 자체를 스크린샷처럼 찍어서 캡처하는 방식이 있는데
    이 방법은 좀 구식인 것 같습니다.(이 방법은 frame rate이 10 frames/s 이상 나오질 않습니다'

    어디서 이 소스를 찾을 수 있을까요?
    알려주실 수 있으신가요?

Powerd by Textcube, designed by criuce
rss