Chapter2——如何分析Android程式(一)

來源:互聯網
上載者:User

標籤:android   blog   http   java   使用   strong   

前幾天買了《Android軟體安全與逆向分析》這本書,決定在這裡記一些筆記。

第一章介紹了如何搭建環境,此處略去;第二章開始講分析Android程式。

下面按順序記錄關鍵內容。

--------------------------------------

2.1.編寫一個需要填寫註冊碼的APK


要破解要現有「實驗品」,作者編寫了一個叫做crackme02的APP,

主要代碼有:

MessageDigest digest = MessageDigest.getInstance("MD5");digest.result();digest.update(userName.getBytes());//採用MD5對使用者名稱進行Hashbyte [] bytes = digest.digest();//將計算結果轉換為長度32位的16進位字串StringBuilder sb = new StringBuilder();for (int i = 0 ; i <hexStr.length() ; i += 2)//取字串的奇數位重組為新的字串,which is SNsb.append(hexStr.charAt(i));StringuserSN = sb.toString();if(!userSN.equalsIgnoreCase(sn))return false ; 

題外話,介紹一下Hash:

Hash,一般翻譯做“散列”,也有直接音譯為"雜湊"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
MD5可以說是目前應用最廣泛的Hash演算法。

上面那段代碼使用MD5演算法計算使用者名稱字串的Hash,將計算所得的結果轉換成長度32位的16進位字串,然後取字串的奇數位重新組合成新的字串,也就成了註冊碼。然後就是一個判斷語句。

 

接下來他寫了一個簡單的介面,要求填入使用者名稱和註冊碼,然後點擊註冊按鈕。

 

2.2破解第一個程式

破解2.1中寫的那個程式。作者用Apktool反編譯了apk,得到smali格式的反組譯碼代碼,以及res檔案夾中的資源。

突破口是之前編寫的程式中的strings.xml中的錯誤提示。

開啟strings.xml,定位到這一行:

<string name = "unsucceeded">無效的使用者名稱或註冊碼</string>

strings.xml所有的字串資源都在"gen/<package name>/R.java"檔案的String類中被標示,

每個字串都有唯一的int類型的索引值。用Apktool反編譯之後,所有的索引值都儲存在strings.xml檔案同名目錄下的public.xml中,如:

 

(注意這兩張圖的app_name不是同一個應用的所以才不同。因為只有用apktool反編譯之後才會產生res/public.xml,而得不到gen中的R.java。我沒有特意去反編譯這個應用而是隨便找了個反編譯好的apk。)

作者在public.xml中找到了unsucceeded對應的id:

<public type="string" name="unsucceeded" id="0x7f070024" />

然後在smali目錄中搜尋含有內容為0x7f070024的檔案,發現只有MainActivity$1.smali檔案一處調用。開啟這個檔案,代碼一大堆,

找到關鍵的一段:

invoke-static {v0,v1,v2},Lcom/droider/crackme0201/MainActivity;->access$2.....;Ljava/lang/String;)Z #檢測註冊碼是否合法move-result v0if-nez v0, :cond_0 #如果結果不為0,就跳轉到cond_0:處....cond_0....

把一個Boolean值儲存到v0,如果條件為真則跳轉到cond_0,否則順序執行。

顯然,把if-nez調成if-eqz就可以了。

 

然後用apktool b命令重新編譯打包成apk。

接下來用signapk.jar對apk簽名signapk是源碼中的一個簽名工具。可以用Android源碼中的簽名檔案testkey.pk8,testkay.x509.pem作為簽名檔案。具體簽名步驟就不介紹了,在書的26頁。

然後是安裝。他用了adb install signed.apk把這個安裝到了AVD裡面。然後只要在在註冊碼中輸入任意的東西就可以了。

 

----------

這篇文章重要的點在於:

通過strings.xml中的文字來定位到unsucceeded,

然後在public.xml中找到它的id,

再在smali檔案中找對應的smali檔案

這三個步驟。

 

跟這個差不多:http://bbs.pediy.com/showthread.php?t=153295

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.