Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android-對抗反編譯工具的一種方式

Android-對抗反編譯工具的一種方式

編輯:關於Android編程

 

首先我們來看下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)正常打包簽名安裝。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved