記一次噩夢般的經歷——論學會反編譯的重要性

 

 

  最近在作一個android項目,由於非開源,github上也沒購有私有庫,因此就沒有提交github管理。昨天我感受寫到了必定程度,一個小的版本已經出來了,因而就想U盤和網盤都備份一下。結果出現了下面的一幕.......html

 

      

 

       

  我點了兩次重試,沒用;再點跳過,而後什麼都沒有複製。我再看想要複製的文件夾,找不到了........java

      

   尼瑪坑爹的微軟……不讓我複製也不要把原來的弄丟啊......無奈之下我趕忙上網搜一下「一個意外錯誤使你沒法複製該文件夾」,發現也有很多人遇到一樣的問題,但都沒有解決辦法。因而我又想試試能不能數據恢復,而後下載了好幾個數據恢復軟件,不只掃描過程要好久,並且根本找不到剛剛莫名其妙丟失的文件。  android

    

 

       要是丟失的是其餘文件,可能到這也就結束了,但丟失的是android項目文件,並且我是用真機調試過的,因而我就想能不能獲取手機的安裝文件,再想辦法恢復源文件。我以前接觸過一點反編譯,對於沒有通過特殊處理的apk,反編譯的效果仍是很是好的。就算很差也要試一試了,反正已無其餘辦法.....git

 

1.獲取apkgithub

  要進行反編譯,首先要獲取目標文件。我一開始想的是如何獲取已安裝的dex文件,但在手機上安裝文件被系統隱藏起來了,沒root根本沒辦法查看。那,只能 root ? 我又上網搜了各類從已安裝程序獲取安裝包的方法,發現有一個說android系統在安裝完程序後,會保留一份apk的,能夠經過adb鏈接手機,經過 pull 命令獲取到。既然這樣,那就試試吧。app

* 首先將手機經過usb線鏈接到電腦ui

* 進入android sdk 安裝目錄:SDK\platform-tools\spa

* 按住shift鍵並右鍵鼠標,選擇「在此處打開命令窗口(W)」命令行

* 輸入 adb pull data/app/你的apk包名-1.apk 輸出目錄\你的apk包名.apk3d

  Android系統備份的apk會在apk包名的後面加上"-N",但N的具體數據通常是1,但我第一次輸入的是 「-1」,結果沒找到,第二次輸入「-2」而後就找到了。第一次由於沒有制定目錄具體目錄,不知道pull到哪了,我又從新試了一次。如圖:

有了apk,接下來就好辦了。

 

2.獲取xml文件

  通常經apk解壓後獲取的xml文件,打開是亂碼的,但用Apktool 將沒有通過特殊處理的apk反編譯後獲得的xml文件恢復程度很是高,只是屬性的順序、屬性值的格式會稍微改變一下,好比match_parent 換成fill_parent等,且會增長了一些默認屬性,稍微修改一下便可。

具體操做步驟:

* 下載Apktool 的jar包;

* 將Apktool 和要反編譯的apk文件放在同一個目錄下,以方便操做;

* 在上步目錄下打開命令行窗口,輸入:

    java -jar Apktool的jar包名稱  d  要反編譯的apk名

回車;

 

3. 反編譯獲取java文件

* 下載dex2jar軟件包;

* 將apk解壓,獲取classes.dex文件,並將該文件複製到dex2jar目錄下(方便操做);

* 進入dex2jar軟件包下打開命令行窗口,輸入:

    d2j-dex2jar.bat classes.dex

回車,如圖:

    

按以上步驟操做後便可得到classes-dex2jar.jar文件,即咱們的源文件的jar包;

* 下載jd-gui軟件,打開該軟件後直接將jar包拖進去便可看到咱們的程序文件;

     

 

  至此,反編譯工做就所有完成了,終於能夠鬆一口氣。不過我此次反編譯出的java文件出了點錯誤——反編譯軟件在每一個類裏面都自動添加了一些莫名其妙的代碼,必須手動刪除,還有一些程序資源的ID必須從新設置一下才好....

   

  此次意外致使的問題終於解決了,但過程也極其痛苦,花費的時間也沒法挽回。因此之後對於重要文件咱們必定要及時備份、及時備份、備份(雖然備份時也可能出錯,好比我此次,但備份越早損失越小)!!!否則真不知道何時機器或系統會忽然噁心你一下......固然一些挽救技術也最好了解一下,關鍵時刻有可能就會成爲咱們的救命稻草。

  

  本文地址:http://www.cnblogs.com/laishenghao/p/5577722.html

  做者博客:( •̀ ω •́ )y

相關文章
相關標籤/搜索