2.1. ADB 살펴보기
-
ADB 는 Android Debug Bridge.
안드로이드 에뮬레이터나 PC 에 실제 연결된 장치를 제어하기 위한 안드로이드 디버깅 도구 중 하나이다.
-
ADB 는 클라이언트, 서버, 데몬의 세 요소를 포함하는 클라이언트-서버 프로그램이다.
ADB 클라이언트는 ADB 명령을 입력하는 개발 PC 이다.
ADB 서버는 안드로이드 개발 시스템의 백그라운드 프로세서로, 장치의 ADB 데몬 사이의 통신을 관리한다.
ADB 데몬은 장치의 백그라운드 프로세서로 동작하는 인스턴스다.
-
ADB 클라이언트가 시작되면 가장 먼저 ADB 서버 프로세서가 실행 중인지 점검한다.
실행 상태가 아니면 서버 프로세스를 구동하며, TCP 5037 포트에 바인드 시키고, 모든 클라이언트는 5037 포트를 통해 ADB 서버와 통신한다.
-
서버가 동작 중인 모든 장치 인스턴스에 대한 연결을 설정하면 포트 번호 5555 에서 5585 까지의 범위에서 홀수 번호의 포트를 스캐닝한다.
이 스캐닝을 통해 ADB 데몬이 발견되면 해당 포트 번호에 연결한다.
2.1.1. 디바이스 장치 선택
-
실제 device 와 emulator device 가 붙어있는 경우 -d, -e 로 분기하여 명령어를 전달할 수 있다.
device : adb -d <명령어>
emulator : adb -e <명령어>
-
단말이나 에뮬레이터가 여러개일 경우 -s 옵션과 함께 장치명을 지정해주면 된다.
2.1.2. 일반 기능
2.1.3. 디버그 기능
* 로그켓을 이용한 로그 분석
-
adb logcat [<option>] … [<filter-spec>]
-
-b <buffer>
안드로이드 로그 시스템은 다양한 유형(radio, events, main)의 로그 버퍼를 갖고 있다.
-b 옵션을 사용하여 출력되는 로그 내용을 선택적으로 확인할 수 있으며, 각 버퍼는 다음과 같은 내용을 포함하고 있다.
radio : radio/telephony 관련 메시지
events : 이벤트와 관련된 메시지
main : 메인 로그 버퍼(기본값)
ex)
> adb logcat -b <radio | events | main>
-
-c
기록된 로그 메시지를 삭제하고 종료한다.
-
-d
로그 메시지를 화면에 덤프하고 종료한다.
-
-f <filename>
로그 메시지를 지정한 파일 이름으로 저장한다.
ex)
> adb logact -d -f /sdcard/output.txt -b radio
-
-g
선택된 버퍼의 크기를 출력하고 종료한다.
기본값으로 main 이 선택되어 있다.
ex)
> adb logcat -g -b <radio | events | main>
-
-n <count>
저장되는 로그 파일의 개수를 지정한다.
이 때 -r 옵션을 포함하여 로그 파일 용량을 설정(kb)하고 파일 이름을 -f 옵션으로 설정해야 한다.
-n 옵션을 포함하지 않는 경우에는 기본값으로 4개가 설정되며, 파일 이름은 filename, filename.1, filename.2 와 같이 저장된다.
저장되는 파일은 숫자가 낮을수록 최신 로그를 저장한다.
ex)
> adb logcat -n 5 -r 1024 -f /sdcard/filename
-
-r <kbytes>
로그 메시지를 저장하는 경우, 저장되는 파일의 용량을 설정하기 위해 사용되는 옵션으로, -f 옵션과 함께 사용한다.
기본값으로 16이 설정되어 있다.
-
-s
기본 필터의 종류를 S(Silent)로 변경하도록 설정한다.
이 옵션은 모든 우선순위 메시지를 조용히 시키는 것으로, 모든 메시지를 출력하지 않도록 한다.
그 대신 이 옵션 뒤에 필터(태그:우선순위)를 입력하면 사용자가 확인하고 싶은 특정 로그 메시지를 확인할 수 있다.
ex)
> adb logcat -s ActivityManager:I
-
-v <format>
로그 메시지를 메타데이터 필드와 태그, 우선순위를 갖는다.
-v 옵션으로 특정 메타데이터 필드를 선택하면 로그 메시지를 출력할 수 있다.
메타데이터 항목은 다음과 같다.
brief : 로그 메시지의 우선순위/태그와 메시지가 발생한 프로세스의 PID 를 출력(기본값)
process : 로그 메시지에서 메시지가 발생한 PID 를 출력한다.
tag : 로그 메시지의 우선순위/태그를 출력한다.
raw : 원본 메시지만을 출력한다. 다른 메타데이터는 포함되지 않는다.
time : 날짜, 호출시간, 우선순위/태그와 메시지가 발생한 PID 를 출력한다.
threadtime : 날짜, 호출시간, 우선순위, 태그와 메시지가 발생한 PID, TID 를 출력한다.
long : 모든 메타데이터 필드와 메시지를 표시해준다. 이 옵션은 각 메시지당 한 줄씩 공백을 만들어주어 가독성이 좋다.
ex)
> adb logcat -v <brief | process | tag | raw | time | threadtime | long>
-
filter expressions(필터링 구문)의 형식은 tag:priority 로 구성되어 있다.
아래 명령은 ActivityManager 와 art 태그 중 I(info)나 그 이상의 우선순위를 갖는 항목을 출력한다.
> adb logcat ActivityManager:I art:I *:S
* bugreport 를 이용한 버그 보고서 확인
-
bugreport 명령은 dumpsys, dumpstate 및 logcat 명령의 결과를 한번에 출력한다.
bugreport 를 통해 출력되는 내용은 별도의 명령을 통해 출력할 수 있다.
(돼왕 : 결과가 zip 파일로 떨어진다.)
> adb bugreport
-
dumpsys
앱 및 장치 정보를 자세히 표시한다.
하위 명령에는 meminfo, cpuinfo, account, activity, window, wifi, power 등이 있다.
ex)
> adb shell dumpsys meminfo
-
dumpstate
모든 상태 정보를 출력한다.
( 돼왕 : 작동하지 않는 단말들이 있으며, android 10 이상에서는 공식 지원하지 않는다. bugreport 를 쓰란다. )
ex)
> adb shell dumpstate
* Jdwp 를 이용한 프로세스 정보 확인
-
jdwp 명령은 jdwp 프로세스의 목록을 출력한다.
jdwp 는 Java Debug Wire Protocol 로 자바 앱의 디버깅에 사용한다.
jdwp 를 이용해 특정 앱의 프로세스 번호를 알아내고, 이를 디버거에 연결하면 디버깅을 수행할 수 있다.
-
> adb jwdp
이를 수행하면 프로세스 번호들이 출력된다.
이를 이용하는 방법은 forward 명령부분에서 설명될 것이다.
2.1.4. 데이터 기능
* install 명령어
* uninstall 명령어
-
> adb shell pm list packages -f
pm list packages 는 package 목록을 보여주며 다음 option 들이 있다.
-f : 관련된 파일정보도 보여준다.
-d : disabled package 만 보여준다.
-e : enabled package 만 보여준다.
-s : system package 만 보여준다.
-3 : 3rd party package 만 보여준다.
-u : uninstalled package 도 보여준다.
-
앱을 삭제할 때 -k 옵션을 추가하면 해당 앱 데이터는 삭제도지 않고, 앱만 삭제된다.
* pull/push 명령어
2.1.5. 포트와 네트워킹 기능
* Forward 명령어
-
forward 명령은 특정 로컬 포트를 안드로이드 장치의 특정 포트와 소켓 통신이 가능하도록 포워딩해주는 기능을 제공한다.
이 명령을 사용하기 위해서는 대상 장치에서 USB 디버깅 옵션이 활성화되어야 한다.
-
아래의 명령어는 호스트의 7777 포트가 안드로이드 장치의 8888로 전달되도록 한다.
> adb forward tcp:7777 tcp:8888
호스트의 7888 과 PID 1824 인 앱과 연결하려면
> adb forward tcp:7888 jdwp:1824
-
forward 에 설정할 수 있는 항목은..
tcp:<portnum>
local:<UNIX domain socket name>
dev:<character device name>
jdwp:<pid>
-
디버깅 연결은 다음과 같이 한다.
> jdb -sourcepath .\src -connect com.sunjdi.SocketAttach:hostname=localhost.port=7888
2.1.6. 스크립팅 기능
-
스크립트 범주는 사용자에 의해 제작되는 스크립트에 연결된 장치 시리얼 번호나 기기 정보와 같은 특정한 정보 등을 출력하는 데 사용할 수 있다.
이에 해당하는 명령어는 get-serialno, get-state, wait-for-device 를 들 수 있다.
* get-serialno 명령어
-
연결된 장치의 시리얼 번호를 문자열로 출력한다.
이 결과는 adb devices 명령을 수행했을 때 출력되는 연결된 장치의 이름이다.
> adb get-serialno
* get-state 명령어
-
연결된 장치의 상태를 문자열로 출력한다.
adb devices 명령을 수행했을 때 출력되는 장치 상태와 같다.
> adb get-state
* wait-for-device 명령어
-
연결되는 에뮬레이터나 장치가 구동될 때까지 adb 를 통한 명령 실행을 멈춰 놓고 장치가 device 상태가 되면 명령과 함께 설정된 명령어를 실행한다.
syntax)
adb wait-for-device <명렁어>
ex)
> adb wait-for-device shell getprop
2.1.7. 서버 기능
-
서버 범주에 속하는 명령은 현재 adb 서버의 상태를 확인하고 adb 와의 통신에 문제가 발생하면 서버를 재시작하는 등과 같은 역할을 수행한다.
해당 명령으로는 start-server, kill-server 등이 있다.
2.1.8. 쉘 기능
-
shell 명령은 연결된 장치의 원격 쉘을 사용할 수 있도록 하는 기능을 제공한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
#3 취약점 항목별 상세 실습 part 1. - 안드로이드 모바일 앱 모의해킹 (0) | 2020.11.20 |
---|---|
#2 취약점 진단 및 분석 도구 part 2. - 안드로이드 모바일 앱 모의해킹 (0) | 2020.11.19 |
#1 안드로이드 취약점 분석 및 환경 소개 - 안드로이드 모바일 앱 모의해킹 (0) | 2020.11.17 |
[android] AsyncLayoutInflater tutorial (0) | 2020.08.22 |
[android] WorkManager 를 사용해보자 (0) | 2020.08.21 |
댓글