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 비활성화 필요할 수 있음) |
실제 활용
nm으로agora_audio_encoded_frame_rev_observer_create심볼 존재 확인 → ctypes 바인딩 가능 판단strings로AgoraRtcOpus_DecoderCreate확인 → SDK에 Opus 디코더가 내장되어 있음 확인strings로AudioPktConverter::InputPcmFrame확인 → encoded frame 경로에서도 PCM 변환이 일어남을 추론