들어가기 앞서
이전 "개발자 모드 검사를 통한 동디버깅 탐지 방안과 우회 기법" 포스팅에 이어서 개발자 모드 옵션 중 하나인 USB 디버깅 허용 여부를 검사하여 동적 디버깅을 탐지하는 방안 및 우회 기법을 다뤄보도록 하겠다.
실습 진행에 사용되는 ANDITER 앱은 아래의 GitHub에서 다운로드 가능하다.
개요
로컬 PC에서 Android 스튜디오, 기타 SDK 도구 등을 사용할 때 도구가 디바이스를 인식하고 연결하기 위해서는 개발자 옵션의 USB 디버깅 옵션이 활성화 되어 있어야 한다. 이는 모바일 애플리케이션 디버그 도구를 사용하는 경우에도 마찬가지로 해당 옵션이 활성화 되어 있어야 디버그 도구에서 디바이스를 인식할 수 있다.
Bypass Debugging Mode 탐지 항목은 개발자 옵션의 USB 디버깅 설정이 활성화 되어 있는지 확인하고 사용 중일 경우 애플리케이션이 디버그 모드로 동작 중인 것으로 판단해 탐지하게 된다. 다만, USB 디버깅의 경우 제조사 펌웨어 수동 업데이트 또는 디바이스 데이터 이동 시에도 사용되기 때문에 실제 애플리케이션에서는 디버그를 탐지할 때 USB 디버깅 옵션 사용 유무만으로 판단하지 않고 추가로 다른 설정들과 함께 참고해 디버그 모드를 탐지하게 된다.
실습 준비
USB 디버깅은 개발자 옵션을 통해서 사용할 수 있으며, 이전 포스팅에서 개발자 옵션을 활성화 시켰다면 [ 설정 > 개발자 옵션 > 디버깅 > USB ] 디버깅에서 설정을 해주면 된다.
분석
[그림 3]의 isCheckUSBDebuggingMode() 함수는 Bypass Debugging Mode 탐지 결과를 반환해주는 역할을 한다. 코드를 보면 [Bypass Develop Mode] 탐지 파트에서 사용되었던 Settings 클래스가 해당 함수에서도 동일하게 사용된 것을 볼 수 있으며 내부 클래스인 Global을 통해 adb_enabled 설정 값을 참조 후 getInt() 함수를 사용해 값을 가져오고 있다. 값이 0이면 USB 디버깅 설정이 비활성화 상태를 뜻하고 1이면 활성화 상태를 뜻한다. 따라서, 값이 1인 경우 디버깅 모드가 동작 중인 것으로 판단해 탐지하게 된다.
Bypass Debugging Mode 탐지를 우회하기 위한 후킹 포인트는 두 가지로 [Bypass Develop Mode] 탐지 파트에서 언급했던 우회 방법과 동일하다. 첫 번째는 함수 결과와 상관없이 무조건 False를 반환하도록 isCheckDevelopMode() 함수를 재 작성하는 방법이고 두 번째는 Settings.Global 클래스 getInt() 함수의 인수로 전달되는 옵션 값을 변조하는 방법이다. 이전 파트에서 두 번째 방법을 사용해 우회 해봤으니 여기서는 첫 번째 방법을 사용해 탐지를 우회해 보도록 하겠다.
우회 실습
[그림 4]는 isCheckUSBDebuggingMode() 함수를 후킹하기 위해 필자가 작성한 Frida 스크립트이다. 코드를 보면 ①에서 isCheckUSBDebuggingMode() 함수 사용을 위해 DebuggerDetector 클래스 객체를 생성했고 ②에서는 함수 호출 시 무조건 false 값을 반환하도록 재 작성했다. 참고로 이와 같이 무조건 특정 값을 반환하도록 코드를 작성하는 경우 사전에 재 작성하려는 함수의 코드에 대한 정밀 분석이 이뤄져야 한다. 만약 해당 함수에서 다른 액티비티를 호출하거나 Context 수정 등의 작업을 하는데 단순 결과 값만 반환 하도록 재 작성 할 경우 원본 함수에서 수행하던 작업 프로세스가 깨지게 되며 오류가 발생해 애플리케이션이 비정상 종료 될 수 있다.
Frida를 통해 작성한 스크립트를 ADITER 애플리케이션에 어태치 하고 Bypass Develop Mode 탐지 항목을 체크하면 Success! 가 출력되며 탐지가 우회된 것을 볼 수 있다.
마무리
지금까지 개발자 모드 옵션 중 하나인 USB 디버깅 허용 여부를 검사하여 동적 디버깅을 탐지하는 방안과 또, 이를 공격자의 관점에서 어떻게 우회할 수 있는지 살펴봤다. 다음 포스팅에서는 디바이스에 USB가 연결 되었는지 검사하여 동적 디버깅을 탐지하는 방안과 우회하는 기법을 다뤄보도록 하겠다.
'안드로이드 탐지 및 우회 > 디버깅 탐지 및 우회' 카테고리의 다른 글
USB 연결 검사를 통한 동적 디버깅 탐지 방안과 우회 기법 (0) | 2023.08.04 |
---|---|
개발자 모드 검사를 통한 동적 디버깅 탐지 방안과 우회 기법 (0) | 2023.08.02 |
동적 디버깅 도구(JEB Decompiler) 탐지 방안과 우회 기법 (0) | 2023.07.28 |
ro.debuggable 값 검사를 통한 동적 디버깅 탐지 방안과 우회 기법 (0) | 2023.07.11 |
TracerPid 검사를 통한 동적 디버깅 탐지 방안과 우회 기법 (1) | 2023.07.10 |