원리는 아래 포스트를 참조하고, 추가한 소스코드만 정리한다.
동적라이브러리 리스트 검사 (화이트박스, 블랙박스)코드 작성
//동적라이브러리 총 개수 int count = _dyld_image_count(); //필요한 동적라이브러리가 있다면 쭉 이어붙여서 적어주면 됨. //예시를 위해서 임의의 라이브러리를 적었음 (탈옥관련 라이브러리도 포함됨) const char* libraries = "/usr/lib/substrate/SubstrateBootstrap.dylib, /Developer/usr/lib/libBacktraceRecording.dylib,/Developer/usr/lib/libMainThreadChecker.dylib,/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib,/System/Library/Frameworks/Foundation.framework/Foundation,/usr/lib/libobjc.A.dylib,/usr/lib/libSystem.B.dylib"; //모든 동적라이브러리 검사 for (int i = 0; i < count; i++) { //라이브러리 이름 받아옴. const char * imageName = _dyld_get_image_name(i); //화이트리스트에 명시된 라이브러리인지 + 라이브러리가 샌드박스 경로에서 온 건지 (BundleID는 매번 바뀌므로 @@@@/Application 까지만 검사하는 것) if (!strstr(libraries, imageName)&&!strstr(imageName, "/var/containers/Bundle/Application")) { printf ("This library is not in the white list!!\n%s", imageName); exit(1); } printf("[Dylib Loaded : %s]\n", imageName); }
결과 로그

어떤 dylib들이 메모리에 올라와있는지 확인하고자 exit(1) 코드를 주석한 결과다.
각종 탈옥관련 dylib들을 확인할 수 있는데, exit(1)코드를 다시 살리면 라이브러리가 필터링되어 앱이 종료된다.