답변:
내가 아는 세 가지 방법이 있습니다. 나는 애플 리뷰 팀에서 일하지 않기 때문에 이것은 추측에 불과합니다.
otool -L
앱이 연결된 모든 라이브러리가 나열됩니다. IOKit 및 WebKit과 같이 사용하지 말아야 할 것이 분명히 감지 될 수 있습니다.
nm -u
연결된 모든 기호가 나열됩니다. 이것은 감지 할 수 있습니다
UITouch._phase
( 지난 몇 달간 Three20 기반 앱 거부의 원인이 될 수 있음 )strings
Objective-C 선택기는 바이너리의 특수 영역에 저장되므로 Apple은 여기에서 콘텐츠를 추출하고 -[UIDevice setOrientation:]
.
선택자는 메시지를 보내는 클래스와 독립적이므로 사용자 정의 클래스 -setOrientation:
가 UIDevice와 무관하게 정의하더라도 거부 될 가능성이 있습니다.
당신은 사용할 수 에리카 Sadun의 APIKit을 때문에 (의 잘못된 경보) 개인 API에 대한 잠재적 인 거부를 감지 할 수 있습니다.
(정말 정말로 이러한 검사를 해결하고 싶다면 다음과 같은 런타임 기능을 사용할 수 있습니다.
-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 개발 키트로 만들어 졌는지 기억이 나지 않습니다.
상징 조사를 제외하고 ...
apple은 지정된 메서드 중 하나에서 입력되었는지 확인하기 위해 호출 될 때 각 private 메서드 스택을 검사하는 sdk 버전을 매우 쉽게 가질 수 있습니다.
정적으로 링크하는 경우에도 최악의 경우 목록에있는 비공개 API에서 코드 샘플을 가져와 바이너리를 검색 할 수 있습니다 (또한 비교적 자동화하기 쉽습니다).
애플을 알면 그들이 포괄적이고 자동화 된 시스템을 가지고있을 것이고 불확실성은 아마도 거부되거나 수동으로 검토 될 것입니다.
결국 애플을 속이려고 노력할 가치가 없다고 생각합니다.
이 데스크톱 애플리케이션 인 App Scanner 는 Mach-O 바이너리 파일을 분리하여 개인 API 사용을 위해 .app 파일을 스캔 할 수 있습니다. 가능하다면 Apple도 가능합니다!
코드를 검사 할 수있는 리버스 엔지니어링을위한 많은 도구가 있습니다.
nm
-개체 파일의 기호를 나열합니다. objdump
-개체 파일의 정보를 표시합니다.otool
-Mach-O [정보] 실행 파일 의 내용보기strings
-이것은 당신에게 모든 문자열을 얻을 것입니다.Objective-C 및 Swift의 요점에서 이러한 명령을 사용하는 예제 / 표현을 찾을 수 있습니다.