반응형

 

02.7z
0.21MB
02.apk
0.21MB

 

 

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

 

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

 


분석 및 풀이

 

 

다운로드 한 압축 파일을 압축 해제한 후 apk 파일을 nox player에 Drag & Drop 하면 위와 같이 어플 설치 실패라고 뜬다.

 

그렇다면 현재 apk 파일은 정상이 아닌 apk 파일이라는 것이다.

 

 

반디집으로 apk 파일을 열어보면 위와 같다.

 

서명이 된 apk 파일에는 META-INF 폴더가 있는데, 위의 사진을 참고하면 현재 apk 파일에는 META-INF 폴더가 없으니 서명이 되지 않았다는 것이다.

 

apktool d '.\SmartApp L02.apk'

 

먼저, apktool로 apk 파일을 디컴파일 해준 뒤

 

apktool b '.\SmartApp L02' -o 02.apk

 

새로운 이름을 가진 apk 파일로 리패키징한다.

 

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

 

그리고 위의 명령어를 powershell에 입력해 서명 키를 생성한다.

 

비밀번호를 입력하고, Enter를 쭉 누른 다음 yes를 입력하여 생성하면 된다.

 

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

 

그리고 위의 명령어를 입력해 02.apk 파일에 서명을 한다.

 

 

그러면 위와 같이 서명이 된 02.apk 파일이 생성되는데

 

 

위와 같이 nox player에 Drag & Drop 하면 FindKey2가 설치된다.

 

 

FindKey2 앱을 실행하면 위와 같이 뜬다.

 

키가 나오지 않았으니 소스 코드를 보도록 한다.

 

 

jadx-gui에서 02.apk 파일을 열어 리소스 -> AndroidManifest.xml 파일을 보면 위와 같이 나온다.

 

위의 사진을 참고하면 LAUNCHER 카테고리가 포함된 부분이 MainActivity라고 하니 MainActivity 문자열을 더블 클릭하여 이동한다.

 

package com.namdaehyeon.findkey2;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Date;

@SuppressLint({"SimpleDateFormat"})
/* loaded from: classes.dex */
public class MainActivity extends Activity {
    TextView aView;

    @Override // android.app.Activity
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.aView = (TextView) findViewById(R.id.textView1);
        if (makeDate() == "2013-11-02-12:35:03" && Volume() == 53) {
            this.aView.setText(keyString());
        }
    }

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

    public int Volume() {
        return 33;
    }

    public String makeDate() {
        Date date = new Date();
        String tmpFormat = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(date);
        return tmpFormat;
    }

    public String keyString() {
        String plainKey = Security.DecryptStr("-1c776f3a2fa678cae27879e87a74553c61009eefb037bbe2abdbd5e4314407e60000000000000000");
        return plainKey;
    }
}

 

그럼 위와 같이 소스 코드가 보이는데

 

makeDate() 함수의 결과가 2013-11-02-12:35:03이고, Volume() 함수의 결과가 53이면 keyString() 함수를 호출한다.

 

그리고 keyString() 함수는 key 값을 반환하는 함수이다.

 

그렇다면 makeDate() 함수의 결과가 2013-11-02-12:35:03이고, Volume() 함수의 결과가 53이도록 해야 하는데

 

현재는 2022년이다.

 

그러므로 조건이 성립되지 않으니 소스 코드를 수정해야 한다.

 

 

위의 apktool을 이용한 디컴파일 부분의 명령을 참고하여 02.apk 파일을 디컴파일하면 02 폴더가 생성된다.

 

해당 02 폴더를 visual studio code로 열어 smali -> com\namdaehyeon\findkey2 -> MainActivity.smali 파일을 열면 위와 같이 나온다.

 

jadx-gui에 02.apk 파일을 열어 JAVA 코드로 디컴파일 된 내용과 비교하면서 보면 위와 같이 smali 코드에서 OnCreate() 부분이 있다.

 

이 중 114번 라인과 123번 라인에서 v1 변수에 어떠한 값을 넣고 비교하여 같지 않으면 cond_0으로 goto 한다는 구문이 있다.

 

각각 라인에서 v1에 들어가는 값은 2013-11-02-12:35:03와 53을 16진수로 표현한 0x35이다.

 

그렇다면 if-ne 문을 if-eq로 바꾸어 해당 값들이랑 같으면 cond_0으로 goto 하고 같지 않으면 key 값을 출력하도록 수정한다.

 

.class public Lcom/namdaehyeon/findkey2/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"


# annotations
.annotation build Landroid/annotation/SuppressLint;
    value = {
        "SimpleDateFormat"
    }
.end annotation


# instance fields
.field aView:Landroid/widget/TextView;


# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 17
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method


# virtual methods
.method public Volume()I
    .locals 1

    .prologue
    .line 44
    const/16 v0, 0x21

    return v0
.end method

.method public keyString()Ljava/lang/String;
    .locals 2

    .prologue
    .line 54
    const-string v1, "-1c776f3a2fa678cae27879e87a74553c61009eefb037bbe2abdbd5e4314407e60000000000000000"

    invoke-static {v1}, Lcom/namdaehyeon/findkey2/Security;->DecryptStr(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v0

    .line 57
    .local v0, "plainKey":Ljava/lang/String;
    return-object v0
.end method

.method public makeDate()Ljava/lang/String;
    .locals 4

    .prologue
    .line 48
    new-instance v0, Ljava/util/Date;

    invoke-direct {v0}, Ljava/util/Date;-><init>()V

    .line 49
    .local v0, "date":Ljava/util/Date;
    new-instance v2, Ljava/text/SimpleDateFormat;

    const-string v3, "yyyy-MM-dd-hh:mm:ss"

    invoke-direct {v2, v3}, Ljava/text/SimpleDateFormat;-><init>(Ljava/lang/String;)V

    invoke-virtual {v2, v0}, Ljava/text/SimpleDateFormat;->format(Ljava/util/Date;)Ljava/lang/String;

    move-result-object v1

    .line 50
    .local v1, "tmpFormat":Ljava/lang/String;
    return-object v1
.end method

.method protected onCreate(Landroid/os/Bundle;)V
    .locals 2
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue
    .line 21
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 22
    const/high16 v0, 0x7f030000

    invoke-virtual {p0, v0}, Lcom/namdaehyeon/findkey2/MainActivity;->setContentView(I)V

    .line 24
    const/high16 v0, 0x7f080000

    invoke-virtual {p0, v0}, Lcom/namdaehyeon/findkey2/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/TextView;

    iput-object v0, p0, Lcom/namdaehyeon/findkey2/MainActivity;->aView:Landroid/widget/TextView;

    .line 29
    invoke-virtual {p0}, Lcom/namdaehyeon/findkey2/MainActivity;->makeDate()Ljava/lang/String;

    move-result-object v0

    const-string v1, "2013-11-02-12:35:03"

    if-eq v0, v1, :cond_0

    .line 30
    invoke-virtual {p0}, Lcom/namdaehyeon/findkey2/MainActivity;->Volume()I

    move-result v0

    const/16 v1, 0x35

    if-eq v0, v1, :cond_0

    .line 31
    iget-object v0, p0, Lcom/namdaehyeon/findkey2/MainActivity;->aView:Landroid/widget/TextView;

    invoke-virtual {p0}, Lcom/namdaehyeon/findkey2/MainActivity;->keyString()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 34
    :cond_0
    return-void
.end method

.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
    .locals 2
    .param p1, "menu"    # Landroid/view/Menu;

    .prologue
    .line 39
    invoke-virtual {p0}, Lcom/namdaehyeon/findkey2/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;

    move-result-object v0

    const/high16 v1, 0x7f070000

    invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V

    .line 41
    const/4 v0, 0x1

    return v0
.end method

 

위와 같이 수정하고 저장한다.

 

apktool b ./02 -o 02.apk

 

그리고 위의 명령어를 입력해 리패키징하고 

 

 

이전에 만들었던 서명 키를 이용해 02.apk 파일에 서명을 한다.

 

 

그리고 나서 02.apk 파일을 nox player에 재설치 후 앱을 실행하면 위와 같이 key 값은 November Rain이라고 나온다.

 


smali 문법 : https://strongslaves.tistory.com/29

반응형

+ Recent posts