MainActivity 찾기
AndroidManifest.xml 파일을 통해 MainActivity를 찾을 수 있다.
해당 파일의 <activity> </activity> 부분을 모두 찾고,
하위 태그인 <intent-filter> 밑에 <category android:name="android.intent.category.LAUNCHER" /> 태그가 존재하면
해당 activity의 android:name이 MainActivity이다.
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