문제

iPhone 개발자 커뮤니티 간의 컨센서스 개발은 최근 Apple이 문서화되지 않은 API 통화 사용을 감지하기 위해 정적 코드 분석 도구를 사용하기 시작했다는 것입니다.

논쟁을 위해서만, 나는 다음과 같이 런타임에서 호출을 생성 함으로써이 도구를 해결할 수 있는지 궁금합니다.

NSString *const aMethod = @"doStuff:withStuff:";
SEL aSelector = NSSelectorFromString(aMethod);
NSMethodSignature *aSignature = [targetObject methodSignatureForSelector:aSelector];
NSInvokation *anInvokation = [NSInvokation invocationWithMethodSignature:aSignature];
[anInvokation setTarget:targetObject];
[anInvokation setSelector:aSelector];
[anInvokation setArgument:&firstArg atIndex:2];
[anInvokation setArgument:&secondArg atIndex:3];
[anInvokation invoke];

거의 너무 쉬워 보이므로 궁금합니다. 내가 무엇을 놓치고 있습니까? Apple은 어셈블리에서 정적 코드 분석을 사용하여 어떻게이를 감지 할 수 있습니까?

몇 가지 점 :

  1. 메소드 이름이 바이너리에 정적 문자열로 저장 될 것임을 알고 있습니다. 그러나 StringWithFormat : 또는 다른 유형의 약간의 난독 화 (정적 분석기를 혼동하기에 충분 함)를 사용하여 런타임에 메소드 이름을 생성하는 것은 사소한 일입니다.
  2. 나는이 트릭이 GDB를 사용한 가장 사소한 런타임 분석에 의해 드러날 것이라는 것을 알고 있습니다. 내 이해는 Apple이 이진 자체를 분석하고 아마도 그것에 대해 완전히 잘못된 것입니다.
도움이 되었습니까?

해결책

왜 관심이 있습니까? 정당한 이유로 개인 API를 사용해서는 안됩니다. Apple은 언제든지 사용자를 화나게하여 응용 프로그램을 쉽게 깨뜨릴 수 있습니다.

즉, nsinvocation, -performselector의 사용 : 또는 다른 유사한 기술로 인해 정적 분석기의 탐지를 피하기에 충분할 것입니다.

다른 팁

나는 당신이 읽은 것이라고 생각합니다 이 기사. 또한 흥미 롭습니다 이 하나. 저의 해석은 Apple의 정적 분석기가 개인 방법과 동일한 이름을 가진 방법을 사용하기 때문에 Apple의 정적 분석기가 잘못된 긍정을 생성한다는 것입니다. 분석기가 런타임 분석 또는 클래스 선택기가 호출 된 철저한 점검을 수행 한 경우에는 일어나지 않았을 것입니다. 따라서 주로 바이너리에서 문자열이나 선택기를 찾고있는 것 같습니다. 나는 그것이 사용한다고 생각합니다 NSInvocation 일부 문자열 난독 화와 함께 당신을 통과시킬 것입니다. 그래도 개인 API에 의존하지 않는 것이 좋습니다.

쉽게 찾을 수있는 방법이 있습니다!

질문의 메소드를 통해 숨겨진 API를 고의적으로 사용하는 앱을 만들고 받아 들여지면 확인하십시오!

추신 : 당신이 알게되면, 당신이 우리에게 말해야합니다. 우리는 모두 확실히 알고 싶습니다. Apple은 반드시 우리에게 말하지 않을 것입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top