메세징 기법 구현한 c 구조체 뜯어보기

요약
메세징 방식의 내부 구현체 뜯어보기
Tags

1) Objc 뜯어보기

Hello *hello = [ [ Hello alloc ] init ] ; [ hello say:@”Hello, world!”];
여기서 호출된 메소드는 총 3개
  • alloc, init, say
런타임 함수를 이용해서 어떻게 변환될까?

2) objc_msgSend 런타임 함수

[수신자 메세지] 구문이 objc_msgSend() 런타임 함수로 변환됨.

C 언어 프로토타입

  • id objc_msgSend(id self, SEL op, ...)
  • 메세지수신자(id self)
    • 메세지가 전달될 클래스 인스턴스를 가리키는 포인터
  • 셀렉터(SEL op)
    • 메세지를 처리할 메소드 이름 (문자 배열)
notion image
  • objc_msgSend() 만으로는 함수 구현에 어떻게 도달하는지 모름.
  • ’후킹’을 하려면 좀 더 자세한 내부 과정을 알 필요가 있음.

3) objc_object C 구조체

  • objc_objectobjc_class 구조체 포인터를 멤버로 가지는 구조체
  • objc_class 구조체 포인터는 Objc 클래스의 인스턴스를 나타냄.
notion image

4) objc_class C 구조체

objc_class C 구현 (얘가 인스턴스라고 보면 됨)
notion image

5) objc_method_list C 구조체

메소드 리스트
notion image

6) objc_method C 구조체

메소드 구조체
notion image
 

7) 후킹을 위한 정리

  • 객체isa 변수를 가지고, 이는 클래스 오브젝트를 가리킨다.
  • 클래스 오브젝트에는 메소드 목록이 있다.
  • 메소드 구조체에는 메소드의 실제 구현 위치가 담겨있다.
  • 런타임 함수를 이용해서 메소드 구현을 바꾸자.
notion image