앞서 살펴본 글에서 iOS 10버전 이후로는 dyld 소스코드가 변경되어 자동으로 환경변수 값을 필터링 하지 않는다고 했다. 하지만 동일한 행위를 매뉴얼하게 직접 수행하여 필터링 하는 방법으로 대체 가능하다.
DYLD_INSERT_LIBRARIES 환경변수 값에 injection을 원하는 동적 라이브러리 이름을 명시하면, 앱 시작 시 해당 라이브러리를 메로리로 로드 및 실행시킨다.
Cydia Substrate를 비롯하여 라이브러리 삽입 시 이 환경변수를 많이 이용한다. 따라서 환경변수 값을 검사하여 코드 삽입을 탐지할 수 있다.
핵심 : 정상적인 경우 동적라이브러리가 앱의 .app 폴더에 담겨있으며, Mach-O 헤더에 각 라이브러리를 로드하도록 설계되어 있으므로 별도의 환경변수를 필요로 하지 않는다.
강의자료 예시

강의자료에서도 한번 다룬 적이 있다. Objective-C의 런타임 라이브러리 함수들을 이용하여 직접 함수를 후킹해보고 후킹 과정을 이해하는 후킹 파트의 첫 실습이다.
여기서도 후킹할 라이브러리를 DYLD_INSERT_LIBRARIES 환경변수에 등록하여 자동으로 라이브러리가 메모리에 로드되고, initialize 함수가 호출되면서 메소드를 후킹하는 실습으로 마무리 한 바 있다.
탐지 코드
#if !TARGET_IPHONE_SIMULATOR //DYLD_INSERT_LIBRARIES 환경변수에 값이 있다면 탈옥 감지. //일반적으로 해당 환경변수에는 null이 담겨있다. char *env = getenv("DYLD_INSERT_LIBRARIES"); if(env) { //탈옥된 장치다. NSLog(@"%s", env); //후킹할 라이브러리 이름까지 확인할 수 있다. } #endif
주석으로 설명한 바와 동일하다.
일반적으로는 DYLD_INSERT_LIBRARIES 환경변수에는 null이 담겨있다.
동적라이브러리 후킹을 위해 환경변수 값을 수정하므로 null이 아니라면 탈옥으로 간주할 수 있다.