JEB2 App 동적 디버깅
모바일 분석계의 IDA같은 존재 'JEB2'를 이용한 동적 디버깅에 대해 기술 해보려고 한다.
우선 JEB2는 Bytecode(Smali)를 분석하기 편하게 Java로 디컴파일 해주는 기능을 제공한다.
IDA의 Hexray와 같은 기능인데, 덕분에 APK를 동적으로 분석할 때 많은 도움이 된다.
이번 글에서는 Uncrackable1을 디버깅 해보면서 App내부에 저장된 Secret Code를 알아내보도록 하겠다.
JEB2
먼저 분석할 App을 JEB에 로드해주면 위와 같이 App의 Bytecode를 확인할 수 있다.
App의 코드를 확인하고 원하는 분석 지점으로 이동해서 Breakpoint를 설정해줘야 한다.
Breakpoint설정은 Bytecode View에서 원하는 지점을 클릭한 뒤, Ctrl+B로 설정해줄 수 있다.
Breakpoint가 설정되면 주소 옆에 빨간색 토글이 설정된다.
위 [그림 3]에서는 6A지점에 설정해 주었다.
Target App
Target App에서는 AndroidManifest.xml 파일에 android:debuggable="true" 옵션을 추가해줘야 한다.
만약 Target App이 변조 방지 솔루션이 적용되어 있다면, Emulator의 ro.debuggable 옵션을 1로 수정해주면 된다.
debuggable 옵션을 설정한 뒤, am start -D -n PACKAGE/MainActivity 명령어로 App을 디버그 모드로 실행시켜준다.
위 명령어로 App을 실행하면 [그림 6]과 같이 Debugger Attach 대기 상태가 된다.
Debug
다시 JEB로 돌아와서 상단 메뉴바에서 [Debugger - Start]를 클릭하여 Debug Server를 실행시켜준다.
그럼 [그림 8]과 같은 창을 볼 수 있는데, 디바이스와 Target Process를 선택하여 Attach 해주면 된다.
보통 Package명이 같이 보여지는데 위 처럼 안보인다면 Flags에 'D'로 설정된 Process를 선택하면 된다.
D Flag는 AndroidManifest.xml의 debuggable=ture를 뜻한다.
App에 정상적으로 Attach를 하면 MainActivity가 실행되고, 설정한 Breakpoint에 걸리면 [그림 9]처럼 Pause상태가 된다.
Debugger에서는 로컬변수, 쓰레드, 모듈, Object 등 프로그램 리소스 정보를 확인할 수 있다.
[그림 9]의 우측 창이 지역변수 View창이며, 해당 Method에서 사용된 변수를 확인할 수 있다.
Target App은 Uncrackable1으로 Breakpoint가 설정된 부분은 사용자 입력 값과 Secret값을 비교하는 equal( )문이다.
위 로컬변수에서는 v1이 Secret값이 저장된 변수고, v5가 사용자 입력 값이 저장된 변수이다.
근데 v1과 v5의 Value값이 뭔지 모를 정수값으로 표시 되어있다.
이는 JEB가 모든 변수들의 Type을 기본적으로 int로 표시해주기 때문인데, 적절한 Type으로 바꿔주면 해결할 수 있다.
둘 다 String Type이기 때문에 Type을 int에서 string으로 변경해주면 Value값이 문자열로 바뀌게 된다.
v1은 Secret값인 "I want to believe", v5는 입력 값 "py0zz1"로 변수의 저장된 정확한 값을 확인할 수 있다.
Console Commands
그리고 하단의 Console View에서 Command를 입력할 수 있다.
Process의 Thread정보, App에 로드된 Class 목록, Object값 디버깅 등 추가적인 분석이 가능하다.
보다 자세한 내용들은 PNF Software Blog에서 확인할 수 있다.