Android

Frida를 이용한 루팅 우회

HW4N 2022. 12. 30. 10:34
반응형

MainActivity 찾기

AndroidManifest.xml 파일을 통해 MainActivity를 찾을 수 있다.

 

해당 파일의 <activity> </activity> 부분을 모두 찾고,

하위 태그인 <intent-filter> 밑에 <category android:name="android.intent.category.LAUNCHER" /> 태그가 존재하면

해당 activity의 android:name이 MainActivity이다.

AndroidManifest.xml 파일

 

 

MainActivity 분석

MainActivity 분석하기 전 앱을 실행시켜 어떠한 동작을 하는지 확인을 해준다.

 

아래 사진과 같이 루팅이 탐지되었다는 메시지 박스와 OK 버튼을 누르면 앱이 종료되는 것을 확인할 수 있다.

루팅 탐지

 

아래의 코드는 MainActivity 코드이다.

package sg.vantagepoint.uncrackable1;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import owasp.mstg.uncrackable1.R;
import sg.vantagepoint.p000a.C0001b;
import sg.vantagepoint.p000a.C0002c;

/* loaded from: classes.dex */
public class MainActivity extends Activity {
    /* renamed from: a */
    private void m2a(String str) {
        AlertDialog create = new AlertDialog.Builder(this).create();
        create.setTitle(str);
        create.setMessage("This is unacceptable. The app is now going to exit.");
        create.setButton(-3, "OK", new DialogInterface.OnClickListener() { // from class: sg.vantagepoint.uncrackable1.MainActivity.1
            @Override // android.content.DialogInterface.OnClickListener
            public void onClick(DialogInterface dialogInterface, int i) {
                System.exit(0);
            }
        });
        create.setCancelable(false);
        create.show();
    }

    @Override // android.app.Activity
    protected void onCreate(Bundle bundle) {
        if (C0002c.m5a() || C0002c.m4b() || C0002c.m3c()) {
            m2a("Root detected!");
        }
        if (C0001b.m6a(getApplicationContext())) {
            m2a("App is debuggable!");
        }
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
    }

    public void verify(View view) {
        String str;
        String obj = ((EditText) findViewById(R.id.edit_text)).getText().toString();
        AlertDialog create = new AlertDialog.Builder(this).create();
        if (C0005a.m1a(obj)) {
            create.setTitle("Success!");
            str = "This is the correct secret.";
        } else {
            create.setTitle("Nope...");
            str = "That's not it. Try again.";
        }
        create.setMessage(str);
        create.setButton(-3, "OK", new DialogInterface.OnClickListener() { // from class: sg.vantagepoint.uncrackable1.MainActivity.2
            @Override // android.content.DialogInterface.OnClickListener
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });
        create.show();
    }
}

 

19, 20 라인을 보면 루팅 탐지할 때 나오는 문구와 버튼이 있고, 그 아래에 종료시키는 함수가 있는 것을 확인할 수 있다.

 

앱을 종료시키는 함수를 후킹 하여 앱이 종료되지 않도록 하겠다.

 

 

 

Frida 코드 작성 및 실행

아래의 코드는 JavaScript를 이용하여 후킹 하는 코드이다.

function hooking() {
    console.log("[*] Start Hooking");
    Java.perform(function() {
        var System = Java.use("java.lang.System");
        
        System.exit.implementation = function() {
            // exit 함수 공백 처리
            console.log("[*] System.exit Hooking Success");
        }
    });
}

setImmediate(function() {
	hooking();
});

 

 

위와 같은 코드 작성 후 실행시켜주면 아래와 같이 후킹이 완료됐다는 메시지가 나오는 것을 확인할 수 있다.

코드 실행

 

 

코드를 실행시키면 아래와 같이 앱이 실행된다.

루팅이 탐지됐다는 문구가 나오지만 exit() 함수를 후킹 하여 동작하지 못하도록 만들었기 때문에 OK 버튼을 눌러도 앱이 종료되지 않는다.

후킹 성공

 

 

앱 다운로드 링크

https://github.com/OWASP/owasp-mastg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk

 

GitHub - OWASP/owasp-mastg: The Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app secur

The Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes the technical processes for verifying the contr...

github.com

 

반응형