안녕하세요 이번 시간에는 jadx, apktool을 이용해서 제가 만든 앱의 루팅, 무결성 검사를 우회하는 과정을 한번 가져보고자 합니다.
전반적인 흐름은 아래와 같습니다.
제가 만든 앱은 루팅 탐지, 무결성 검사 기능을 가지고 있는 앱입니다. 모바일 해킹을 연습하는 용도로 만들어 봤습니다.
아래와 같은 흐름으로 모바일 앱 분석부터 루팅, 무결성 검사 기능을 우회해보도록 하겠습니다.
- Nox 환경에서 앱을 실행시켜 어떻게 동작하는지 파악
- apktool을 이용한 앱 디버깅
- 앱의 처음 시작 지점 파악
- jadx를 통한 코드 흐름 파악 (루팅)
- smali 분석 및 변조 (루팅 우회)
- 변조된 앱 리패키징 및 Nox 환경에서 실행
1. Nox 환경에서의 앱 실행 및 분석
Step 1) Nox를 켜주고(ROOT켜기를 꼭 체크해 주세요) 앱을 드래그 앤 드롭해줍니다.

Step 2) 설치된 앱을 실행시켜 보고 어떤 반응을 보이는지 확인합니다.

"루팅 위험이 감지되어 앱을 종료합니다."라는 문구가 뜨면서 종료되는 것을 확인할 수 있습니다.
2. apktool을 이용한 디버깅
Step 1) cmd을 켜서 앱이 설치된 경로로 이동해서 다음 명령어를 입력해 줍니다.
- apktool d app-release.apk

Step 2) 앱이 설치된 경로에 폴더가 생겼는지 확인합니다.

3. 앱의 처음 시작 지점 파악하기
Step 1) app-release 폴더를 에디터 프로그램으로 열어(Sublime text, VScode 등) AndroidMainfest.xml파일을 선택합니다.

Step 2) 코드에서 <action android:name="android.intent.action.MAIN"/> 코드를 찾으면 해당 태그를 감싸고 있는 Activity 태그에 SplashActivity라고 있을 것입니다. 바로 이 지점이 앱의 처음 시작 지점의 Activity입니다.

※ Activity란? : 하나의 앱에는 여러 개의 페이지가(화면) 있죠? 그 페이지 하나하나를 Activity라고 생각하시면 됩니다.
※ AndroidMainfest.xml이란? : 안드로이드에 포함된 모든 Activity 목록, 안드로이드 OS 정보, 실행 시 요구 권한에 대한 정보가 있는 파일입니다.
이제 이 지점을 기억해 둡니다 : com.example.myapplication.SplashActivity
4. jadx를 통한 코드 흐름 파악
Step 1) jadx를 켜서 아까 생성된 app-release 폴더를 열어줍니다.

Step 2) AndroidMainfest.xml에서 알아낸 시작 지점을 찾아갑니다. (SplashActivity)
- 소스코드 > com > example.myapplication > SplashActivity

Step 3) 코드를 분석해 봤을 때 이전에 Nox에서 앱을 실행시킬 때 나온 문구가 보였고 이후에는 앱을 종료시키는 함수가(finishAndRemoveTask())실행되는 것을 확인할 수 있습니다.

if문 안에 있는 checkRootingScore라는 함수에 의해서 루팅이 탐지되는 것 같습니다. 해당 코드로 이동해 보겠습니다.
Step 4) checkRootingScore를 분석해 봤을 때 i변수에 점수를 추가하면서 25점 이상의 값을 가지게 되면 루팅으로 판단하도록 동작하는 것을 확인할 수 있습니다.

루팅 탐지를 우회 방안에 대해 2가지가 떠오르네요
- checkRootingScore 함수가 무조건 false를 반환하게 만든다.
- 루트 탐지할 때의 if문 내부 조건이 참이든 거짓이든 무조건 else 쪽으로 가게 만든다.
저는 2번째 방법으로 우회를 진행해 보겠습니다.
5. Smali 분석 및 변조
Step 1) 에디터 프로그램을 열어 다음의 경로로 이동합니다.
- smali > com > example > myapplication > SplashActivity.smali

Step 2) smali코드에서 jadx에서 봤던 if(checkRootingScore()) 부분을 찾습니다.


여기서 if-eqz p1, :cond_0를 해석하면 다음과 같습니다.
- if-eqz p1 : p1이 0과 같다면 (다른 말로는 p1이 false라는 값을 갖는다면)
- , :cond_0 : cond_0로 넘어가서 코드를 실행시켜라
cond_0 코드를 살펴보면 else 부분의 코드와 동일하다는 것을 알 수 있습니다.


Step 3) if-nez p1, :cond_0 코드를 if-eqz p1, :cond_0 코드 아래에 추가해 주고 저장합니다.

if-nez p1, :cond_0는 p1이 0이 아닐때(p1 != false) cond_0으로 넘어가 코드를 실행시키라는 의미입니다.
이렇게 2번째 방법인 if문 내부 조건이 참이든 거짓이든 무조건 else 쪽으로 가게 만드는 방법으로 코드를 수정해 봤습니다.
6. 변조된 앱 리패키징 및 Nox 환경에서 실행
Step 1) cmd를 열고 앱이 깔려있는 경로로 이동한 다음 명령어를 입력해 변조한 코드를 앱으로 빌드합니다.
- apktool b app-release
※ apktool b [디렉터리 이름] : 해당 명령어를 통해서 디렉터리에 있는 모든 자원들을 하나로 합쳐 앱으로 만들 수 있습니다.

Step 2) app-release\dist\app-release.apk 파일이 생성되었는지 확인합니다.

Step 3) cmd를 열고 앱이 깔려있는 경로로 이동한 다음 명령어를 입력하여 서명 키를 하나 생성해 줍니다.
- keytool -genkey -v -keystore Mykey.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

※ 앱을 모바일에 설치하고 사용하기 위해서는 기본적으로 애플리케이션에 서명을 해야 합니다. 이 서명이 없으면 모바일에서 신뢰할 수 없는 앱으로 판단해서 설치 자체가 되지 않습니다. 그래서 서명 키를 하나 만든 것입니다.
Step 4) 서명 키가 생성된 것을 확인하고 다음 명령어를 통해서 변조한 앱에 서명을 합니다.
- apksigner sign --ks Mykey.keystore --ks-key-alias my-key-alias --out signed.apk app-release\dist\app-release.apk

Step 5) signed.apk가 생성되었는지 확인하고 signed.apk를 Nox에 드래그 앤 드롭합니다.

Step 6) 설치된 앱을 실행해 봅니다.


애플리케이션이 이전과는 다르게 루팅 상태여도 정상 실행되는 것을 확인할 수 있었습니다.
분량이 너무 길어질 것 같아서 무결성 검사 우회는 다음 시간에 하도록 하겠습니다.
긴 글 읽어주셔서 감사합니다.
'모바일 해킹' 카테고리의 다른 글
| 모바일 해킹을 위한 환경 구축 -3 (0) | 2026.07.06 |
|---|---|
| 모바일 해킹을 위한 환경 구축 -2 (0) | 2026.07.05 |
| 모바일 해킹을 위한 환경 구축 -1 (0) | 2026.07.03 |