1. 程式人生 > >Apk反編譯&回編譯(一)

Apk反編譯&回編譯(一)

本篇主要講解未加固型(純混淆+簽名)apk反編譯和回編譯方法

  1. 主要使用工具:ApkTool , Smali2Java , apk簽名工具

  2. Apk反編譯之使用姿勢
    這裡使用demo.apk 作為反編譯檔案

a.安裝ApkTool, 將demo.apk放入ApkTool所在資料夾,開啟Terminal終端,使用cd命令進入ApkTool所在路徑。 示例:
如ApkTool安裝在D:\ApkTool 下,則將demo.apk放入該資料夾下,開啟Terminal終端,依次輸入 D:回車 –> cd ApkTool 回車 即可進入ApkTool所在路徑

b.此時Terminal定位在D:\ApkTool> , 輸入 apktool d demo.apk 回車, 稍等幾秒即會在D:\ApkTool下生成demo資料夾,該demo資料夾即是demo.apk反編譯後的內容

c.demo資料夾檔案分析

這裡比較關鍵的檔案(夾): smali 和 AndroidManifest.xml res主要是該apk檔案所用到的資源(圖片,文字等)檔案
smali : 裡面放置了許多smali檔案,這裡就是整個apk的核心邏輯程式碼,但是smali語言極難看懂,類似組合語言(網上都這樣說,哈哈),不過一般的方法(函式)的開始和結束以及呼叫能看懂一二,對於我們這種smali渣渣來說就足夠用了。
AndroidManifest.xml : 所謂的清單檔案,主要配置了該apk版本,編譯版本,包名,許可權以及元件的宣告等重要資訊.下面的回編譯註入自己的程式碼時需要對該檔案進行寫操作。

d.上面說到smali比較難看懂,Smali2Java這個工具即可將smali轉為java,這就能看懂了,也就能分析別人的邏輯程式碼了,當然只能是部分,因為有程式碼混淆。
到此,Apk反編譯也就結束了,反編譯的作用主要是分析別人的邏輯程式碼,或者偷res的資原始檔,再一個就是注入自己的邏輯程式碼回編譯…

  1. Apk回編譯之使用姿勢

a. 簡單回編譯: 對於這種替換個App名稱,版本號,換個圖片什麼的,圖片可通過替換res下對應的圖片(名字大小格式確保一樣),App名稱,版本號什麼的可直接修改上面提到的AndroidManifest.xml清單檔案,儲存。 開啟Terminal終端,使用cd命令進入ApkTool所在路徑。 此時Terminal定位在D:\ApkTool> 輸入 apktool b demo 回車, 稍等幾秒即會在demo資料夾下生成dist和build資料夾(不用管build資料夾),dist裡面就是回編譯生成的apk檔案




但是該apk不能安裝使用,需要對其重新簽名即可安裝使用,簽名步驟略去

b. 注入自己的邏輯程式碼回編譯: 這裡以嵌入有米廣告積分牆SDK為例
在正常的專案開發中嵌入此SDK需要配置這些資訊–> 1.在AndroidManifest.xml 清單檔案中配置有米積分牆SDK所需的許可權,元件宣告等資訊; 2.在專案中引入有米SDK所需的jar包; 3.在程式碼中新增開啟有米積分牆的邏輯程式碼
現在換成回編譯又怎麼處理呢? 下面來分析思路: 1. 配置清單這一步驟和簡單回編譯一樣的,直接在清單檔案中新增許可權,元件宣告程式碼即可 2. 引入jar包, 回編譯的時候怎麼引入jar包呢, 檢視反編譯後的smali資料夾就會發現,專案依賴的所有jar包都被反編譯到smali資料夾下面了,這樣一來,我們只需自己擼個簡單的集成了有米SDK的專案生成release版本的test.apk檔案,反編譯即可在smali資料夾下獲得有米sdk的smali檔案,放在了 smali/net/youmi/android這個資料夾下,如圖:

複製net資料夾到demo/smali 資料夾下即可

3.在程式碼中新增開啟有米積分牆的邏輯程式碼, 回編譯是把smali檔案轉為dex檔案, 嵌入的邏輯程式碼又是java程式碼,這時候只需要上一步的test.apk生成的smali檔案中的邏輯程式碼複製到demo/smali資料夾下對應的smali檔案中。
下面是開啟有米積分牆的smali程式碼,寫成了一個方法,
呼叫的時候 invoke-virtual {p0}, Lcom/jeffer/ym/MainActivity;->showYM()V,其中的com/jeffer/ym/MainActivity換成你需要注入程式碼所在的Activity的全類名。 最後在Terminal定位到D:\ApkTool> 輸入 apktool b demo 回車, 稍等幾秒即會在demo資料夾下生成dist和build資料夾(不用管build資料夾),dist裡面就是回編譯生成的apk檔案,重新簽名後安裝,開啟APP即可在你注入程式碼處開啟有米積分牆。

c. 注入邏輯程式碼和控制元件回編譯: 下回分解