1. 程式人生 > >反編譯app並加入引導頁面

反編譯app並加入引導頁面

反編譯別人app,我們需要用到一些反編譯工具,我們這裡用到三個工具:apktool.jar,apktool.bat 、jd-gui、dex2jar

工具可以再網上下載或者https://pan.baidu.com/s/1htWNrfA   密碼:7t2i 下載 

反編譯app首先得有目標app,我建立了一個Dome,一個很簡單的顯示


有了dome,開始反編譯

把apk放到和工具一起,免得切換麻煩 ,我這裡統一放到d盤下的fby資料夾裡面,


dome放在apk資料夾裡面,修改apk字尾為zip,然後解壓,可以得到apk的資原始檔


可以看到裡面有一個classes.dex檔案,這個檔案就是我們需要看apk內部程式碼的檔案了,裡面包含了所有的類,其他如res、AndroidManifest等資原始檔如果需要可以去檢視(如開啟AndroidManifest檔案亂碼或者打不開,沒關係,可以利用apktool工具解apk出來的AndroidManifest檔案則可以正常瀏覽

這裡並不能看到java檔案,我們需要用到另外一個工具:dex2jar

把classes.dex檔案拷貝到dex2jar根目錄下面,然後cd到dex2jar根目錄,執行命令 d2j-dex2jar classes.dex,則可以得到jar檔案classes-dex2jar.dar,如圖:


得到jar檔案,就可以看裡面的程式碼啦,利用工具jd-gui.exe開啟jar包,程式碼顯示如下


因為建立dome的時候沒注意,建立了一個kotlin的dome,不過問題不大,看程式碼是一樣的,(裡面的clearFindViewByIdCache和findCachedViewById方法在真是程式碼裡面是隱藏的),得到了所有的程式碼,就可以在裡面看別人程式碼的實現啦,(如果對方app混淆了的話,就得仔細排查了)

到這裡,我們得到了所有的資原始檔和類檔案,接下來我們需要用到apktool工具,把apk檔案拷貝到該檔案的同一個目錄下面,如:


cd到該目錄下面,執行命令

apktool d test.apk,執行完畢之後,如果不出意外,會得到一個text資料夾,開啟資料夾,裡面內容如下:

開啟AndroidManifest.xml檔案,可以看到包名以及之前dome裡面第一個啟動類,如:


看到上面包名為dome.test,第一個啟動類為MainActivity,有了這個,我們就很好辦了,開始擼程式碼

新建一個專案,包名設定和目標app一致,在和啟動類同一包中新建一個類,為SActivity,並設定為Main 類,新建佈局檔案activity_s;如下:



進入app後,經過五秒之後調整到MainActivity介面,我這裡只是放了一個簡單的圖片,如果真正的加入廣告頁面,可以在這個類裡面訪問介面顯示廣告等

程式碼編寫好之後,不能直接把類檔案放到目標反編譯的檔案中,我們知道安卓虛擬機器執行需要的不是java檔案,而是smail檔案,如果直接把類檔案放到裡面去,肯定是GG的

下一步,把最新編寫好的程式碼打包成一個apk,然後反編譯這個apk,就可以得到新寫的類的smail檔案了,過程和上述一樣,使用apktool工具,

我這裡給apk取名為test_two.apk,故反編譯之後資料夾為test_two資料夾,進入smail這個資料夾,來到包名對應下的資料夾下面,測試包名為dome/test,所有我們也進入到dome/testwen資料夾 ,看到有很多.smail檔案,我們新增了一個SActivity類,所以只關注SACtivity相關的,如下:


我們看到有SActivity$****檔案的,都是屬於SActivity裡面內部類的編譯檔案,一起拷貝到我們目標反編譯的smail下面的對應資料夾裡面,這裡為smail/dome/test

然後把對應資原始檔也拷貝到相對應的資料夾裡面,

拷貝了檔案就可以了嗎? no,別忘記了,我們還加入資源圖片,xml檔案和對應的iD呢,所以還得手動的新增對應的R檔案索引值

再次來到目標的反編譯之後的資料夾中,可以看到裡面有很多R$**.smail檔案,首先找到R$layout.smail檔案,用文字方式開啟,如下:


可以看到裡面有很多的值,我們把我們新加的activity_s手動新增進去

.field public static final activity_s:I = 0x7f09003f   (注意值為唯一值,並且0x7f開頭,具體資源ID值命名可在網上查閱)

如上,將start圖片id已經xml檔案裡面定義的控制元件id新增進去

新增好之後還不行,還得需要來到value資料夾裡面,找到public.xml檔案,文字形式開啟,開啟之後如下:


可以看到裡面定義了對應的型別和值,把剛剛我們新增的佈局檔案,drawable資源id以及控制元件id等手動新增進去

  <public type="drawable" name="start" id="0x7f060073" />
  <public type="id" name="image" id="0x7f070090" />
  <public type="id" name="time" id="0x7f070091" />
  <public type="layout" name="activity_s" id="0x7f09003f" />

新增之後並沒完,還得改一個地方  來到res資料夾下面的value資料夾,文字形式開啟ids.xml檔案,看到如下資料


因為我們是自己定義的id,而不是使用系統裡面的id,所有我們需要將我們定義的id新增進去,否則app執行的時候,會報找不到id錯誤:

   <item type="id" name="image">false</item>
    <item type="id" name="time">false</item>

定義id之後,我們再需要到到新增類裡面的smail檔案裡面把原來應用了資源的值替換成我們手動新增的即可,具體值可以參照你反編譯自己新建的專案apk裡面的值,找到值對應的資源名稱,然後在原apk裡面找到自己對應的資源名稱自定義的值替換即可

到此,資源修改差不多完成了,接著我們修改AndroidManifest.xml檔案,修改啟動類,然後再宣告一個activity用來裝載原來的Activity,如下:


到此,所有的檔案修改完成,進行二次打包,二次打包過程和反編譯目標app差不多,只是命令變成 apktool b 資料夾名字 -o new.apk

我這裡為 apktool b test -o new.apk

執行完畢之後,如下


會在資料夾裡面出現一個new.apk檔案,注意,這個apk是不能安裝的,因為還沒對其簽名,開始簽名,把簽名檔案一起放到這個目錄下面 

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名檔名 -storepass 簽名密碼 待簽名的APK檔名 簽名的別名

簽名完成之後,可輸入一下命令檢測是否簽名成功 

jarsigner -verify -verbose -certs 簽名apk名稱

到此,反編譯完成  

 有不對之處----望指正