동적라이브러리 삽입
동적라이브러리 삽입
1) 연습용 바이너리 준비
실습 코드 작성
후킹 되기 전에는 Hello world를 출력하는 간단한 코드ios로 크로스컴파일
- xcrun -find -sdk iphoneos clang 명령어 결과를 보고 환경변수 등록.
- export PLATFORM=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/
- clang -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -arch arm64 ~/Downloads/main.m -o ~/Downloads/main -lobjc -framework Foundation
- iDevice로 옮긴 후 lldb로 메소드 호출 부분을 보자.
- 모든 메소드 호출이 objc_sendMsg( id, sel, ... ) 형태로 호출됨.
2) 삽입할 동적라이브러리
코드 작성
ios로 크로스 컴파일
- clang -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -c ~/Downloads/injection.c -o ~/Downloads/injection.o fPIC arch arm64
- ld dylib lsystem -o ~/Downloads/injection.dylib ~/Downloads/injection.o -syslibroot $(xcrun --sdk iphoneos --show-sdk-path)
3) 동적 라이브러리 함수로 후킹 진행
- 디버거 상에서 프로세스에 붙은 뒤 아래 명령어 입력
- call (void *) objc_getClass("Hello")
- 원하는 클래스의 메모리 주소 획득 //$0에 담음
- call (void *)sel_registerName("say:")
- say:라는 이름의 셀렉터 생성 //$1에 담음
- call (void *)class_getMethodImplementation($0, $1)
- 원본 say 메소드의 포인터를 리턴 //$2에 담음
- call (void *)dlopen("injection.dylib", 2)
- 인젝션할 라이브러리 로딩 및 링크 //$3에 담음
- call (int *)dlsym($3, "injected_say")
- call (void *)class_replaceMethod($0, $1, $4, "@:")