Zettelkasten

nm과 strings로 바이너리의 심볼과 내부 문자열을 확인할 수 있다

·수정 2026.04.27·수정 1

요약

  • nm -gU로 네이티브 라이브러리(.dylib/.so)의 export된 함수 목록을 확인할 수 있다
  • strings로 바이너리 내부에 하드코딩된 문자열(로그 메시지, 에러 문자열, 함수명 등)을 추출할 수 있다
  • 소스코드 없이도 라이브러리의 기능, 내부 구조, 사용하는 코덱/알고리즘을 추론할 수 있다

본문

nm — 심볼 테이블 조회

nm -gU libAgoraRtcKit.dylib | grep -i "audio_encoded"
플래그 의미
-g global (외부 공개) 심볼만
-U undefined 제외 (이 라이브러리가 직접 구현한 것만)

출력 예시:

000000000066e4f8 T _agora_audio_encoded_frame_rev_observer_create
000000000066e598 T _agora_audio_encoded_frame_rev_observer_destroy
  • T = text section (코드, 즉 함수)
  • S = data section (변수, 클래스 등)

볼 수 있는 것: 함수 이름, 주소 못 보는 것: 파라미터 타입, 리턴 타입, 내부 로직 (컴파일 시 소실)

strings — 내부 문자열 추출

strings libAgoraRtcKit.dylib | grep -i "opus"

출력 예시:

AgoraRtcOpus_DecoderCreate(&inst_, config_.sample_rate, config_.num_channels)
AgoraRtcOpus_DecoderInit(inst_)
AudioPktConverter::Initialize
AudioPktConverter::InputPcmFrame

로그/에러 메시지에서 내부 클래스명, 함수 호출 패턴, assert 조건을 역추론할 수 있다. 이 경우 SDK 내부에 Opus 디코더와 AudioPktConverter 파이프라인이 있음을 확인했다.

추가 도구

도구 용도
otool -L 링크된 다른 라이브러리 목록 (macOS)
ldd 링크된 라이브러리 (Linux)
Ghidra 기계어 → 의사 C 코드 디컴파일 (무료)
frida-trace 런타임 함수 호출 추적 (SIP 비활성화 필요할 수 있음)

실제 활용

  1. nm으로 agora_audio_encoded_frame_rev_observer_create 심볼 존재 확인 → ctypes 바인딩 가능 판단
  2. stringsAgoraRtcOpus_DecoderCreate 확인 → SDK에 Opus 디코더가 내장되어 있음 확인
  3. stringsAudioPktConverter::InputPcmFrame 확인 → encoded frame 경로에서도 PCM 변환이 일어남을 추론

참고

Python ctypes로 C 네이티브 라이브러리의 미구현 함수를 바인딩할 수 있다