IT story

Apple은 개인 API를 사용하고 있다는 것을 어떻게 알 수 있습니까?

hot-time 2020. 8. 3. 17:35
반응형

Apple은 개인 API를 사용하고 있다는 것을 어떻게 알 수 있습니까?


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

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


내가 아는 3 가지 방법이 있습니다. Apple 리뷰 팀에서 일하지 않기 때문에 이것들은 약간의 추측입니다.

1. otool -L

앱이 연결된 모든 라이브러리가 표시됩니다. IOKit 및 WebKit과 같이 명확하게 사용해서는 안되는 것이 이것에 의해 감지 될 수 있습니다.

2. nm -u

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

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

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

Objective-C 선택기는 바이너리의 특수 영역에 저장되므로 Apple은 여기에서 컨텐츠를 추출하여 문서화되지 않은 Objective-C 메소드 (예 :)를 사용했는지 확인할 수 있습니다 -[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 dev 키트에 어떤 영향을 주 었는지 기억하지 못합니다.


otool -L somebinary

심벌 조사 외에 ...

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


정적으로 연결하더라도 최악의 경우 목록의 개인 API에서 코드 샘플을 가져 와서 바이너리를 검색 할 수 있습니다 (상대적으로 자동화하기 쉽습니다).

애플을 알고 있다면, 그들은 포괄적이고 자동화 된 시스템을 가지고 있으며, 불확실성은 아마도 수동으로 거부되거나 검토 될 것입니다.

하루가 끝나면 애플을 속이려고 노력할 가치가 없다고 생각합니다.


이 데스크톱 응용 프로그램 인 App Scanner 는 Mach-O Binary 파일을 분리하여 .app 파일에서 개인 API 사용을 검색 할 수 있습니다. 가능하다면 애플도 할 수 있습니다!


코드를 검사 할 수있는 리버스 엔지니어링 도구가 많이 있습니다

  • nm -객체 파일의 기호를 나열합니다
  • objdump -객체 파일의 정보를 표시합니다.
  • otool-Mach-O [About] 실행 파일 의 내용을 봅니다.
  • strings -이것은 당신에게 모든 줄을 줄 것입니다.

Objective-CSwift의 요지에서 이러한 명령을 사용하는 예 / 표현을 찾을 수 있습니다.

참고 URL : https://stackoverflow.com/questions/2842357/how-does-apple-know-you-are-using-private-api

반응형