우선 디컴파일 해서 얻을 수 있는 java 코드는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package com.namdaehyeon.findkey2; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; @SuppressLint({"SimpleDateFormat"}) public class MainActivity extends Activity { TextView aView; public int Volume() { return 33; } public String keyString() { return Security.DecryptStr("-1c776f3a2fa678cae27879e87a74553c61009eefb037bbe2abdbd5e4314407e60000000000000000"); } public String makeDate() { Date localDate = new Date(); return new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(localDate); } protected void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); setContentView(2130903040); this.aView = ((TextView)findViewById(2131230720)); if ((makeDate() == "2013-11-02-12:35:03") && (Volume() == 53)) { this.aView.setText(keyString()); } } public boolean onCreateOptionsMenu(Menu paramMenu) { getMenuInflater().inflate(2131165184, paramMenu); return true; } } | cs |
makeDate()의 리턴값이 "2013-11-02-12:35:03"이고 Volume()의 리턴값이 53일 때 키값을 뿌려주는 구조이다.
키값은 암호화 되어 있는데 복호화 하는 함수가 코드엔진 SmartApp 01과 같다!
가장 먼저 들었던 생각은 이 문제에서 쓰이는 저 암호화된 키값을 코드엔진 SmartApp 01의 코드에 삽입하는 것이였다.
근데 if문도 짧아서 그냥 if문을 우회하기로 했다.
봐야할 smali 코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | .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-ne v0, v1, :cond_0 .line 30 invoke-virtual {p0}, Lcom/namdaehyeon/findkey2/MainActivity;->Volume()I move-result v0 const/16 v1, 0x35 if-ne 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 | cs |
smali 코드는 처음 보는데 윗 부분이 딱 if문처럼 생겼다.
if-ne v0, v1, :cond_0
을 보니 jne cond_0처럼 생기지 않았는가 ㅋㅋ
그래서 나는 :cond_0의 위치(위 코드 상으로 29번째 줄)를 .line 31 바로 아래로 옮겨주였다.
그 밖에 여러 가지 방법이 있다.
if-ne를 if-eq로 바꾼다거나 비교하는 변수의 값을 상수로 넣어준다거나.
어쨋든 많은 방법이 있는데 if문을 위회하고 앱에 서명을 넣어주고 실행하여 설치하면 키값을 얻을 수 있다.
댓글