ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 모바일앱 모의해킹 - 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의 기본적인 사용법들에 대해서 알아봤다 이것들만 봤는데도 머리가 터질거같다

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.