What Happens If You Implement FishHook?
fishhook(https://github.com/facebook/fishhook) 많이 들어보셨을 겁니다.
facebook에서 만든 mach-o 심볼 리바인딩 라이브러리 입니다.
fishhook 하면 무슨일이 생기는지 알아봅시다.
fopen 함수를 fishhook 했더니 로그가 잘 찍힙니다.
음 fopen 함수 후킹했으니 fopen 함수 시작부가 fake_fopen 함수 주소로 이동되도록 메모리 패치 되었겠지...라고 생각하고 메모리를 봤더니 아무런 변화가 없습니다.
뭘까요? 어떻게 후킹이 된것일까요?
mach-o 파일은 로드가 되면, 외부 c함수의 주소를 __la_symbol_ptr 라는 테이블에 동적으로 저장해서 사용합니다.
fishhook은 이 테이블에 저장되는 주소값을 fake_fopen 함수의 주소로 바꿔치기 하는 것입니다.
__la_symbol_ptr 테이블에서 fopen 을 검색해보니 0x3f59d38 위치에 주소값을 저장하는군요.
(1) Before FishHook
앱 실행 후 오프셋 0x3f59d38 으로 이동해봅시다. 0x193bfe624 라는 주소값이 저장되어 있습니다. fopen 함수의 주소값이죠.
해당 주소로 이동해보니 libsystem_c.dylib 에 속해있네요. real fopen 함수 주소가 맞군요.
(2) After FishHook
앱 실행 후 오프셋 0x3f59d38 으로 이동해봅시다. 0x1004c3998 라는 주소값이 저장되어 있습니다. fopen 함수의 주소값이죠.
해당 주소로 이동해보니, 제가 만든 fishhooktest.dylib 에 속해있군요. fake_fopen 함수의 주소입니다.
즉, mach-o 파일이 로드된 후 헤더의 __la_symbol_ptr 테이블에 제가 만든 fake_fopen 함수주소가 fopen 의 함수주소로 리바인딩 된 것입니다.
그러니 앱 내에서 fopen 함수를 호출할때마다 fake_fopen 함수가 대신 호출되는 것이죠.