반응형

 

SmartApp L03.apk
0.92MB
3.apk
0.93MB

 

 

반디집, jdk(version 8), apktool, jadx-gui이 설치되어 있어야 하며, 진행은 모두 Windows에서 진행했다.

 

jdk가 설치되지 않으면 후에 서명 key를 만들고 apk 파일에 서명할 때 사용하는 keytool과 jarsigner 툴들을 사용할 수 없다.

 


분석

 

 

apk 파일을 nox player에 Drag & Drop 하니 위와 같이 어플 설치 실패라고 뜬다.

 

 

반디집으로 SmartApp L03.apk 파일을 열어보니 위와 같이 MobileApp Analysis L02에서처럼 서명 파일이 들어있는 META-INF 폴더가 없다.

 

apktool d '.\SmartApp L03.apk'

 

위와 같이 apktool로 디컴파일을 해준 뒤

 

apktool b '.\SmartApp L03' -o 3.apk

 

그리고 위의 명령어를 입력해 새로운 이름의 apk 파일로 리패키징 해준다.

 

keytool -genkey -v -keystore key.keystore -alias key -keyalg RSA -keysize 2048

 

그리고 위의 명령어를 입력해 서명 키를 생성하는데, 비밀번호를 입력하고 Enter 키를 누른 뒤 yes를 입력한다.

 

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore key.keystore .\3.apk key

 

위의 명령어를 입력해 리패키징 한 3.apk 파일에 서명키를 이용해 서명한다.

 

 

그리고 나서 3.apk를 nox player에서 실행하면 위와 같이 나오는데 김태희 사진을 클릭해봐도 어떠한 동작이 없다.

 

 

3.apk 파일을 jadx-gui에서 열고 AndroidManifest.xml 파일을 열면 위와 같이 나온다.

 

LAUNCHER 카테고리가 포함된 것을 보면 MainActivity이기 때문에 MainActivity 문자열을 더블 클릭해 이동한다.

 

package com.namdaehyeon.findkey3;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

/* loaded from: classes.dex */
public class MainActivity extends Activity {
    TextView aView;
    TextView bView;
    ImageButton button;
    TextView cView;

    @Override // android.app.Activity
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addListenerOnButton();
    }

    @Override // android.app.Activity
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public int randomRange(int a1) {
        int random = ((int) (Math.random() * 10000.0d)) * (a1 << 2);
        return random;
    }

    public String myString() {
        return "c0de3ngn.com";
    }

    public void addListenerOnButton() {
        this.button = (ImageButton) findViewById(R.id.imageButton1);
        this.aView = (TextView) findViewById(R.id.textView4);
        this.bView = (TextView) findViewById(R.id.textView5);
        this.cView = (TextView) findViewById(R.id.textView6);
        this.aView.setText(String.format("%d", Integer.valueOf(randomRange(44444))));
        this.bView.setText("0");
        this.cView.setText(myString());
        this.button.setOnClickListener(new View.OnClickListener() { // from class: com.namdaehyeon.findkey3.MainActivity.1
            Integer myStairs;
            Integer stairs;

            {
                this.stairs = Integer.valueOf(Integer.parseInt(new StringBuilder().append((Object) MainActivity.this.aView.getText()).toString()));
                this.myStairs = Integer.valueOf(Integer.parseInt(new StringBuilder().append((Object) MainActivity.this.bView.getText()).toString()));
            }

            @Override // android.view.View.OnClickListener
            public void onClick(View arg0) {
                if (this.stairs.intValue() - 1 != this.myStairs.intValue()) {
                    this.myStairs = Integer.valueOf(this.myStairs.intValue() + 1);
                    MainActivity.this.bView.setText(this.myStairs.toString());
                    return;
                }
                MainActivity.this.aView.setText(Security.DecryptStr("2736f6055dbad2d42f6d5b0135395cb29e0d086b67e1fa266a0a0d277f151e5b00000000000000000000"));
                MainActivity.this.bView.setText("0");
            }
        });
    }
}

 

MainActivity의 코드는 위와 같다.

 

onClick() 부분을 보면 if문에서 (stairs의 값 - 1) 값과 myStairs의 값이 같지 않으면 myStairs 값에 1을 더하고 화면에 출력한 뒤 return 한다.

 

그리고 stairs - 1한 값과 myStairs의 값이 같으면 if문의 구문들이 실행되지 않고 Key 값을 출력하게 된다.

 

그런데 김태희 사진에 대한 내용이 없다.

 

 

리소스 -> res -> layout -> activity_main.xml 파일을 열면 위와 같이 나오는데

 

ImageView 부분이 김태희 사진을 띄우는 부분으로 추정된다.

 

TextView 부분들에 "어서와~ 이렇게 많은 계단은 처음이지?"와 "남은 계단", "현재 위치" 문자열이 있는 것으로 보아 

 

김태희 사진이 뒤에 있는 문자열들을 가리고 있는 것 같다.

 


풀이

 

 

먼저, 위와 같이 3.apk 파일을 디컴파일 해준 뒤

 

 

vs code에서 3 폴더를 연다.

 

smali -> com -> namdaehyeon -> findkey3 -> MainActivity$1.smali 파일을 연다.

 

122번 줄의 if 문을 보면 위와 같이 v0과 v1의 값이 같으면 cond_0 부분으로 goto 하여 Key 값을 출력하는 것인데

 

 

위와 같이 122번 라인의 if-eq 문을 if-ne로 수정하고 저장함으로써 v0과 v1이 같지 않을 때 cond_0 부분으로 goto 하여 key 값을 출력하도록 한다.

 

 

res -> layout -> activity_main.xml 파일을 열면 위와 같은데 <ImageView> 부분만 위와 같이 주석 처리해주고 저장한다.

 

apktool b .\3 -o 3.apk

 

powershell에서 위의 명령어를 입력해 수정한 내용들을 리패키징 해준다.

 

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore key.keystore .\3.apk key

 

위의 명령어를 입력해 이전에 만들었던 서명 키를 이용해 3.apk 파일에 서명한다.

(keytool 유틸리티를 이용해 서명 키를 생성하는 것은 위의 분석 부분의 내용을 참고한다.)

 

 

Nox Player에 수정된 내용이 적용된 3.apk 파일을 설치 후 실행했더니 위와 같이 Key 값은 나오지 않고, 남은 계단 수도 표시되지 않는다.

 

원래는 오른쪽 하단에 있는 항복 깃발을 든 하얀 사람이 그려진 버튼을 누르면 key 값이 나와야 한다.

 

 

현재 실행 중인 Android 버전은 7 버전의 32bit인데 32bit, 64bit 모두 앱이 제대로 실행되지 않아

 

Nox 매니저 창에서 앱 플레이어 추가 버튼을 눌러 기초 버전인 Android 5 버전을 선택해 생성한다.

 

 

Android 5 버전에서 3.apk 파일을 설치 후 실행하니 남은 계단 수가 잘 보인다.

 

 

오른쪽 하단에 있는 버튼을 누르니 위와 같이 키는 "CodeEngn_4_Ever" 이라고 뜬다.

 

 

반응형

+ Recent posts