Android逆向 Dex文件

Android 逆向學習指南
Android 可執(zhí)行文件-dex 文件
uleb128 數(shù)據(jù)類型
SourceInsight 源碼分析工具
解決修改 dex 文件之后的錯誤
修復 dex 文件的原理

  1. Android SDK 知識 1(環(huán)境搭建,SDK 工具(adb 和 monitor))
  2. Android UI 界面編程(基本控件)
  3. Android 四大組件(activity,service,broadcastreceiver,contentprovider)
  4. Andriod 消息機制和網(wǎng)絡多線程(Thread,Runnable,Handler)
  5. Android 逆向(基本逆向工具,Smali 語言)
  6. Android 逆向(集成逆向工具,捕魚游戲的破解,Smali 代碼修改,Smali 代碼注入,動態(tài)調
    試 smali)
  7. Android 逆向(病毒分析,Android 病毒的常見行為,鎖機病毒的分析)
  8. Android 逆向(Hook 框架,Cydia 和 Xposed,Xposed 插件應用)
  9. Android 逆向(可執(zhí)行文件格式, dex 文件, source insight 源碼分析,010Editor 文件分析)

Android 逆向學習指南
Android SDK 學習《第一行代碼第 2 版》
Android NDK 學習《Android C++ NDK 高級編程》前 3 章,Linux 相關的 API(動態(tài)加載、文
件操作)
Android Java 層逆向 工具+資料+文檔+baksmali 源碼,不斷的練習和破解
Android 逆向應用 游戲破解、病毒分析
Android Hook 框架 Cydia,Xposed,frida, 學習 Java 反射相關的編程
Android 文件格式 ELF 文件格式(C++代碼編譯成.so 文件),DEX 文件格式(Java 編譯)
Android ARM 匯編 ARM 指令集(算數(shù)指令、邏輯運算指令、跳轉指令等等)
Android 動態(tài)調試 smali 動態(tài)調試、so 文件動態(tài)調試
Android 加固脫殼 先學習開源代碼(加固流程),再學習 android 源碼(dex 文件加載、so 文
件加載)
Android 源碼學習 《Android 系統(tǒng)源碼情景分析》羅升陽,csdn 博客(虛擬機加載、app
加載、系統(tǒng)加載)
Android 協(xié)議分析 抓包 http 協(xié)議的數(shù)據(jù)(Charles、Fiddler),分析其中的加密參數(shù)

Android 可執(zhí)行文件-dex 文件
最簡單的一個 dex 文件-HelloWorld
① 編譯 smali 為 dex
java -jar smali-2.1.3.jar -o classes.dex HelloWorld.smali
② 查看設備信息
adb devices
③ 上傳文件
adb push HelloWorld.zip /data/local
④ 執(zhí)行程序
adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld

最簡單的 dex 文件的分析,主要分為三大塊:
① Dex 文件頭
② 各種數(shù)據(jù)的數(shù)組,包括字符串、類型、方法原型、字段、方法
③ 類數(shù)據(jù)
④ 其他

image.png
  1. Dex 文件頭


    image.png

字段 1:dex_magic,表示 dex 文件的文件標識,特征字符串
字段 2:checksum, 表示校驗和,對文件求了 32 位的 hash 值(從字段 3 開始到文件末尾)
字段 3:signature[], 表示 SHA1(沙 one),對文件求 hash 值(從字段 4 開始到文件末尾)
字段 4:file_size, 表示文件大小

image.png

字段 5:dex 文件頭大小
字段 6:數(shù)據(jù)排列方式-小端方式


image.png

各種表的大小以及偏移
① string_ids_size 和 string_ids_off ,字符串表的大小和偏移
② type_ids_size 和 type_ids_off,類型表的大小和偏移
③ proto_ids_size 和 proto_ids_off,原型表的大小和偏移
④ field_ids_size 和 field_ids_off,字段表的大小和偏移
⑤ method_ids_size 和 method_ids_off,方法表的大小和偏移
⑥ class_defs_size 和 class_defs_off,類數(shù)據(jù)表的大小和偏移

  1. 各種數(shù)據(jù)的數(shù)組,包括字符串、類型、方法原型、字段、方法
    ① 字符串表


    image.png

字符串表項,是一個字符串數(shù)據(jù)的偏移,偏移指向的是一個 string_data 結構。
String_data 結構中有兩個字段:
字段 1: 代表長度,數(shù)據(jù)類型是 uleb128,變長的數(shù)據(jù)類型(1-5 字節(jié))
字段 2: 存儲數(shù)據(jù),字符串以 0 結尾。
② 類型表


image.png

類型表表項,是一個索引值,類型描述符字符串在字符串表中的索引,圖中的索引是 1,表
示在字符串表中的數(shù)組索引 1 中的元素。

image.png

類型描述符包括基本數(shù)據(jù)類型的描述符和類類型的描述符。
LHelloWorld; 是 HelloWorld 類的類描述符。

③ 原型表


image.png

原型表項中存儲的是函數(shù)原型的各部分描述信息。包括短類型(shorty_idx)、返回類型
(return_type_idx)、參數(shù)的類型(parameters_off,最終還是一個指向字符串表的數(shù)組下標)
注意:字段為返回類型(return_type_idx)的值,是類型表中的索引。

④ 字段表


image.png

字段表項中內容存儲的是字段的信息。包括字段所在類(class_idx)、字段的類型(type_idx)、
字段的名稱(name_idx), class_idx 是類型表中的索引,type_idx 是類型表中的索引,字段名稱
的索引是字符串表的數(shù)組下標。

⑤ 方法表


image.png

方法表項中存儲的是方法的信息,包括方法所在的類(class_idx)、方法的原型(proto_idx)、方
法的名稱(name_idx),其中 class_idx 是類型表中的索引,proto_idx 是在原型表中的索引,方
法名稱的索引是字符串表的數(shù)組下標。

  1. 類數(shù)據(jù)
    類數(shù)據(jù)也是一個數(shù)組,每一個元素就是一個類的相關信息。


    image.png

在表項中的 class_data 中存儲的是類數(shù)據(jù),包括類名索引、訪問屬性、父類索引、接口偏移、
源碼索引、注解偏移、類數(shù)據(jù)偏移。


image.png

在類數(shù)據(jù)中有存儲類中的字段和方法信息,在每一個方法中的 code_item 結構中有一個字段
insns 數(shù)組,存儲的是 dalvik 虛擬機指令。指令可以使用 baksmali 反匯編成 smali 代碼。
ushort insns[8] = 62 00 00 00 1A 01 00 00 6E 20 01 00 10 00 0E 00
第一字節(jié):


image.png

指令 1:62 00 00 00 sget-object v0,field@0000

image.png

偽代碼:sget-object v0,out
Smali 代碼:sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
Java 代碼:System.out

image.png

指令 2:1A 01 00 00 const-string v1,string@0000

image.png

偽代碼:const-string v1,string[0]
Smali 代碼:const-string v1,“Hello World!”
指令 3:6E 20 01 00 10 00 invoke-virtual {v0,v1} , method@0001

image.png

偽代碼:invoke-virtual {v0, v1}, method[1]

image.png

Smali 代碼:invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
更詳細的需要查看 baksmali 的源代碼。

指令 4:0E 00 return-void


image.png

uleb128 數(shù)據(jù)類型
特點:變長,(1-5 字節(jié)),每一個字節(jié)最高位表示標志位,可以理解為是是否下一字節(jié)有數(shù)
據(jù)。
范圍:整型,最大表示一個 32 位的無符號數(shù)據(jù)
舉例:
整型數(shù)據(jù):16 進制:0x180 二進制:0000 0001 1000 0000
小端方式二進制:1000 0000 0000 0001
Uleb128 : 1000 0000 0000 0011
查看源碼讀取信息

DEX_INLINE int readUnsignedLeb128(const u1** pStream) {
const u1* ptr = *pStream;
int result = *(ptr++); // 取出一個字節(jié)
if (result > 0x7f) { // 判斷第一個字節(jié)的最高位是否有值
int cur = *(ptr++); // 取出第二個字節(jié)
result = (result & 0x7f) | ((cur & 0x7f) << 7); // 第一個字節(jié)留 7 位,第二字節(jié)留 7 位
// 字節(jié) 2 會左右 7 位,與第一字節(jié) 做 或操作
// 舉例: uleb128: 1000 0000 0000 0011
// &0x7F 0000 0000 0000 0011
// A | B<<7 0000 0000 | (0000 0011<<7)
// 0000 0000 | 110000000
// = 1 1000 0000=0x180
if (cur > 0x7f) {
cur = *(ptr++);
result |= (cur & 0x7f) << 14;
if (cur > 0x7f) {
cur = (ptr++);
result |= (cur & 0x7f) << 21;
if (cur > 0x7f) {
/

  • Note: We don't check to see if cur is out of
  • range here, meaning we tolerate garbage in the
  • high four-order bits.
    */
    cur = *(ptr++);
    result |= cur << 28;
    }
    }
    }
    }
    *pStream = ptr;
    return result;
    }

SourceInsight 源碼分析工具
新建工程,導入源碼


image.png
image.png

使用指南

image.png

如果需要查找,使用菜單中的搜索功能即可。
解決修改 dex 文件之后的錯誤
當我們修改 dex 文件之后,即使再簽名,再打包,最終還是無法安裝,因為 dex 文件對文件
有校驗,安裝時會讀取 dex 文件頭部的 hash 值和重新計算的值進行比對,完成校驗。


image.png

使用修復工具,修復之后,再次安裝


image.png

此時模擬器中有安裝殘留,需要在/data/data/目錄中刪除對應的安裝目錄
重新安裝,即可完成。

修復 dex 文件的原理 DexRepairTools
將 dex 文件頭部的兩個 Hash 值重新計算,然后寫回去。
① 先計算 SHA-1 值,修改值
② 再計算 CheckSum 值,修改值

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,946評論 25 709
  • 文件頭(File Header) Dex文件頭主要包括校驗和以及其他結構的偏移地址和長度信息。 字段名稱偏移值長度...
    朱立志閱讀 995評論 0 0
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,955評論 2 59
  • 四、幼兒認知的發(fā)展 1、記憶的發(fā)展 2、思維的發(fā)展 3、心理理論 四、幼兒認知的發(fā)展 1、記憶的發(fā)展 (1)記憶容...
    趙淇竹閱讀 1,734評論 0 1
  • 習慣了每天有你陪伴在身邊,可忽然有一天你轉身便要離開,我難過地抱著你哭。 你轉過身捧著我的臉深情地說道:“傻瓜,我...
    年槿悠閱讀 940評論 0 1

友情鏈接更多精彩內容