Apple은 개인 API를 사용하고 있음을 어떻게 알 수 있습니까? 외에도 Apple은 사용 된 내용과 호출

소스 코드없이 바이너리 파일을 Apple에 제출했습니다.

소스 코드를 수동으로 확인하는 것 외에도 Apple은 사용 된 내용과 호출 한 API를 어떻게 알 수 있습니까?



답변

내가 아는 세 가지 방법이 있습니다. 나는 애플 리뷰 팀에서 일하지 않기 때문에 이것은 추측에 불과합니다.

1. otool -L

앱이 연결된 모든 라이브러리가 나열됩니다. IOKit 및 WebKit과 같이 사용하지 말아야 할 것이 분명히 감지 될 수 있습니다.

2. nm -u

연결된 모든 기호가 나열됩니다. 이것은 감지 할 수 있습니다

  • _UIImageWithName과 같은 문서화되지 않은 C 함수;
  • UIProgressHUD와 같은 Objective-C 클래스
  • Ivars UITouch._phase( 지난 몇 달간 Three20 기반 앱 거부의 원인이 될 수 있음 )

3. Objective-C 선택기 나열 또는 strings

Objective-C 선택기는 바이너리의 특수 영역에 저장되므로 Apple은 여기에서 콘텐츠를 추출하고 -[UIDevice setOrientation:].

선택자는 메시지를 보내는 클래스와 독립적이므로 사용자 정의 클래스 -setOrientation:가 UIDevice와 무관하게 정의하더라도 거부 될 가능성이 있습니다.


당신은 사용할 수 에리카 Sadun의 APIKit을 때문에 (의 잘못된 경보) 개인 API에 대한 잠재적 인 거부를 감지 할 수 있습니다.


(정말 정말로 이러한 검사를 해결하고 싶다면 다음과 같은 런타임 기능을 사용할 수 있습니다.

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar 등

개인 라이브러리, 클래스, 메서드 및 ivar를 가져옵니다. )


답변

터미널에서 다음 한 줄을 사용하여 Mach-O 프로그램의 선택기를 나열 할 수 있습니다.

otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n '3,$p' | perl -n -e 'print join("\n",split(/\x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(/\s/,$_))))))'


답변

개인 API를 사용하고 싶다고 가정 해 보겠습니다. 목표 C를 사용하면 문자열에서 SEL을 구성 할 수 있습니다.

   SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
    [UIDevice performSelector:my_sel ...];

로봇이나 도서관 스캔이 이것을 어떻게 잡을 수 있습니까? 런타임에 개인 액세스를 모니터링하는 도구를 사용하여이를 포착해야합니다. 이러한 런타임 도구를 구성하더라도이 호출이 거의 실행되지 않는 경로에 숨겨 질 수 있기 때문에 잡기 어렵습니다.


답변

바이너리가 가져 오려고하는 모든 기호 (심볼 테이블에서 쉽게 사용할 수있는 정보)를보고 “개인 API 목록”에서 해당 기호가 발견되면 사용자에게 딩딩한다고 생각합니다. 실제로 자동화하기가 매우 쉽습니다.


답변

실행 파일은 정확히 블랙 박스가 아닙니다. 도서관에 전화하면 쉽게 찾을 수 있습니다. 이것이 제가 현대 CS 교육에서 어셈블리 언어의 손실을 한탄하는 이유입니다. =] ldd와 같은 도구는 당신이 무엇을 연결했는지 알려줄 것입니다. 비록 나는 ldd의 화신이 Mac iPhone 개발 키트로 만들어 졌는지 기억이 나지 않습니다.


답변

otool -L somebinary


답변

상징 조사를 제외하고 …

apple은 지정된 메서드 중 하나에서 입력되었는지 확인하기 위해 호출 될 때 각 private 메서드 스택을 검사하는 sdk 버전을 매우 쉽게 가질 수 있습니다.