안드로이드 탐지 및 우회

JEB Decompiler를 이용한 안드로이드 동적 디버깅 방법

naroSEC 2023. 7. 12. 10:27

개요

안드로이드 동적 디버깅에 관한 방법을 구글링하면 대부분 IDA Pro를 이용한 방법만을 기술한 포스팅을 볼 수 있다. 다만, IDA Pro를 이용한 동적 디버깅 시 구동 중인 앱 프로세스의 상태 필드인 TracerPid 값이 디버깅하는 IDA Pro의 에이전트 Pid 값으로 변동되어 모바일 애플리케이션 단에서 쉽게 탐지되기 때문에 이 경우 별도의 우회 작업이 필요하다.

하지만, JEB Decompiler 경우 에이전트를 이용한 디버깅 방법을 사용하지 않고 별도의 ART 플러그인을 이용하여 앱을 디버깅 하기 때문에 TracerPid 값이 변동되지 않는다. 그래서 필자도 앱을 동적 디버깅 할 때는 IDA Pro 보다는 JEB Decompiler를 애용하는 편이다.

따라서, 해당 포스팅은 JEB Decompiler를 이용한 동적 디버깅 방법에 관해서 기술하고자 한다.


사전 준비(USB 디버깅)

1. 개발자 옵션 활성화

JEB Decompiler(이하 JEB)에서 앱을 동적 디버깅하기 위해서는 로컬 PC와 디바이스가 USB로 연결되어야 하며, JEB에서 디바이스 인식을 위해 [개발자 옵션 - USB 디버깅] 옵션이 활성화되어 있어야 한다.

다만, 개발자 옵션은 히든 설정으로 별도의 방법을 통해 활성화 시켜줘야 하는데 디바이스 벤더사마다 그 방법이 다르기 때문에 아래의 [표 1]을 참고하면 된다.

[그림 1] 활성화된 개발자 옵션

 

제조사 디바이스 모델 설정
구글 Pixel 설정 > 휴대전화 정보 > 빌드 번호 5번 이상 터치
삼성 Galaxy S8 이상 설정 > 휴대전화 정보 > 소프트웨어 정보 > 빌드 번호 5번 이상 터치
LG G6 이상 설정 > 휴대전화 정보 > 소프트웨어 정보 > 빌드 번호 5번 이상 터치
HTC U11 이상 설정 > 정보 > 소프트웨어 정보 > 더 보기 > 빌드 번호 또는 설정 > 시스템 > 휴대전화 정보 > 소프트웨어 정보 > 더 보기 > 빌드 번호 5번 이상 터치
OnePlus 5T 이상 설정 > 휴대전화 정보 > 빌드 번호 5번 이상 터치

[표 1] 벤더사 별 개발자 옵션 활성화 방법

 

2. 개발자 옵션이 활성화 되었다면 [그림 2]와 같이 개발자 옵션 탭으로 이동한 다음 "USB 디버깅" 옵션을 활성화 시켜 주면 된다.

[그림 2] USB 디버깅 옵션 활성화


사전 준비(앱 디버깅을 위한 선택적 전제 조건)

안드로이드 애플리케이션을 대상으로 동적 디버깅을 하기 위해서는 아래와 같이 두 가지의 선택적 전제조건이 필요하다.

  • 첫 번째는 분석 대상의 앱의 AndroidManifest.xml 파일에 디버그 허용 옵션(debuggable)이 설정되어 있는 경우
  • 두 번째는 모바일 디바이스 자체 내에서 디버그 모드 지원(ro.debuggable) 관련 시스템 설정이 되어 있는 경우

 

1. [ AndroidManifest.xml 파일 수정을 통한 디버그 모드 활성화 ]

먼저 첫 번째 ‘AndroidManifest.xml 파일 디버그 허용 옵션(debuggable)여부에 대해서 살펴보자면 AndroidManifest.xml 파일은 해당 애플리케이션에 대한 서비스, Intent, broadcast receiver 등의 구성요소, 액세스 권한 등의 정보가 포함되어 있고 이 외에도 디버그 모드 허용과 관련된 설정이 존재한다.

[그림 3] AndroidManifest.xml 파일의 디버그 허용 관련 옵션

[그림 3]은 AndroidManifest.xml 파일 내용 중 일부로 애플리케이션 자체에서 디버그 모드 사용을 허용할 경우 application 태그의 debuggable 속성이 true로 설정되어 있어야 한다.

다만, Android Studio를 통해 모바일 애플리케이션을 개발하고 배포할 때는 일반적으로 release 버전으로 배포하기 때문에 "android:debuggable" 속성 값이 "true"로 되어 있는 경우는 드물다. 따라서, 이와 같은 방법을 사용하기 위해서는 별도의 리패키징 과정을 거쳐 AndroidManifest.xml 파일을 수정해줘야 한다.

 

2. [ ro.debuggable 시스템 속성 값 변경을 통한 디버그 모드 활성화 ]

[그림 4] getprop 명령어를 통한 안드로이드 OS 시스템 속성 값 확인

두 번째 모바일 디바이스 자체 내에서 디버그 모드 지원 관련 시스템 설정은 안드로이드 OS의 시스템 속성인 "ro.debuggable" 값을 1로 변경하여 사용하는 경우이다. 해당 속성은 안드로이드 OS가 이미지 부팅 시 참조하는 시스템 속성으로 해당 속성 값이 1로 설정되어 있을 경우 모바일 디바이스 자체 내에서 모든 애플리케이션에 대한 디버그 모드 사용이 지원된다. 그리고 ro.debuggable 값이 1로 설정되어 있다면 AndroidManifest.xml 파일의 "android:debuggable" 속성 값이 "true"가 아니어도 디버그 모드 사용이 가능해진다.

다만, ro.debuggable 시스템 속성은 사용자 임의 변경이 불가능하기 때문에 별도의 방법을 사용하여 변경해줘야 한다. 변경 방법은 아래의 포스팅에서 magisk를 이용한 변경 방법을 참고하면 된다.

 

ANDITER를 활용한 시스템 속성 기반의 루팅 탐지 및 우회 방법

들어가기 앞서 2023.05.31 - [안드로이드] - ANDITER를 활용한 Writeable 기반의 루팅 탐지 및 우회 방법 ANDITER를 활용한 Writeable 기반의 루팅 탐지 및 우회 방법 들어가기 앞서 이전 포스팅에 이어 시스템

naro-security.tistory.com


JEB를 이용한 동적 디버깅

1. JEB에서 앱을 디컴파일한 다음 디버깅이 필요한 위치의 smali 코드에 "crtl+b" 또는 [디버거 탭 - 브레이킹 포인트]를 설정해준다.

[그림 5] 브레이킹 포인트 설정

 

2. 로컬 PC와 디바이스가 USB로 연결된 상태에서 JEB 상단의 디버거 버튼(벌레 모양 아이콘) 또는 [디버거 탭 - 시작] 버튼을 클릭하여 디버깅을 시작한다. 그러면 [그림 6]과 같은 화면이 출력되는데 ②에서 PC와 연결된 디바이스를 선택하고 ③ 디버깅할 대상 앱의 프로세스를 선택해주면 된다.

[그림 6] 동적 디버깅을 시도할 대상 앱 선택

3. 앱에서 브레이킹 포인트가 설정된 코드가 동작할 때 [그림 7]과 같이 디버깅 되며 전달되는 데이터의 흐름을 확인할 수 있다.

[그림 7] 앱이 디버깅 되며 실제 전달되는 데이터를 확인할 수 있다.


마무리

지금까지 JEB Decompiler를 이용한 동적 디버깅 방법과 사전 준비 단계에 관해서 알아봤다. 다음 포스팅에서는 JEB Decompiler와 IDA Pro를 이용한 동적 디버깅 시 차이점에 대해서 다뤄보도록 하겠다.