標籤:android style blog http io color ar 使用 sp
轉載請標明出處:http://blog.csdn.net/goldenfish1919/article/details/41010261
首先我們來看下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) interfaces_off , 值為位移地址 ,指向 class 的 interfaces , 被指向的資料結構為 type_list 。class 若沒有 interfaces ,值為 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,因為用不到,所以運行時不會報錯的,但是但編譯工具在做靜態解析的時候,就會解析不出來而報錯!
然後看下頭部的具體組成部分:
(1)magic value
這 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-對抗反編譯工具的一種方式