Android Debug Bridge (adb)
Android SDK에 포함돼있는 프로그램
안드로이드 기기에 패키지 설치하거나 셸에 접근하는 등 디버깅 관련 기능 수행할 수 있는 다목적 명령줄 도구이다.
기기에서 명령어를 실행하거나 애플리케이션 설치 및 디버깅, 파일 업로드 및 다운로드 등 다양한 작업을 손쉽게 수행할 수 있다.
앱 동적 분석에 요구되는 Frida 서버 파일 업로드, 셸 명령어 실행, 패키지 apk 다운로드 등을 수행하기 위해 adb와 pm, am 명령어를 이용하기도 한다.
- pm : Package Manager
- am : Activity Manager
명령어
명령어 설명
adb devices [-l]
- 연결된 기기 목록을 출력함
- -l 옵션을 함께 사용할 시 기기의 상세한 정보를 함께 출력함
adb shell [command]
- 연결된 기기의 셸에 접속할 때 사용
- 셸로 접속하지 않고 명령어를 단일로 실행하고 싶을 때는 adb shell [command] 같은 형태로 사용 가능
- command 부분에 셸 명령어를 입력 시 명령어를 실행함
- 루팅되지 않은 기기의 셸은 권한 문제로 일부 명령어의 실행이 제한될 수 있음
adb push [local][remote]
- 로컬에 존재하는 파일을 기기 내 경로에 업로드할 때 사용
- local에는 파일 경로, remote에는 기기 내 파일 경로를 입력함
- 보통 안드로이드 내의 임시 디렉터리인 /data/local/tmp/에 임의 파일을 업로드할 때 많이 사용됨
adb pull [remote][local]
- puah 명령어와 반대로 기기 내에 존재하는 파일을 로컬로 다운로드 할 때 사용
adb logcat
- 기기의 logcat 내용을 확인할 때 사용
- 앱이 크래시 나거나 의도한 대로 동작하지 않을 때 보통 logcat을 통해 원인을 파악함
adb install [apk]
- 기기에 패키지 이름에 해당하는 앱을 설치할 때 사용
- apk 파일의 경로를 함께 전달하면 자동으로 apk를 기기에 업로드하고 설치함
adb uninstall [package]
- 기기에서 패키지 이름에 해당하는 앱을 삭제할 때 사용함
- 높은 권한의 앱은 삭제되지 않을 수 있음 => Package Manager 이용해야 함
adb forward [local][remote]
- 기기 내에서 포트 포워딩 해서 로컬호스트로 연결할 때 사용
- 보편적으로 frida-server의 포트를 변경해 열거나 앱을 원격으로 디버깅하기 위해 디버깅 포트를 열 때 사용함
Package Manager(pm)
adb 셸 내에서 Package Manager 도구로 명령어를 실행해 기기에 설치된 앱 페이지에 관한 작업 및 쿼리를 실행할 수 있음
명령어
명령어 설명
pm list packages [-f]
- 기기 내에 설치된 패키지 리스트를 모두 조회하는 명령어로 패키지가 올바르게 설치되어 있는지 확인할 때 주로 사용함
- -f 옵션을 함께 사용시 패키지 설치 apk 파일의 경로를 함께 출력함
- pm list packages -f | grep package_name 명령어를 통해 apk 경로 찾고 adb pull apk_path local 명령어로 로컬 호스트로 패키지를 옮길 수 있음
pm install/uninstall [package]
- [package] 인자로 전달한 패키지를 기기 내에 설치하거나, 설치된 패키지를 제거하는 명령어
- 일반적으로 앱을 삭제하거나 설치할 때 adb install/uninstall [package] 명령어를 사용하는데 권한 문제로 앱이 설치/삭제되지 않은 문제가 발생함
- 이 경우 adb root, adb shell 명령어를 통해 루트 권한으로 셀을 접속한 후 pm 명령어를 이용함
Activity Manager (am)
adb 셸 내에서 am 도구로 명령어 실행해 액티비티 시작, 프로세스 강제 종료, 인텐트 브로드캐스트, 기기 화면 속성 수정 등 다양한 시스템 작업 실행할 수 있음
명령어
명령어 설명
am start-activity (options) (intent)
intent 구성
- -a : 액션을 지정합니다.
- -d : 데이터 URI를 지정합니다.
- -n : 컴포넌트 이름을 지정합니다. 컴포넌트 이름은 패키지 이름과 액티비티 이름으로 구성됩니다.\
- -e : 추가 데이터를 지정합니다. 데이터의 자료형에 따라 접미사 (s, i, l, u, …)가 붙을 수 있습니다.
am broadcast (options) (intent)
- (intent)에서 지정한 브로드캐스트 인텐트를 실행함
- 브로드캐스트로 전달할 데이터와 대상 인텐트 설정 가능
am kill [options] package
- package(앱의 패키지 이름)와 관련된 모든 프로세스를 종료
정리
-
Android Debug Bridge (ADB): 안드로이드 기기에 패키지를 설치하거나 셸에 접근하는 등 디버그와 관련된 기능을 수행할 수 있는 툴
-
Package Manager (PM): Package Manager 도구로 명령어를 실행하여 기기에 설치된 앱 패키지에 관한 작업 및 쿼리를 실행
-
Activity Manager (AM): Activity Manager 도구로 명령어를 실행하여 액티비티 시작, 프로세스 강제 종료, 인텐트 브로드캐스트, 기기 화면 속성 수정 등 다양한 시스템 작업을 실행
Rooting
루팅(rooting)은 모바일 기기에서 구동되는 안드로이드 운영 체제의 최상위 권한(root 권한)을 얻음으로써 해당 기기의 생산자 또는 판매자 측에서 걸어 놓은 제약을 해제하는 행위
루팅 된 기기를 사용하면 root 권한이 필요한 앱을 실행할 수 있고 애플리케이션 분석에도 용이하다.
adb를 사용하면 adb root 명령어를 통해 손쉽게 기기를 루팅할 수 있다.
AVD가 아니라 실제 기기를 루팅하면 소프트웨어 업데이트와 A/S를 받을 수 없고 대부분의 금융앱도 사용할 수 없다.