Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android逆向實例筆記—續力破解三個Android程序

Android逆向實例筆記—續力破解三個Android程序

編輯:關於Android編程

這個首先感謝魚C論壇的cbs大神,我是看了他的視頻。自己再動手破解他給出這三個小程序。真心這樣無私把技術分享給大家的人真的不多。再次感謝他。

這裡我就我自己破解的三個小程序自己做做筆記吧,方便自己以後查看,也方便剛剛入門的童鞋。這些都是些沒啥技術含量的東西,大神請飄過。

一、認識新工具

這裡我先給出一個新的工具。jeb。給個我找的。分別有32和64的。https://yunpan.cn/cMuBpvug7qjc2 訪問密碼 da4a

還是照例給個樣圖\

 

二、Crackme03

1.查看原apk

還是拖拽到藍疊裡面看看吧。

\

 

\

 

我們看到錯誤的提示是Bad boy。

那就讓我們開心的打開apkIDE吧

2.反編譯

反編譯之後打開strings.xml。發現,沒有Bad boy。

 



    Android Crackme03 - [by deurus]
    About Crackme03
    This is the third crackme of the Android collection crackmes, in this, the crackme take another phone values and with our name make something. For this reason, the crackme dont run in the emulator, only in the phone. Good luck for all!.
    by deurus [29-10-10] [Made in Basque Country]
    
    Enter Name
    Enter Serial
    --------------------------------------


那我們就只能看看smali裡面的東西了。

 

搜索結果只有一處,還好。

\

雙擊過去,並往上找跳轉。結果發現,這代碼有混淆。沒有辦法了?

這個時候就該我們的jeb上了。

\

點擊File-Open,然後選擇我們的Crackme03。

然後點到Decompiled Java選項卡。雙擊左邊的HelloAndroid。我們驚喜的發現這不是源碼麼?

 

\

 

其實不是哈。只是很類似了。而已。

其實,這裡的話,我們也可以不用jeb哈。直接用apkIDE帶一個東西。

\

點擊打開,選擇打開。也是一樣的

\

 

讓我們來看看代碼。

 

package com.example.helloandroid;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View$OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

public class HelloAndroid extends Activity {
    private View$OnClickListener pulsarBoton;
    private View$OnClickListener pulsarBotonabout;

    public HelloAndroid() {
        super();
        this.pulsarBotonabout = new View$OnClickListener() {
            public void onClick(View v) {
                HelloAndroid.this.setContentView(2130903041);
                Intent v0 = new Intent();
                v0.setClass(HelloAndroid.this, prueba2.class);
                HelloAndroid.this.startActivity(v0);
                HelloAndroid.this.finish();
            }
        };
        this.pulsarBoton = new View$OnClickListener() {
            public void onClick(View v) {
                String v10 = HelloAndroid.this.findViewById(2131034116).getText().toString();
                int v11 = v10.length();
                String v12 = "";
                String v15 = HelloAndroid.this.findViewById(2131034118).getText().toString();
                if(v11 >= 4) {
                    goto label_29;
                }

                try {
                    Toast.makeText(HelloAndroid.this.getApplicationContext(), "Min 4 chars", 1).show
                            ();
                    return;
                label_29:
                    int v5;
                    for(v5 = 0; v5 < v10.length(); ++v5) {
                        v12 = String.valueOf(v12) + v10.charAt(v5);
                    }

                    v12 = String.valueOf(Integer.parseInt(v12.substring(0, 5)) ^ 438294);
                    Object v8 = HelloAndroid.this.getSystemService("phone");
                    String v6 = ((TelephonyManager)v8).getDeviceId();
                    String v16 = ((TelephonyManager)v8).getSimSerialNumber();
                    String v19 = v6.substring(0, 6);
                    if(!String.valueOf(v12) + "-" + String.valueOf(((long)(Integer.parseInt(v19) ^ Integer
                            .parseInt(v16.substring(0, 6))))) + "-" + v19.equals(v15)) {
                        goto label_114;
                    }

                    Toast.makeText(HelloAndroid.this.getApplicationContext(), "God boy", 1).show();
                    return;
                label_114:
                    Toast.makeText(HelloAndroid.this.getApplicationContext(), "Bad boy ", 1).show();
                    return;
                }
                catch(Exception v22) {
                    Toast.makeText(HelloAndroid.this.getApplicationContext(), "Another Error Ocurred :("
                            , 1).show();
                    return;
                }
            }
        };
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(2130903040);
        Object v3 = this.getSystemService("phone");
        String v2 = ((TelephonyManager)v3).getDeviceId();
        new TextView(((Context)this));
        this.findViewById(2131034112).setText("HardwareID 01: " + v2);
        String v5 = ((TelephonyManager)v3).getSimSerialNumber();
        new TextView(((Context)this));
        this.findViewById(2131034113).setText("HardwareID 02: " + v5);
        String v8 = v2.substring(0, 6);
        String v9 = v5.substring(0, 6);
        Integer.parseInt(v8);
        Integer.parseInt(v9);
        new TextView(((Context)this));
        this.findViewById(2131034116).setText("");
        this.findViewById(2131034120).setOnClickListener(this.pulsarBotonabout);
        this.findViewById(2131034119).setOnClickListener(this.pulsarBoton);
    }
}

 

 

我們很容易的發現Bad boy,上面有God boy。猜測就知道這就是正確信息。

\
 

那就讓我們看看這代碼。我們發現上面有個

goto label_114;
就從這個就跳轉到Bad boy。那麼我們就得讓它不跳轉,對吧。大致知道那裡之後回到apkIDE。

 

我們往上找語句塊,發現了 :cond_2

那我們搜索這個。到了這裡就是我們之前看到的那個跳轉。

\

 

OK,我們果斷改為nez,保存,生成。

3.驗證

拖拽到藍疊,打開。不錯,God boy和我們見面

\

這個我們就是KO了。

三、CrackMe-F1F2

1.查看原apk

無需多說,進藍疊

\

 

這不是是寫的EditView,居然不是hint屬性,表示無語。懂的就懂,不懂也不重要。這裡扯遠了,我們繼續。

既然有東西,我就懶得輸了。直接驗證

\

我們知道了錯誤代碼就是Lisence Uncorrect.。

2.反匯編

apkIDE,常規操作。照樣,string.xml沒有信息。

只有smali裡面搜索一波。

\

 

雙擊過去。找找跳轉。

這裡給出代碼

 

.class Lcom/mstar/test/LisenceCheck$1;
.super Ljava/lang/Object;
.source "LisenceCheck.java"

# interfaces
.implements Landroid/view/View$OnClickListener;


# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
    value = Lcom/mstar/test/LisenceCheck;
.end annotation

.annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x0
    name = null
.end annotation


# instance fields
.field final synthetic this$0:Lcom/mstar/test/LisenceCheck;


# direct methods
.method constructor (Lcom/mstar/test/LisenceCheck;)V
    .locals 0

    .prologue
    .line 1
    iput-object p1, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    .line 51
    invoke-direct {p0}, Ljava/lang/Object;->()V

    return-void
.end method


# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 10
    .param p1, "v"    # Landroid/view/View;

    .prologue
    const/4 v9, 0x0

    const-string v8, ""

    .line 53
    check-cast p1, Landroid/widget/Button;

    .end local p1    # "v":Landroid/view/View;
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->mbutton:Landroid/widget/Button;

    if-ne p1, v6, :cond_5

    .line 55
    new-instance v4, Ljava/lang/String;

    const-string v6, ""

    invoke-direct {v4, v8}, Ljava/lang/String;->(Ljava/lang/String;)V

    .line 56
    .local v4, "s1":Ljava/lang/String;
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditun:Landroid/widget/EditText;

    invoke-virtual {v6}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v6

    invoke-interface {v6}, Landroid/text/Editable;->toString()Ljava/lang/String;

    move-result-object v4

    .line 57
    new-instance v5, Ljava/lang/String;

    const-string v6, ""

    invoke-direct {v5, v8}, Ljava/lang/String;->(Ljava/lang/String;)V

    .line 58
    .local v5, "s2":Ljava/lang/String;
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditsn:Landroid/widget/EditText;

    invoke-virtual {v6}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v6

    invoke-interface {v6}, Landroid/text/Editable;->toString()Ljava/lang/String;

    move-result-object v5

    .line 60
    const/4 v1, 0x0

    .local v1, "i":I
    const/4 v2, 0x0

    .line 62
    .local v2, "k1":I
    const/4 v1, 0x0

    :goto_0
    invoke-virtual {v4}, Ljava/lang/String;->length()I

    move-result v6

    if-lt v1, v6, :cond_1

    .line 69
    :cond_0
    xor-int/lit16 v2, v2, 0x5678

    .line 72
    const/4 v3, 0x0

    .line 73
    .local v3, "k2":I
    const/4 v1, 0x0

    :goto_1
    invoke-virtual {v5}, Ljava/lang/String;->length()I

    move-result v6

    if-lt v1, v6, :cond_3

    .line 78
    xor-int/lit16 v3, v3, 0x1234

    .line 80
    if-ne v2, v3, :cond_4

    .line 81
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    invoke-virtual {v6}, Lcom/mstar/test/LisenceCheck;->getApplicationContext()Landroid/content/Context;

    move-result-object v6

    const-string v7, "Lisence Correct\uff01"

    invoke-static {v6, v7, v9}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v6

    invoke-virtual {v6}, Landroid/widget/Toast;->show()V

    .line 92
    .end local v1    # "i":I
    .end local v2    # "k1":I
    .end local v3    # "k2":I
    .end local v4    # "s1":Ljava/lang/String;
    .end local v5    # "s2":Ljava/lang/String;
    :goto_2
    return-void

    .line 64
    .restart local v1    # "i":I
    .restart local v2    # "k1":I
    .restart local v4    # "s1":Ljava/lang/String;
    .restart local v5    # "s2":Ljava/lang/String;
    :cond_1
    invoke-virtual {v4, v1}, Ljava/lang/String;->charAt(I)C

    move-result v0

    .line 65
    .local v0, "ch":C
    const/16 v6, 0x41

    if-lt v0, v6, :cond_0

    .line 66
    const/16 v6, 0x5a

    if-le v0, v6, :cond_2

    const/16 v6, 0x20

    sub-int v6, v0, v6

    int-to-char v0, v6

    .line 67
    :cond_2
    add-int/2addr v2, v0

    .line 62
    add-int/lit8 v1, v1, 0x1

    goto :goto_0

    .line 74
    .end local v0    # "ch":C
    .restart local v3    # "k2":I
    :cond_3
    invoke-virtual {v5, v1}, Ljava/lang/String;->charAt(I)C

    move-result v0

    .line 75
    .restart local v0    # "ch":C
    const/16 v6, 0x30

    sub-int v6, v0, v6

    int-to-char v0, v6

    .line 76
    mul-int/lit8 v6, v3, 0xa

    add-int v3, v6, v0

    .line 73
    add-int/lit8 v1, v1, 0x1

    goto :goto_1

    .line 83
    .end local v0    # "ch":C
    :cond_4
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    invoke-virtual {v6}, Lcom/mstar/test/LisenceCheck;->getApplicationContext()Landroid/content/Context;

    move-result-object v6

    const-string v7, "Lisence Uncorrect\uff01"

    invoke-static {v6, v7, v9}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v6

    invoke-virtual {v6}, Landroid/widget/Toast;->show()V

    goto :goto_2

    .line 88
    .end local v1    # "i":I
    .end local v2    # "k1":I
    .end local v3    # "k2":I
    .end local v4    # "s1":Ljava/lang/String;
    .end local v5    # "s2":Ljava/lang/String;
    :cond_5
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditun:Landroid/widget/EditText;

    const-string v7, ""

    invoke-virtual {v6, v8}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V

    .line 89
    iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck;

    iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditsn:Landroid/widget/EditText;

    const-string v7, ""

    invoke-virtual {v6, v8}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V

    goto :goto_2
.end method

還是一片大亂,還是用jeb

 

 

\

看我框出來的地方。很顯然,如果前面不等於後面這一段,那麼就跳轉到下面去,Toast出來錯誤。

OK,我們回到smali裡面,去找這個跳轉。

其實大膽一點,我們直接可以在錯誤的上面看到:cond_4。然後搜素這個,但是我們還是穩一點,看看類似的源碼,找找思路。

搜索:cond_4,雙擊過去

\

ne就是等於,那我們改成等於就OK了。eq改上。

3.驗證

保存,生成apk。拖藍疊。

\

 

又是我們熟悉又激動的正確Toast。

 

四、EX05_01_

1.原apk

不廢話,上藍疊。看看錯誤提示

\

這裡是直接不用輸什麼,直接來error--

 

2.反編譯

來看看我們的apkIDE怎麼說。

\

 

不用多想。依然那個問題。string沒信息。那我們就搜索error--看看

\

 

只有一處結果就是極好的,雙擊過去找跳轉。

顯然沒有什麼可用信息。還是看看類源碼吧。

 

package irdc.ex05_01;

import android.text.util.Linkify;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.TextView;
import android.widget.Toast;

class EX05_01$1
  implements View.OnKeyListener
{
  EX05_01$1(EX05_01 paramEX05_01) {}
  
  public boolean onKey(View paramView, int paramInt, KeyEvent paramKeyEvent)
  {
    if ("gogo".equals("11"))
    {
      EX05_01.access$0(this.this$0).setText("gogo");
      Toast.makeText(this.this$0, "right++", 1).show();
    }
    for (;;)
    {
      Linkify.addLinks(EX05_01.access$0(this.this$0), 7);
      return false;
      EX05_01.access$0(this.this$0).setText("gogo");
      Toast.makeText(this.this$0, "error--", 1).show();
    }
  }
}

這個很清晰明了。代碼很少,而且可以看到思路的地方。

 

\

 

我們知道,意思就是“gogo”等於“11”才會跳轉到正確的地方。但是怎麼可能“gogo”等於“11”呢。這裡我們就直接修改為不等於就OK了。

回到apkIDE,找到跳轉到錯誤的地方。

\

那麼就直接把eqz改為nez。讓它不等於

\

 

3.驗證

保存,生成,拖藍疊。

 

\

 

打完收工!!!

 

這三個app都不是很難。但是主要的目的就是練練手,然後去理理思路。各位看官,看的開心就給個五星好評。大笑

 

還是最後給出三個apk下載地址吧 https://yunpan.cn/cMu6crr4vXq5t 訪問密碼 21bc

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved