마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

.so파일에서 심볼을 분리하는 방법이 있나요?

0 추천

APK 내의 so파일에는 불필요한 심볼을 최대한 제거하되, 네이티브 코드에 대한 디버깅은 가능하도록 하고 싶습니다.

NDK 툴로 컴파일된 네이티브 라이브러리의 심볼이 so파일의 dynsym 섹션에 저장되고,

-fvisibility=hidden 옵션을 사용하면 public이 아닌 심볼을 숨길 수 있다는 내용은 찾았는데,

이렇게 하면 앱에서 발생한 미니덤프를 수집해도 정상적으로 볼 방법이 없는 상태이고,

그렇다고 hidden을 사용하지 않으면 APK내의 so파일에 네이티브 라이브러리의 심볼이 노출되어서 해킹에 취약한 상황이 되는 것 같네요.

 

안드로이드에서도 Windows에서의 dll, pdb 파일처럼

so파일을 컴파일된 라이브러리 파일과 심볼파일로 분리해서 사용이 가능한가요?

 

만약 가능하다면, 네이티브 라이브러리에 대한 dynsym도 별도의 심볼파일로 분리가 가능한가요?

uuuSan (160 포인트) 님이 2019년 7월 19일 질문

1개의 답변

+1 추천
 
채택된 답변

보통 NDK폴더의 gcc와 동일한 위치에 있는 strip 를  통해 심볼을 삭제한 so를 앱에 탑재하고, strip전 so를 백업 해 두었다가 디버깅용으로 사용합니다.

strip 사용법은 아래 링크를 참조 해 보세요.

http://forum.falinux.com/zbxe/index.php?document_srl=549671&mid=lecture_tip

익명사용자 님이 2019년 7월 19일 답변
uuuSan님이 2019년 7월 22일 채택됨
답변 너무 감사드립니다.

strip의 --strip-all 기능을 사용하면 so 파일 내의 DRAWF 및 symtab (정적 심볼 테이블) 섹션이 모두 제거되는 것을 확인했습니다.

그런데 Native C++ 라이브러리에 대한 심볼은 dynsym 섹션에 남아있어서 그대로 노출되어있는 상황이었는데, 혹시 이부분을 별도로 처리하는 방법이 있을까요?
-fvisibility=hidden 심볼  제거하더라도 strip 안한 파일을 objectdump를 이용해 오류난 주소를 검색하면 소스 위치 찾으실 수 있으니  -fvisibility=hidden 와 같이 사용하시면 됩니다.
답변해주신대로 테스트 해보겠습니다.
감사합니다!
...