동적라이브러리 삽입

요약
Tags
hook

동적라이브러리 삽입

1) 연습용 바이너리 준비

실습 코드 작성

후킹 되기 전에는 Hello world를 출력하는 간단한 코드
후킹 되기 전에는 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) 삽입할 동적라이브러리

코드 작성

notion image

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)
  • 동적 오브젝트도 실행하려면 코드서명 필요
    • ldid –S injection.dylib

3) 동적 라이브러리 함수로 후킹 진행

  • 디버거 상에서 프로세스에 붙은 뒤 아래 명령어 입력
  • call (void *) objc_getClass("Hello")
    • 원하는 클래스의 메모리 주소 획득 //$0에 담음
  • call (void *)sel_registerName("say:")
    • say:라는 이름의 셀렉터 생성 //$1에 담음
  • call (void *)class_getMethodImplementation($0, $1)
    • 원본 say 메소드의 포인터를 리턴 //$2에 담음
    • notion image
       
    • call (void *)dlopen("injection.dylib", 2)
      • 인젝션할 라이브러리 로딩 및 링크 //$3에 담음
    • call (int *)dlsym($3, "injected_say")
      • 함수를 가리키는 포인터 반환 //$4에 담음
    • call (void *)class_replaceMethod($0, $1, $4, "@:")
      • 메서드 교체 진행
      • notion image