標籤: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