1. 程式人生 > >android反編譯APK後,是smali檔案,能反編譯成dex檔案

android反編譯APK後,是smali檔案,能反編譯成dex檔案

我也面臨相同的問題,但目前還沒找到類似反編譯smali檔案的方法,一般得到dex檔案只需要用WinRAR或其他壓縮軟體開啟apk檔案就能得到。但也有例外好像,技術先進了,今天遇到個apk用WinRAR開啟異常,沒有dex檔案,所以得到原始碼的計劃就泡影了,至少用目前常規的方法無法得到,還在學習中。如果真需要修改原始碼的話,沒有dex的情況下只能從smali檔案著手了,參考下面這位仁兄的做法吧,應該有用。~共同學習

這篇文章是針對Android系統的產品而言(而不是隻針對原道產品),不過,我只有一臺N5p那就發這兒了(貌視罈子裡沒有技術區)。如果是打醬油的高手路過,請繼續去打醬油,當然也歡迎圍觀。vivi_an首發imp3

.net,轉載請註明出處。

  主要目標:對於沒有SD卡但想要安裝執行那些只有SD卡支援的apk程式的(比如仙劍)。

  次要目標:apk程式反編譯、漢化、修改程式的資料讀取和儲存路徑。

  本文針對“思維導圖 Thinking Space Pro 2.16”的apk程式ThinkingSpacePro.apk進行修改。題外話,這程式人手配備一個,不錯的東西。

一、相關工具(針對windows系統)

  • Apktool:http://code.google.com/p/android-apktool/
    下載apktool-install-windows-2.2_r01-3.tar.bz2和apktool1.3.2.tar.bz2,用winrar解壓後把解壓出來的檔案
    都放在一個目錄下,比如:E:/apktool/ 下(為簡單起見,下文都用這個路徑為apktool工作目錄)。
  • Auto-Sign簽名工具:N/A


二、反編譯

  說要把apk“裝冰箱(反編譯)”分三步走:

  • 第一步:先把apk程式(這裡用ThinkingSpacePro.apk)程式放到 E:/apktool/ 下。
  • 第二步:啟動windows的cmd.exe,用命令列cd到 E:/apktool 目錄下。
  • 第三步:鍵入命令
    1. apktool d ThinkingSpacePro.apk

    這個命令的格式是:
    1. apktool d xxx.apk output

    其中 d 引數用來指示工具要進行反編譯操作,xxx.apk是要反編譯的程式,output 原始碼輸出
    的路徑。如果最後不指定輸出的路徑,預設是放在同目錄下的 xxx 資料夾下(即apk程式名稱去掉.apk後的名稱)。如果你的apk檔名稱中有空格,那鍵入命令時用雙引號引起來,不過為方便起見,反編譯之前把apk檔名中的空格都去掉先。
    執行反編譯命令後會在同級目錄下得到一個 ThinkingSpacePro 資料夾,原始檔都在裡面了。


三、漢化

  漢化這個比較簡單,在反編譯apk程式得到原始碼後,一般程式的文件都放在res目錄下,都是些xml文件,用記事本之類的開啟檢視一下,一般都會比較容易看出來哪些是可以漢化的文字。這個就不去弄它了。可能不同程式還有不一樣的,反正英語差點,漢化這種事我也不去深究了。你如果只想漢化的話,進res資料夾找找,完成漢化後就可以直接重新編譯程式了(最後講編譯),不用太多的程式設計知識。思維導圖本身支援多國語言(都在原始檔的res資料夾裡),所以也用不著漢化了。但大致的漢化過程就是這樣了。

  另外貌視還有Android ResEdit之類的專用漢化軟體,不用搞什麼反編譯,用起來可能更簡單。

四、SDcard to Flash

  對於N5p,app2sd只是一個傳說,不過sd2flash下面就可以實現。用SD卡玩機的人可以無視。

  下面這個是本文的重點。目的就是要修改程式的預設資料讀取和儲存路徑,主要針對那些必須有SD卡才能使用的程式。比如說一個遊戲它分為主程式和遊戲的關卡資料。主程式可能只有1M,但遊戲關卡資料可能是幾十甚至上百M,這類遊戲一般是主程式安裝在記憶體中,而關卡資料會要求你安裝或下載到SD卡上。如果你沒有SD卡,那就玩不成了。我之所以要改它的路徑,就是不想讓它佔我的SD卡,N5p不是自帶8G(實際好像只有6.5G)Flash快閃記憶體麼,那為什麼不用它?下面的修改就是要欺騙apk程式,我們的Flash快閃記憶體就是程式你要的SD卡。

  正式修改時,除了要修改所有原始檔(主要是.smali程式原始檔)中的/sdcard 路徑,使之指向 /flash 外,還要修改含有 Environment.getExternalStorageState 和 Environment.getExternalStorageDirectory 的原始檔,前者用於檢測是否安裝SD卡,後者獲取SD卡的路徑。

  那麼從頭來修改思維導圖 Thinking Space Pro 2.16的資料讀寫路徑。原版程式你必須要有SD卡才能正常儲存你的資料,修改之後,所有資料讀取、儲存都針對N5p自己的Flash快閃記憶體,從而解放SD卡。

  • 用apktool反編譯ThinkingSpacePro.apk
    1. apktool d ThinkingSpacePro.apk

    反編譯後得到ThinkingSpacePro資料夾,存放著程式原始檔。
  • 使用UltraFileSearch搜尋ThinkingSpacePro資料夾中所有包含"sdcard"文字的檔案(搜尋時,UltraFileSearch去掉"Whole word"的選項)。沒有UltraFileSearch可以用windows系統自帶的搜尋工具,只是要用搜索檔案中包含有指定內容的檔案,而不是搜尋檔名(我的系統搜尋工具壞了,所以用UltraFileSearch這個軟體代替)。
  • 對搜尋到的檔案(主要是其中的.smali程式原始檔)用記事本開啟編輯,將檔案中所有 "/sdcard" 的字串改成 "/flash" 字串,這樣將原先指向 /sdcard 的路徑全部指向 /flash 路徑。
  • 搜尋程式中判斷SD卡是否安裝的方法,修改它使判斷SD卡是否安裝的方法返回True。一般的檢測SD卡是否安裝的方法是用下面的程式碼判斷的:
    1. Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

    所以用UltraFileSearch查詢包含有"getExternalStorageState"字串的檔案。 
    有些軟體會用這個檢測,有些軟體則不用它,所以找不到的話可以竊喜:不用那麼複雜了。
    針對思維導圖這個程式,在App.smali中會找到(其它程式不一定在這裡)。具體查詢到的程式碼如下:

    1. .method public static isSdPresent()Z
    2. .locals 2
    3. .prologue
    4. .line 476
    5. invoke-static {}, Landroid/os/Environment;->getExternalStorageState()Ljava/lang/String;
    6. move-result-object v0
    7. const-string v1, "mounted"
    8. invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    9. move-result v0
    10. return v0
    11. .end method


    這個是Dalvik opcodes,修改它需要一點專業知識(參考這裡), 修改成如下(後來發現似乎只需要將最後的 return v0 改成 return 1 就可以了,不過沒去做測試,對Dalvik opcodes尚未仔細研究過):

    1. .method public static isSdPresent()Z
    2. .locals 2
    3. .prologue
    4. .line 476
    5. const-string v0, "mounted"
    6. const-string v1, "mounted"
    7. invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    8. move-result v0
    9. return v0
    10. .end method


    改後因為v0始終等於v1,所以這個方法就返回True,這樣就欺騙程式我們已經安裝了SD卡了。
  • 搜尋程式中獲取SD卡路徑的方法,修改它使它返回的路徑從原來的指向 sdcard 變成 flash,再次欺騙程式我們的 flash 就是我們的 sdcard。一般的獲取SD卡路徑的方法如下:
    1. Environment.getExternalStorageDirectory

    注意這個方法返回的是一個java.io.File物件,而不是字串,修改時要注意這一點。所以用UltraFileSearch搜尋包含"getExternalStorageDirectory"的檔案(主要是.smali檔案),針對思維導圖這個程式會搜尋到App.smali和FileIO.smali二個檔案,分別開啟修改。具體對於App.smali相關內容如下(FileIO.smali也是類似):

    1. .line 246
    2. :cond_0
    3. new-instance v2, Ljava/lang/StringBuilder;
    4. invoke-direct {v2}, Ljava/lang/StringBuilder;->()V
    5. invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;
    6. move-result-object v3
    7. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
    8. move-result-object v2
    9. sget-object v3, Ljava/io/File;->separator:Ljava/lang/String;


    把它修改成如下:

    1. .line 246
    2. :cond_0
    3. new-instance v2, Ljava/lang/StringBuilder;
    4. invoke-direct {v2}, Ljava/lang/StringBuilder;->()V
    5. const-string v3, "/flash"
    6. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
    7. move-result-object v2
    8. sget-object v3, Ljava/io/File;->separator:Ljava/lang/String;


五、重新編譯程式

  修改完成後,回到cmd.exe視窗,鍵入重新編譯的命令:
  apktool b ThinkingSpacePro 
  第一次編譯會出狀況,後來發現是原始碼中的AndroidManifest.xml這個配置檔案有問題,在這個檔案的倒數第二行:
   

  1. <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:resizeable="true" />


  問題就出在那個android:xlargeScreens="true"上,好像不支援吧。所以刪掉它,變成:
   

  1. <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" />


  再次重新編譯,成功。
  重新編譯後,編譯輸出的apk程式檔案儲存在 ThinkingSpacePro 子目錄下的 dist 資料夾下。
  這時候工作都基本完成了,不過,這個生成的apk程式還不能直接安裝使用,因為缺少簽名。

六、簽名

  抓鬼用保鮮膜,打鬼用巧克力,簽名用Auto-Sign。這個工具的下載和使用方法網上搜吧。我這裡不說了,已經出了本文的範圍。

  另外像物理空間Space Physic這個遊戲的修改方法與此類似,不過它還要簡單一點。還有像仙劍,它的修改不用涉及Dalvik opcodes,所以更簡單,不過,它的不同點在於還要修改.so檔案(.so檔案相當於動態連線庫dll檔案),對.so的修改時用hedit等二進位制編輯工具開啟後將 "/sdcard" 替換為 "//flash" 即可。 

  全當拋磚引玉,你可能有不同的目的來修改原程式,不過萬變不離其宗,大致如此。

  如果你仍然不知道我上面改來改去到底在改什麼,那麼可以在你的N5p不插SD卡的情況下安裝原版的思維導圖這個軟體,看能不能正常執行和使用;然後,解除安裝原版,同樣在不插SD卡的情況下,安裝我的修改版,看能否正常執行和使用了。

  題外話,仙劍這個程式修改後能執行,但過了幾分鐘就自動退出,原先以為我修改的有問題,後來拿原版的用SD卡玩,一樣沒過幾分鐘就自動退出,網上一搜都有這種情況,所以不是我改的有問題,原本程式移植的就有問題。

  最後提供思維導圖和仙劍的Flash版(不需要SD卡即可執行),FLASH_ThinkingSpacePro2.16.apk、FLASH_PAL31.apk。對於仙劍這裡只提供主程式,遊戲資料用論壇的那個原版的,把 pal 上傳到 N5p的flash快閃記憶體中(而不需要SD卡),就是連線電腦後出現的 "N5 Pro" 的那個磁碟(這個仙劍移植的不咱地,無故自動退出、選單不支援觸控需要物理按鍵、解析度太低造成大大的馬賽克等等),安裝FLASH_PAL31.apk即可。

  修改程式的下載地址:http://u.115.com/file/t597954474
  仙劍原版(只用資料):http://bbs.imp3.net/viewthread.php?tid=962491&extra=&highlight=%CF%C9%BD%A3&page=1