Android 解讀.apk解壓後檔案詳細說明,android.apk
反編譯 — 在apk檔案中能得到什麼
最近在做android用戶端與伺服器安全通訊,有一種常見的不安全因素:很多軟體常常會被人從apk檔案中擷取到或帳戶資訊。一個打包成apk的軟體,通過反編譯可以獲得哪些資訊呢?下面我們來動手反編譯一個簡單的demo--HelloWorld。
將產生的HelloWorld.apk使用壓縮軟體開啟,看到下面幾個檔案/目錄
其中,res中存放著所有的圖片檔案以及xml檔案,也就是在eclipse工程目錄中res下面的所有資源。這裡的xml檔案是經過壓縮的,用AXMLPrinter2工具可以開啟。
這是反編譯出來的AndroidManifest.xml
怎麼樣,是不是跟原始碼一模一樣?
resources.arsc檔案中儲存的是編譯後的二進位資源檔,許多做漢化軟體的人都是修改該檔案內的資源以實現軟體的漢化的。
classes.dex是java源碼編譯產生的位元組碼檔案。但由於Android使用的dalvik虛擬機器與標準的java虛擬機器是不相容的,.dex檔案與.class檔案相比,不論是檔案結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex檔案。
dex2jar是專為反編譯.dex而開發的工具,它可以把.dex檔案反編譯成為.jar檔案。然後用JD-GUI工具將.jar檔案反編譯成.java檔案。
這是反編譯出來的MainActivity.xml
下面是原始碼:
經過反編譯的代碼雖然可讀性不是很好,但是跟源碼幾乎沒什麼差別。在開發時如果你直接將帳號等重要訊息放到java代碼中,那就沒有任何安全性可言了。
經過反編譯,anroid項目的源碼全部暴露無疑,那是不是可以通過反編譯將一個android軟體改成自己想要的樣子?答案是否定的,在META-INF目錄下存放的是軟體的簽名資訊,用來保證apk包的完整性和系統的安全。在軟體安裝時應用管理器會對包裡的檔案進行校正,如果校正資訊與META-INF目錄下的資訊不一樣,系統就會拒絕安裝這個軟體。另外,專業的編程人員都會把重要訊息封裝到.so庫檔案裡,這些資訊是無法被反編譯的。
即使這樣,對一個軟體進行像漢化這樣的操作卻是足夠了。