首先我們來看下dex檔案的格式:
class_defs的結構:
(1) class_idx 描述具體的 class 型別 ,值是 type_ids 的乙個 index 。值必須是乙個 class 型別 ,不能是陣列型別或者基本型別 。
(2) access_flags 描述 class 的訪問型別 ,諸如 public , final , static 等 。在 dex-format.html 裡 「access_flags definitions」 有具體的描述 。
(3) superclass_idx , 描述 supperclass 的型別 ,值的形式跟 class_idx 一樣 。
(4) inte***ces_off , 值為偏移位址 ,指向 class 的 inte***ces , 被指向的資料結構為 type_list 。class 若沒有 inte***ces ,值為 0。
(5) source_file_idx , 表示源**檔案的資訊 ,值是 string_ids 的乙個 index 。若此項資訊缺失 ,此項值賦值為 no_index=0xffff ffff 。
(6) annotions_off , 值是乙個偏移位址 ,指向的內容是該 class 的注釋 ,位置在 data 區,格式為 annotations_direcotry_item 。若沒有此項內容 ,值為 0 。
(7) class_data_off , 值是乙個偏移位址 ,指向的內容是該 class 的使用到的資料 ,位置在 data 區,格式為 class_data_item 。若沒有此項內容 ,值為 0 。該結構裡有很多內容 ,詳細描述該 class 的 field , method , method 裡的執行**等資訊 ,後面有乙個比較大的篇幅來講述 class_data_item 。
(8) static_value_off , 值是乙個偏移位址 ,指向 data 區里的乙個列表 ( list ) ,格式為 encoded_array_item 。若沒有此項內容 ,值為 0 。
重點關注下(5),這一項代表的是原始檔的名字。因此,一種可行的方案是往dex中新增乙個專案中根本就用不到的類,然後修改source_file_idx,因為用不到,所以執行時不會報錯的,但是但編譯工具在做靜態解析的時候,就會解析不出來而報錯!
然後看下頭部的具體組成部分:
這 8 個 位元組一般是常量 ,為了使 .dex 檔案能夠被識別出來 ,它必須出現在 .dex 檔案的最開頭的位置 。
(2)checksum 和 signature
4位元組的檔案校驗碼 ,使用alder32 演算法校驗檔案除去 maigc ,checksum 外餘下的所有檔案區域 ,用於檢查檔案錯誤 。
20個位元組的signature , 使用 sha-1 演算法 hash 除去 magic ,checksum 和 signature 外餘下的所有檔案區域 ,用於唯一識別本檔案 。
從上面的結構可以看出來,如果是修改了source_file_idx,那麼要同時修改signature 和checksum 。
總結步驟如下:
(1)專案原始碼打包成jar包(混淆)以後,新增進入乙個無用的類x.x.x.x.x.x。
(2)把新的jar包轉換成dex
(3)修改dex中x.x.x.x.x.x類的 source_file_idx。
(4)重新計算signature 。
(5)重新計算checksum 。
(6)更新dex。
(7)正常打包簽名安裝。
android反編譯工具學習
2.更改字尾名apk為rar 3.開啟更名後的rar檔案,提取出classes.dex 4.使用dex2jar工具,dex2jar.bat得到classes dex2jar.jar。此工具是批處理檔案,需要在cmd中執行,將上面得到的classes.dex檔案複製到dex2jar目錄中,和dex2j...
android反編譯apk工具
1.檢視apk包時,需要把apk字尾改為zip然後解壓開。2.此時如果想檢視原始碼,需要轉換dex檔案為jar檔案 會用到dex2jar工具 進入 dex2jar 2.x 目錄,執行編譯命令 gradlew.bat assemble 編譯完後在dex2jar 2.x dex tools build ...
android 反編譯 逆向工具整理
需要準備的道具 需要哪些軟體會在後面逆向過程中詳細介紹,這裡先大致羅列一下 android 一台root並安裝了xposed框架的手機 主要是為了脫殼 類似 海馬玩 這種模擬器 android killer zjdroid androidsdk自帶工具,如adb ddms等 android zjdr...