-
안드로이드 모바일앱 모의해킹 - 2 - ~ADB 설명 및 사용법편~리버싱/모바일 2023. 4. 5. 16:45
ADB(Android Debug Bridge)
- 안드로이드 예뮬레이터나 PC에 연결된 실제 장치들을 제어하기 위한 안드로이드 디버깅 도구
- 명령어를 입력받는 방식으로 사용해서 안드로이드 기기와 통신함
위치는 이곳, 안드로이드 스튜디오 설치할때 같이 깔아놓은 SDK 폴더 밑에 있다.
ADB의 구성요소
1. 클라이언트
- 안드로이드 개발 시스템에서 실행된다, ADB 명령을 입력한 후 쉘에서 클라이언트를 호출함
2. 서버
- 안드로이드 개발 시스템에서의 백그라운드 프로세서, 클라이언트, 에뮬레이터, 데몬과의 통신을 관리함
3. 데몬
- 에뮬레이터나 장치에서 백그라운드 프로세서로 동작하는 인스턴스
뭔 소린진 나도모른다 읽다보면 안다는 마음으로 배우자
ADB의 동작 구조
맨 처음 서버가 동작중인 모든 애뮬레이터, 장치 인스턴스에 대한 연결을 설정하면
포트번호 5555~5585 까지의 수 중에서 홀수 번호의 포트를 스캐닝함
스캐닝하다 ADB 데몬이 발견되면 해당 포트번호에 연결함 연결되면 사용자가 ADB로 명령내리기 가능
ADB 명령어 모음
주의할점 : 에뮬레이터에서 개발자 전용 모드 + usb 디버깅인가 뭔가 하는것들 켜놔야 됩니다
adb devices
- 연결된 안드로이드 장치들을 보여줌
adb shell
- adb 쉘연결함
- usb 장치로 연결했을땐 adb -d / 애뮬레이터는 adb -e 옵션을 추가한다
제대로 연결 되면 리눅스스러운 입력창이 반겨준다
ADB의 디버그 기능
logcat, 로그캣
안드로이드 장치에서 발생하는 로그메시지를 화면으로 출력하거나 파일 형태로 저장하는 기능 제공.
시스템 디버그 출력 정보를 확인하거나 수집할 수 있는 매커니즘을 제공한다.
참고
https://developer.android.com/studio/command-line/logcat?hl=ko
adb logcat 또는 쉘에서 logcat 을 입력해서 실행할 수 있다
실행화면, 뭐가엄~청 길게나온다 안드로이드 장치에서 발생하는 일들에 대한 로그들이 실시간으로 출력된다고 한다
잘보면 로그 앞에 V,D,I,W,E,F,S 등이 있는데 그 뒤에는 어떤 요소(누가)에서 발생했는지 나와있다
V - Verbose (가장 일반적)
D - Debug
I - Info
W - Warning
E - Error
F - Fatal
S - Silent (가장 높은 순위)
로그캣 실행 옵션
1. -b
- 버퍼, 안드로이드 로그 시스템은 다양한 유형의(radio, events, main)로그 버퍼를 가지고있는데
이 옵션을 활용하여 출력되는 로그 내용을 선택적으로 확인할 수 있다
- radio: radio/telephony 관련 메시지
- events: 이벤트와 관련된 메시지
- main: 메인 로그 버퍼(기본값)
2. -c
- 기록된 로그 메시지를 삭제하고 종료함
3. -d
- 로그 메시지를 화면에 표시하고 종료
4. -f 파일명
- 로그 메시지를 지정한 파일이름으로 저장한다
- 주의할점은 파일명에는 경로형식으로 작성해야하며
- '-d' 옵션을 추가 하지않으면 작업 중단 신호가 입력될때까지 로그메시지를 기록함
예: adb logcat -d -f /경로/a.txt -b radio 이런식
4. -g
- 선택된 버퍼의 크기를 출력하고 종료함 기본적으로 main(메인 로그 버퍼)가 선택됨
예: adb logcat -g -b <radio | events | main>
5. -n 개수
- 저장되는 로그파일의 개수를 저장한다(나눠서 저장한다는 뜻)
- '-r' 옵션으로 로그파일의 용량을 설정하고 -f 이름으로 파일이름설정 -n 옵션으로 파일개수 설정 가능
- 파일명 1, 파일명 2, 파일명 3 이런식으로 저장되는데 숫자가 낮을수록 최신 로그를 저장한다
예: adb logcat -n 5 -r 1024 -f 경로/파일명
6. -r 용량
- 로그 메시지를 파일로 저장할때 저장되는 파일의 용량을 설정하기 위해 사용되는 옵션, -f 옵션과 함께 사용(기본16)
예: adb logcat -r 1024 -f /경로/파일명
7. -s
- 기본 필터의 종류를 S(Silent)로 변경함. 모든 우선순위 메시지를 silent로 바꿈
=> 모든 메시지를 출력하지 않도록함
- 이옵션 뒤에 필터(태그)를 입력하면 사용자가 확인하고 싶은 특정 로그 메시지를 확인가능
예: adb logcat -s ActivityManager:I(i임)
이러면 액티비티 매니저 앞에 I가 오는 로그 메시지만 출력하고 나머지는 출력안함
8. -v 포캣
- '-v' 옵션으로 특정 메타데이터 필드를 선택하면 로그메시지를 출력할 수 있다
brief: 로그 메시지의 우선순위/태그와 메시지가 발생한 프로세스의 PID출력
process: 로그 메시지에서 메시지가 발생한 PID 출력
tag: 로그 메시지의 우선순위/태그를 출력
raw: 로그 메시지에서 원본 메시지만을 출력, 다른 메타데이터는 포함안함
time: 로그 메시지의 날짜, 호출, 시간, 우선순위. 태그와 메시지가 발생한 PID 와 스레드의 TID 출력
long: 모든 메타데이터 필드와 메시지를 표기
예: adb logcat -v <위의것들중 하나고름>
필터링으로찾기
예: adb logcat ActivityManager:I art:I *:S
ActivityManager와 art 태그 둘 중 I(Info)나 그 이상의 우선순위를 갖는 항목들을 출력함
뒤의 *:S 구문을 넣으면 모든 메시지가 출력되지 않도록함
bugreport
- dumpsys, dumpstate 및 logcat 명령의 결과를 한 번에 출력한다
Dumpsys
- 현재 연결된 안드로이드 장치의 애플리케이션 및 장치 정보를 자세히 표시함
- 하위 명령에는 meminfo, cpuinfo, account, activity, window, wifi, power 등이 있다
예: adb shell dumpsys meminfo
=> 안드로이드 장치의 메모리 사용 정보를 표시함
Dumpstate
- 현재 연결된 안드로이드 장치의 모든 상태 정보를 출력한다
예: adb shell dumpstate
실행결과, 뭐가 엄청많이 나온다 보고싶으면 파일로 저장해서 보는 방법을 추천
Jdwp를 이용한 프로세스 정보 확인
- 안드로이드 장치에서 사용할 수 있는 jdwp 프로세스의 목록을 출력한다
- jdwp를 이용해 특정 어플리케이션의 프로세스 번호를 알아내고 이를 디버거에 연결하면 디버깅을 수행할 수 있다
실행화면, 녹스에서 기존에 설치해놓은 아무앱을 실행시키고 jdwp 명령어를 실행했더니 해당 어플리케이션의
PID인 4239가 출력된다 가장 밑에 있는 프로세스 번호가 가장 최근에 실행된 에플리케이션의 번호이다
데이터 기능
Install 명령어
- 연결된 장치에 사용자가 원하는 애플레케이션을 설치한다
예: adb install 경로/이름.apk 이런식으로
성공적으로 설치 된 경우 success가 출력된다
- '-r' 옵션을 추가하면 기존에 동일한 애플리케이션이 설치되어있더라도 기존 데이터의 삭제없이 애플리케이션이 재설치된다
Uninstall 명령어
- install 명령이 설치니 uninstall 은 당연히 설치된 애플리케이션을 삭제하는 명령어이다
- 애플리케이션을 삭제할때는 설치할때는 달리 대상 애플리케이션의 패키지명을 입력해야한다
- 설치된 애플리케이션의 패키지 목록은 ADB명령의 PM(Package Manager)명령을 통해 확인할 수 있다
예: adb shell pm list packages -f | grep 어플명
요런식으로 하면된다
Pull/push 명령어
- 연결된 장치나 애플리케이션에서 PC로 파일을 복사하거나 반대로 파일을 장치에 붙여넣을 수 있게해준다
- 파일의 위치는 사용자 임의로 변경할 수 있으며, 권한을 가져야 실행된다
pull: 안드로이드 에뮬레이터에서 -> PC로 파일 복사
push: pc에서 -> 안드로이드 에뮬레이터로
예: adb pull,push "장치의경로/파일" "저장위치" 이런식
포트와 네트워킹 기능
forward 명령어
- 특정 로컬의 포트를 안드로이드 장치의 특정 포트와 소켓 통신이 가능하도록 포워딩하는 기능
예: adb forward tcp:7777 tcp:8888
=> 호스트의 7777포트가 안드로이드 장치의 8888포트에 전달 되도록한다
tcp 외의 다른 항목들도지원
local : <unix domain socket name>
dev : <chracter device name>
jdwp : <pid>
뭔소린진 나도 모름
위의 항목중 jdwp를 사용하면 특정 애플리케이션을 대상으로 디버깅을 위한 설정을 할 수 있음
아까킨 어플(pid:4239)의 디버깅을 위해 forward명령을 이용해 tcp 포트와 연결시켜보겠음
딱히 출력되는 값은 없다
이 상태에서 jdb로 대상 에플리케이션에대한 디버깅을 수행한다고 한다 근데 어캐하는지 몰라서 스킵
스크립팅 기능
get-serialno 명령어
- 연결된 장치의 시리얼번호를 문자열로 출력한다
- adb devices 를 실행했을때 나오는 기기의 이름과 같은것
get-state 명령어
- 연결된 장치의 상태를 문자열로 출력한다
- adb devices를 실행했을때 나오는 상태값과 같음 (오른쪽에거, 예:device)
wait-for-device 명령어
- 연결되는 에뮬레이터, 장치가 구동될 때까지 ADB를 통한 명령 실행을 멈춰놓고 장치가 device 상태가 되면 함께 설정된 명령어를 실행한다
- adb wait-for-device <명령어> 로 구성된다
서버 기능
start-server/kill-server 명령어
- start-server는 ADB 서버 프로세스가 동작하는지의 여부를 확인한 후 결과를 표시한다, 서버가 구동되지 않은 상태라면 서버를 구동시킨다
- kill-server는 ADB를 사용하면서 서버에 문제가 발생했거나 상태가 좋지않은 경우 서버를 종료시키고, 다른 ADB 명령이 입력되면 서버를 다시 시작한다
ADB킬때 보이던 daemon 뭐시기 그거 맞다
쉘 기능
adb shell
- 장치를 원격으로 조종가능하게 해주는 쉘 기능, 우리가 지금까지 하던거 맞다
- adb shell 을 입력한뒤 직접 쉘 명령을 내릴 수 있지만 cmd창에서 adb shell 명령어 이런식으로 사용할 수도 있다
지금까지 adb의 기본적인 사용법들에 대해서 알아봤다 이것들만 봤는데도 머리가 터질거같다
'리버싱 > 모바일' 카테고리의 다른 글
JEB를 이용한 동적 디버깅 (0) 2023.07.03 안드로이드 리버싱 실습 with JEB (0) 2023.06.30 안드로이드 apk 구성 및 리버싱 도구 (0) 2023.06.28 안드로이드 구성요소 (0) 2023.06.26 안드로이드 모바일앱 모의해킹 - 1 - 인시큐어뱅크 설치편 (0) 2023.03.30