🤛🏽

DYLD_INSERT_LIBRARIES 환경변수 검사

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

강의자료 예시

notion image
강의자료에서도 한번 다룬 적이 있다. 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이 아니라면 탈옥으로 간주할 수 있다.