objc_msgSend Trace
ObjC 는 메세지 기반의 메서드 호출을 하기 때문에 objc_msgSend 함수를 관찰하면 앱 동작 분석시 초반에 단서를 얻는데 도움이 됩니다.
그러나, frida로 objc_msgSend 함수 후킹하여 로그를 찍어보면 100이면 100 앱이 죽습니다.
굉장히 자주, 빠르게 사용되고 있기 때문에 overhead가 걸려 죽는 것이죠.
그래서 objc_msgSend는 보통 제껴두고, 정적분석을 통해 의심가는 메서드를 하나하나 후킹해서 관찰하곤 합니다.
관련해서 InspectiveC(https://github.com/DavidGoldman/InspectiveC)라는 dylib가 있습니다.
수년전에 작성된 코드이지만 아직도 잘 작동합니다.
우리가 할것은 InpectiveC를 단말기에 설치해주고, "InspCWrapper.m" 을 포함하여 간단한 트윅을 작성해주면 됩니다.
#import "InspCWrapper.m"
%ctor {
enableCompleteLogging();
}
그 후 앱을 실행하면, objc_msgSend 로그가 "/var/mobile/Containers/Data/Application/<앱>/Documents/" 위치에 저장됩니다.
다음은 DVIA-v2 앱에 대한 objc_msgSend Trace 로그입니다.
분석후에는 InspectiveC 프로젝트의 "InspectiveCarm64.mm" 파일의 "preObjc_msgSend" 함수를 수정하면, objc_msgSend의 전달되는 인자값을 바꿀수도 있죠.
예컨데, selector가 "a:b:c:" 일 경우에 전달되는 인자값을 1, 2, 3으로 변경한다든지,
selector가 "fileExistsAtPath:" 일 경우에 전달되는 문자열에 "MobileSubstrate" 가 포함되어 있으면, "test" 문자열로 변경할 수 있겠죠.