Flappy Bird(安卓版)逆向分析(一)

更改每過一關的增加分數

反編譯的步驟就不介紹了,咱們直接來看反編譯獲得的文件夾java

image

方法1:在smali目錄下,咱們看到org/andengine/,能夠知曉遊戲是由andengine引擎開發的。打開/res/raw/atlas.txt文件,找到以下信息:編程

image

咱們直接把number_score_00 01....08的座標值所有修改成number_score_09的座標值,從新打包並簽名apk,運行測試,0-9關分數一直爲9分,10-99關分數一直爲99分。app

方法2:打開string.xml,沒有找到有用的信息,因爲代碼是被混淆過的,沒法直接根據類名找關鍵代碼。咱們換另外一種方式,查找string變量,用工具apk改之理打開apk文件,選中smali/com/dotgears/文件夾,在軟件右側面板,按以下操做:工具

image

在搜索結果中,有這樣一條記錄:image ,咱們不妨猜想該字符串是用來獲取分數的,雙擊來到所在文件,\com\dotgears\h.smali。關鍵代碼以下:測試

# direct methods  
.method static constructor <clinit>()V    
.locals 1this

const-string v0, "0123456789".net

sput-object v0, Lcom/dotgears/h;->l:Ljava/lang/String;code

return-void  
.end methodxml

爲了測試咱們的猜想,直接將「0123456789」修改成「9999999999」,打包簽名安裝,運行測試,0-9關分數一直爲9分,10-99關分數一直爲99分。猜想正確。blog

sput-object v0, Lcom/dotgears/h;->l:Ljava/lang/String //將string類型的變量I賦值爲「0123456789」

咱們在當前文件查找l:Ljava/lang/String, 在方法.method public a(II)V中發現調用,部分代碼爲:

sget-object v5, Lcom/dotgears/h;->l:Ljava/lang/String;

invoke-virtual {v5, v2}, Ljava/lang/String;->charAt(I)C

咱們轉到反編譯出的java代碼來仔細看下該方法:

  public void a(int paramInt1, int paramInt2)
  {
    this.k = 0;
    int m = paramInt1;
    if (paramInt2 <= 0);
    for (int i1 = 0; ; i1++)
    {
      if (i1 >= this.k)
      {
        if (this.k == 0)
        {
          this.i[0] = '0';
          this.k = 1;
        }
        return;
        if (m <= 0);
        while (true)
        {
          paramInt2--;
          break;
          int n = m % 10;
          m /= 10;
          this.j[this.k] = l.charAt(n);
          this.k = (1 + this.k);
        }
      }
      this.i[i1] = this.j[(-1 + (this.k - i1))];
    }
  }

根據編程經驗,不妨猜想:

參數paramInt1爲所得分數,paramInt2爲所得分數位數

int n = m % 10; //獲取分數低位

m /= 10; //獲取分數高位

this.j[this.k] = l.charAt(n); //取分數

驗證:咱們直接在該方法中對參數進行賦值,而後打包簽名,安裝測試便可。事實上,該方法的做用是實時更新界面上方的顯示的分數。

經過修改此處的參數paramInt1的值,咱們就能夠修改上方顯示的分數,可是最終記錄的分數仍然未改變,爲此咱們必須找到該方法在哪裏被程序調用,以及參數paramInt1是如何得來的。

打開ida,首先找到方法image (即上面的void a(int paramInt1, int paramInt2)),

雙擊來到該方法代碼,按下回車鍵,點擊jump to xref,即:image ,點擊ok,來到此處:image

&#160;

拉到最上面,image ,在此處該方法被調用,咱們回到對應的java代碼,找到相關調用以下:

this.an.a(this.y, 20);

即參數paramInt1爲this.y,參數paramInt2固定取20。

繼續往上搜索變量this.y,來到此處:

      if ((this.ao > 0) && (this.ak <= 0) && ((this.ag == this.J.b) || (this.ag == -1 + this.J.b)))
      {
        this.y = (1 + this.y);
        c(9, 0);
      }

this.y在前面已被初始化爲0,此處,if循環應爲判斷是否得分的條件,若是爲真,則分數加1。顯然,咱們直接將1修改成咱們所但願的增加分數便可。打開對應的smali文件:/dotgears/flappy/c.smali,修改第489行代碼:

add-int/lit8 v0, v0, 0x1 -> add-int/lit8 v0, v0, 0x*    //*爲你所但願的增加分數(16進制)

從新打包,簽名安裝,測試經過。

附上使用的工具和修改後的包:

工具下載地址:http://pan.baidu.com/s/1ntyk1uT

修改後的包:http://pan.baidu.com/s/12AAq6

原始apk:http://pan.baidu.com/s/1jGsQTfS

Flappy Bird(安卓版)逆向分析(二):http://my.oschina.net/auo/blog/205286

相關文章
相關標籤/搜索