앞서 코드 분석에서 MainActivity 클래스의 chall02 메소드가 클래스 메소드가 아닌 인스턴스 메소드인 것을 확인하였다. 그래서 인스턴스 메소드를 동작 하게끔 하는 API인 Java.choose 메소드를 사용하여 chall02 메소드를 동작시켰다.
1번 문제와 다른 점은 frida-client에서 -f 옵션을 사용하여 Hooking 대상을 지정한 것이 아닌 -p 옵션을 사용하여 미리 실행된 Hooking 대상을 지정하였다. 이렇게 한 이유는 Client 측에서 Frida의 -f 옵션을 사용할 때 Java.choose 메소드가 인스턴스 메소드를 제대로 인식 못 하는 문제점이 발생하였다.
몇 번 테스트를 해보니, -f 옵션을 사용 시 Hooking 대상이 다시 커지고 Hooking Function이 동작하여 인스턴스된 객체를 인식하는 타이밍이 어긋난 것으로 추측된다.
그래서 미리 실행된 Hooking 대상의 PID를 이용하여 frida-clent의 -p 옵션을 이용하여 Hooking를 시도하니 인식이 잘 되었다.
사용된 API
Java.choose(Class Name, Callbacks) 안드로이드 앱 내부의 인스턴스를 다루기 위한 것으로, 힙에서 인스턴스화 된 객체를 찾아 callback으로 넘겨준다. - onMatch : 일치하는 인스턴스를 찾을 경우 호출한다. - onComplete : 일치하는 것을 모두 찾고난 후에 호출한다.