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


109

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

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


제목 변경- "Apple은 어떻게 알고 .."를 의미한다고 생각합니다.
Anurag

답변:


173

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

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를 가져옵니다. )


좋은 대답입니다. 애플리케이션이 비공개 API를 사용하지 않고는 매우 어려운 작업을 수행하는 경우 앱이 추가 조사를받을 것이라고 덧붙일 것입니다.
Matthew Frederick

개인 메서드를 호출하는 해결 방법이 궁금합니다. 컴파일러가 [foo privateMethod]에 대한 objc_msgSend (foo, @selector (privateMethod)) 호출을 생성 할 것이라고 생각하므로 Apple이 privateMethod의 직접 호출을 감지 할 수 있다면 objc_msgSend (또는 performSelector :)를 통해 간접 호출도 감지 할 수 있습니다.
an0

IOKit 및 WebKit에 대해 링크하면 안된다고 말하는 이유가 궁금합니다.
hjaltij 2011

2
otool을 무엇에서 실행합니까? .app 파일?
Rob

1
@Eric, 그들은 그렇게 할 수 있지만 그러한 계측 버전은 아마도 성능에 영향을 미칠 것입니다. 에 관계없이, 보는 개인 API를 반복적으로 앱 스토어에 통과, 그것은 그들이 것이 분명 하지 않습니다 그것은 모든 시간을하지 적어도 이렇게, 또는.
Nate

26

터미널에서 다음 한 줄을 사용하여 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/,$_))))))'

+1, @Robert Diamond, 동일하게 더 설명해 주시겠습니까? Google 분석이 UDID 호출을 사용하는지 확인해야합니다. 감사합니다
Mangesh 2013 년

13

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

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

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


user1203764 는 이러한 종류의 호출이 실제로 감지 될 수 있다고 언급 합니다.
Rup

@Rup은 valueForKey 사용에 대한 내 질문에 대한 의견을 남기고 싶습니다. stackoverflow.com/questions/11923597/…
Dan Rosenstark

1
@Yar 흥미로운 질문! 그러나 나는 미안하다고 말할만큼 전문가가 아니다. 무엇 Farcaller 말한 것은 나에게 합리적인 것 같다
RUP를

@Rup 감사합니다, 아무도 분명히 :)이 분야의 전문가의 부족입니다
댄 Rosenstark는

내가 아는 누군가가 방금 App Store에 이와 같은 전화를 받았다고합니다.
bugloaf

7

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


1
사실, 내가 아는 개인 API 사용을 기반으로 이것이 사실이 아니라는 것을 확실히 말할 수 있습니다 (적어도 그들이하는 전부 는 아닙니다 ). 이것이 필요한 모든 것이라면 개인 API 사용이 실패 하지 않을 것 입니다. 내 경험에 따르면 KennyTM의 대답은 거의 확실합니다. 이것은 Objective-C가 C와 같은 다른 언어와 근본적으로 다른 영역입니다.
Nate

1

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


1
나는 자주 궁금해했다. 만약 당신이 자체 수정을 위해 바이너리를 작성한다면, 애플이 그것을 잡을 수 있을지 여부를 몇 가지 기준이 충족 된 후에 (예를 들어, 앱의 게시일 이후) 개인 API를 가져 오는 코드를 생성하는 것 뿐이다. 그들은 탈옥 된 휴대폰에서 실행되는 게임의 수와 같은 흥미로운 통계를 확실히보고합니다.
Sniggerfardimungus

@ user30997, 권한있는 코드는 시스템 호출을 통해서만 액세스 할 수 있습니다. 실행 스레드는 더 높은 권한으로 전환하고 이전 권한에 코드를 실행할 권한이 있는지 여부를 확인합니다. 즉이 그 일을하는 다른 방법이 있습니다,하지만 난,하지만 그냥 예입니다 매우 개발자들이 이와 같은 메커니즘을 검사하는 기본 실행 권한을 떠날 순진 충분했다 의심, 그것은 확실히 지금까지 공개 된 것이다.
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳


1

상징 조사를 제외하고 ...

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


프로그램은 다른 논리에 따라 향후 임의의 시간에만이 개인 호출을 호출 할 수 있기 때문에 충분하지 않습니다. 이를 조사하기 위해 Apple은 실제로 비공개 API를 모두 차단하거나 프레임 워크가 비공개 API 호출을 Apple에 자동으로보고하도록해야합니다. 이로 인해 성능이 크게 저하됩니다.
Motti Shneor 2016

0

정적으로 링크하는 경우에도 최악의 경우 목록에있는 비공개 API에서 코드 샘플을 가져와 바이너리를 검색 할 수 있습니다 (또한 비교적 자동화하기 쉽습니다).

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

결국 애플을 속이려고 노력할 가치가 없다고 생각합니다.


4
불확실성에 직면했을 때 Apple의 검토 프로세스를 아는 것은 최대한의 기발함을 위해 주사위 세트를 분리하는 것과 관련이 있습니다.
내 올바른 의견입니다.

0

이 데스크톱 애플리케이션 인 App Scanner 는 Mach-O 바이너리 파일을 분리하여 개인 API 사용을 위해 .app 파일을 스캔 할 수 있습니다. 가능하다면 Apple도 가능합니다!


0

코드를 검사 할 수있는 리버스 엔지니어링을위한 많은 도구가 있습니다.

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.