티스토리 뷰

C++

[GDB] Hopper Disassembler 앱

POWERUMC 2014. 2. 12. 02:21

필자는 소프트웨어 개발에 필요한 앱은 라이선스를 구매해서 쓴다. 자랑은 아니지만 앱스토어와 그 외 구매한 앱의 개수가 200개가 넘어간다. 히힣; 오늘 소개하는 앱 처럼 제값어치 하는 앱에겐 뭔가 모를 희열을 느낀다. 여성분들이 쇼핑을 좋아하는 것처럼 -0-

Hopper Disassembler

이 앱은 윈도우의 WinDbg, 그리고 GNU gdb처럼 디버거 명령줄(Command Line)에 익숙하지 않은 디버거에게 유용한 앱이다. 몇 달 전, Objective-C with LLVM 어셈블리 코드를 분석하기 위해 구매했다. Objective-C 내부적인 언어적 매커니즘을 이해하기 위해 역어셈블리 분석은 필수이기 때문이다. 그 중 이 앱은 기대한 것 보다 기능은 적지만, 사소한 곳에서 감동을 주는 앱이라 생각된다.

역어셈블리 앱 중 윈도우에선 OllyDbg 가 있다면, 맥에서는 바로 이 Hopper Disassembler 가 있다. OllyDbg는 작지만 기능에 충실한 서민적인 앱이라면, Hopper Disassembler는 비주얼적인 면이 좀 더 부각된 매니아 앱 같다. 기능적인 면에서 Hopper Disassembler가 조금 떨어지긴 하지만, 맥에서 이 정도면 충분히 쓸만하다고 판단된다.

특히 Hopper Disassembler는 윈도우, 맥 그리고 리눅스까지 지원하는 효자 앱이다. 이 세 가지 운영체제 버전을 모두 구입해도 12만원 정도면 된다. 더 고가의 프로페셔널한 상용 버전에 비하면 저렴한 편에 속한다. 필자처럼 맥, 리눅스, 윈도우, 이렇게 여러 운영체제를 사용한다면 Hopper Disassembler는 충분히 매력적이다.

앱 훑어보기

Hopper Disassembler 런타임(runtime) 디버깅을 하려면 전용 디버거 서버 앱을 사용해야 한다. 그러니까 클라이언트-서버 구성으로 Remote(or Pipe) 통신으로 디버깅을 진행하는데 이 인터페이스가 썩 좋지만은 않다.

클라이언트/서버로 구성

아래의 스크린샷 처럼 메인 윈도우, 서버 에이전트, 어셈블리 레지스터 윈도우 이렇게 세 개를 띄어야 한다. 멀티 모니터에서는 장점이 될 수도 있고, 싱글 모니터에서는 단점이 될 수 있다.



비주얼 및 기타

디버거 앱 답지 않게 좀 더 다양한 색상을 사용하였지만, 거부감 없이 알아보기 더 쉽다. Flow Graph와 Pseudo Code도 비교적 깔끔하다. 초기에 사용할 일이 잦지만 Objective-C의 기계어(?) 코드 스타일에 익숙해 지다보면 거의 사용하지 않는 번들 기능 중 하나다. Objective-C with LLVM 구성인 경우 .NET과 Java와 같이 가상머신(virtual machine)에서 동작하지만, 이보다 좀 더 하위 레벨인 LLVM 컴파일 바이너리는 거의 일관적으로 유사성이 있기 때문이다.

검색 기능과 참조된 주소를 분석하는 기능은 기대 이상으로 빠르고 정확하다. 특히 call, je, jne, jmp 그리고 meta data, symbols, 마지막으로 xref 등을 쉽게 찾아가거나 검색할 수 있다. xref의 참조 주소의 원본을 툴팁으로 보여주는 등 예상하지 못한 곳에 꼼꼼한 비주얼을 보여준다.

눈안의 가시, 버그

일부 코드를 디버깅 하다보면 특정 인스트럭션(instructions)에서 Step Over를 Step Into로 동작하는 경우가 발생한다. 이게 은근히 신경을 곤두세우는데 아직까지 별다른 패치나 업데이트가 없고, 앞으로도 없을 것 같다. 필자는 이 버그와 앱의 가격과 협상했지만, 보다 세세한 디버깅을 제어해야 한다면 다른 앱(gdb? -_-)을 사용하는 것이 좋을 것 같다.

댓글