Smali 루팅 우회 - Smali luting uhoe

보통 금융권 앱이나 보수적인 앱 같은 경우 루팅된 기기에서 앱을 실행 시킬 수 없게 한다.

왜냐하면 루팅된 기기에서는 해당 앱의 접근이 가능하기 때문에

1. 앱을 변조해서 유포할 가능성도 있고

2. 메모리에 올라가는 데이터를 분석해서 중요한 정보에 접근할 수도 있고

3. 디컴파일하여 코드도 분석될 수 있고 등...

여러가지로 이슈로 인해 루팅을 탐지하여 막는다. 

실습 앱으로는 A 백화점 앱으로 진행해보겠다.

Smali 루팅 우회 - Smali luting uhoe
루팅 탐지

앱은 실제 모바일 기기에 설치를 하고 실행을 했다.

"변경된 OS('탈옥'등)의 스마트폰은 서비스를 이용할수 없습니다" 라고 알람창이 뜨면서 앱이 종료된다.

먼저 java code를 분석하기 위해 jadx를 사용하여 파일로 뽑아냈다.

편하게 보기 위해서 Sublime Text3를 사용한다.

Smali 루팅 우회 - Smali luting uhoe
AndroidManifest.xml의 MainActivity 부분

AndroidManifest.xml 파일을 보면 메인 액티비티를 찾을 수 있다.

Smali 루팅 우회 - Smali luting uhoe
루팅 탐지 메소드

메인 액티비티에서 "root" 키워드로 검색해봤더니 checkRooting() 메소드를 확인할 수 있었다.

checkRooting() 메소드를 따라가서 분석해보자!

Smali 루팅 우회 - Smali luting uhoe
checkRooting() 메소드

return 값이 둘다 false 여야 루팅 탐지를 우회할 수 있다. 

루팅 탐지 로직은 2가지로 isDeviceRooted()와 checkCheatsInstalled()가 있다.

1. isDeviceRooted()

Smali 루팅 우회 - Smali luting uhoe
isDeviceRooted()

isDeviceRooted()를 분석해보면 또 checkRootMethod1, 2, 4로 루팅을 탐지한다.

셋 중 모두 만족하지 않아야 false를 리턴한다. 

1) checkRootMethod1()

Smali 루팅 우회 - Smali luting uhoe
checkRootMethod1()

Build.TAGS 값이 null이거나 test-keys가 아니여야한다. 

Smali 루팅 우회 - Smali luting uhoe
build.tags 값

adb로 모바일 기기에 쉘로 접속하여 getprop 명령어로 build.tags 값을 확인해보았다.

값은 release-keys로 checkRootMethod1 메소드는 코드 패치를 안해도된다.

2) checkRootMethod2()

Smali 루팅 우회 - Smali luting uhoe
checkRootMethod2()

해당 경로에 파일이 존재하면 true를 리턴한다. 즉 해당 경로에 파일이 없어야한다.

Smali 루팅 우회 - Smali luting uhoe
su 파일 존재

하지만 내 기기는 루팅이 되어있는 폰이라 /system/xbin/ 경로에 su 파일이 존재한다.

코드 패치를 하여 su 파일 말고 testtest123(존재하지 않는 파일)을 검사하게 변조해야겠다.

Smali 루팅 우회 - Smali luting uhoe
smali 코드 패치

apk 파일을 apktool로 디컴파일하면 smali 코드를 볼 수 있는데 여기서 우리가 패치하고 싶은 method를 찾은 후에 값을 변조해주면 된다.

3) checkRootMethod4()

Smali 루팅 우회 - Smali luting uhoe
checkRootMethod4()

su 명령어를 실행해본다. 실행 되면 true, 아니면 false를 리턴한다.

su 명령어 입력시 실행되므로 코드 패치를 통해 testtest444 (존재하지 않는 명령어)라는 명령어를 실행하도록 변조해야겠다.

Smali 루팅 우회 - Smali luting uhoe
smali 코드 패치

2. checkCheatsInstalled()

Smali 루팅 우회 - Smali luting uhoe
checkCheatsInstalled()

getInstalledApplications 메소드를 통해 모바일에 설치된 패키지들을 확인한다.

그 중 CheatLists에 포함된 패키지명이 있으면 true를 리턴한다.

Smali 루팅 우회 - Smali luting uhoe
CheatApplicationLists

내 모바일 기기에는 위와 같은 패키지명들이 설치되있지 않으므로 코드 패치를 진행하지 않아도된다.

3. 리패키징

코드 패치를 진행했으면 smali 파일을 저장한 후 리패키징을 하여 앱을 다시 설치해서 실행해주면 된다.

1) 리패키징

> apktool b [리패키징할 폴더] -o [만들 apk 파일명]

2) 재서명

> java -jar signapk.jar testkey.x509.pem testkey.pk8  [재서명할 apk 파일명] [만들 apk 파일명]

3) 앱 삭제, 재설치 및 실행

> adb uninstall [삭제할 apk 패키지명]
> adb install [설치할 apk 파일명]
Smali 루팅 우회 - Smali luting uhoe
코드 패치한 A 앱 재실행

루팅 탐지 우회 전에는 "변경된 OS('탈옥'등)의 스마트폰은 서비스를 이용할수 없습니다" 이라는
문구가 떴지만 smali 코드 패치 후 루팅 탐지 우회를 하여 "위변조가 의심되는 비정상적인 앱버전입니다."
라고 떴다. 이유는 루팅 우회를 하기위해 smali 코드를 수정했는데 이 때 파일의 hash 값이 변경되어 앱이 이를 탐지한 것이다. 이를 앱 위변조 탐지 또는 앱 무결성 탐지라고 한다.

이 또한 smali 코드를 패치하여 위변조 탐지 우회를 할 수 있다.