日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一篇文章带你搞懂 DEX 文件的结构

發(fā)布時(shí)間:2024/7/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇文章带你搞懂 DEX 文件的结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

From:https://blog.csdn.net/sinat_18268881/article/details/55832757

Dex文件格式詳解:https://www.jianshu.com/p/f7f0a712ddfe

dex文件解析(第三篇):https://blog.csdn.net/tabactivity/article/details/78950379

深入理解DEX文件格式( 有個(gè) Python 讀 dex 文件?):https://mybeibei.net/archives/1103

一文讀懂 DEX 文件格式解析:https://cloud.tencent.com/developer/article/1663852

Android逆向之旅—解析編譯之后的Dex文件格式:http://www.520monkey.com/archives/579

圖解Dex文件結(jié)構(gòu)及解析要點(diǎn):https://blog.csdn.net/beyond702/article/details/52460721

從 Android 運(yùn)行時(shí)出發(fā),打造我們的脫殼神器:https://blog.csdn.net/earbao/article/details/51516116

? ? ? ? ? ??http://www.droidsec.cn/從android運(yùn)行時(shí)出發(fā),打造我們的脫殼神器/

?

參考資料:《Android軟件安全與逆向分析》.非蟲

?

  • DexFile.h:https://www.androidos.net.cn/android/9.0.0_r8/xref/dalvik/libdex/DexFile.h
  • DexFile.cpp:https://www.androidos.net.cn/android/9.0.0_r8/xref/dalvik/libdex/DexFile.cpp
  • ?

    ?

    0x00■ ?構(gòu)造 DEX 文件

    ?

    什么是 dex 文件?

    DEX 文件就是 Android Dalvik 虛擬機(jī)運(yùn)行的程序,關(guān)于 DEX 文件的結(jié)構(gòu)的重要性我就不多說了。

    dex ?是 Android 系統(tǒng)的可執(zhí)行文件,包含應(yīng)用程序的全部操作指令以及運(yùn)行時(shí)數(shù)據(jù)。

    簡單的說,就是優(yōu)化后的 android版.exe。每個(gè)apk安裝包里都有。相對(duì)于PC上的 java 虛擬機(jī)能運(yùn)行.class;android上的 Davlik 虛擬機(jī)能運(yùn)行.dex。

    ?

    為何要研究 dex 格式 ?

    因?yàn)?dex 里面包含了所有 app 代碼,利用反編譯工具可以獲取 java 源碼。理解并修改 dex 文件,就能更好的 逆向?APK。

    由于dalvik是一種針對(duì)嵌入式設(shè)備而特殊設(shè)計(jì)的java虛擬機(jī),所以dex文件與標(biāo)準(zhǔn)的class文件在結(jié)構(gòu)設(shè)計(jì)上有著本質(zhì)的區(qū)別

    當(dāng) java 程序編譯成 class 后,還需要使用 dx 工具將所有的 class 文件整合到一個(gè) dex 文件,目的是其中各個(gè)類能夠共享數(shù)據(jù),在一定程度上降低了冗余,同時(shí)也是文件結(jié)構(gòu)更加經(jīng)湊,實(shí)驗(yàn)表明,dex 文件是傳統(tǒng) jar 文件大小的 50% 左右

    可以看見:dex 將原來 class 每個(gè)文件都有的共有信息合成一體,這樣減少了 class 的冗余

    數(shù)據(jù)結(jié)構(gòu)

    類型含義
    u1unit8_t,1字節(jié)無符號(hào)數(shù)
    u2unit16_t,2字節(jié)無符號(hào)數(shù)
    u4unit32_t,4字節(jié)無符號(hào)數(shù)
    u8unit64_t,8字節(jié)無符號(hào)數(shù)
    sleb128有符號(hào)LEB128,可變長度1~5
    uleb128無符號(hào)LEB128,
    uleb128p1無符號(hào)LEB128值加1,

    其中 u1~u8 很好理解,表示 1 到 8 個(gè)字節(jié)的無符號(hào)數(shù),后面三個(gè)是dex特有的數(shù)據(jù)類型,

    不理解的可以參考這里(?https://blog.csdn.net/zklth/article/details/7978362 )

    更詳細(xì)的參考:(深入到源碼解析leb128數(shù)據(jù)類型)[http://i.woblog.cn/2016/07/23/leb128-format/]

    ?

    下面開練。。。。。

    建議:不要只看,跟著做。看再多遍不如自己親自實(shí)踐一遍來的可靠,別問我為什么知道。淚崩ing.....

    下面會(huì)自己構(gòu)造一個(gè) dex 文件,因?yàn)樽约簶?gòu)造的比較簡單,分析起來比較容易。等你簡單的會(huì)了,難的自然也就懂了。

    首先,編寫一個(gè)簡單的 Java 程序,如下:

    public class HelloWorld { int a = 0; static String b = "HelloDalvik"; public int getNumber(int i, int j) { int e = 3; return e + i + j; } public static void main(String[] args) { int c = 1; int d = 2; HelloWorld helloWorld = new HelloWorld(); String sayNumber = String.valueOf(helloWorld.getNumber(c, d)); System.out.println("HelloDex!" + sayNumber); } }

    然后將其編譯成 dex 文件:打開命令行,進(jìn)入 HelloWorld.class 所在文件夾下,執(zhí)行命令:

    javac HelloWorld.java

    接下來會(huì)出現(xiàn)一個(gè)HelloWorld.class文件,然后繼續(xù)執(zhí)行命令( dx 工具需要安裝Android SDK才能有的工具 ):

    dx --dex --output=HelloWorld.dex HelloWorld.class

    就會(huì)出現(xiàn) HelloWorld.dex 文件了。

    在當(dāng)前工作路徑下 , 編譯方法如下 :

    1. 編譯成 java class 文件,執(zhí)行命令 : javac Hello.java? 。編譯完成后 ,目錄下生成 Hello.class 文件 。可以使用命令 java Hello 來測試下 ,會(huì)輸出代碼中的 “Hello, Android!” 的字符串 。

    2. 編譯成 dex 文件
    編譯工具在 Android SDK 的路徑如下 ,其中 19.0.1 是Android SDK build_tools 的版本 ,請(qǐng)按照在本地安裝的 build_tools 版本來 。建議該路徑加載到 PATH 路徑下 ,否則引用 dx 工具時(shí)需要使用絕對(duì)路徑 :./build-tools/19.0.1/dx
    執(zhí)行命令 :?dx –dex –output=Hello.dex Hello.class
    編譯正常會(huì)生成 Hello.dex 文件 。

    3. 使用 ADB 運(yùn)行測試
    ? ? ? ? 測試命令和輸出結(jié)果如下 :
    ? ? ? ? $ adb root
    ? ? ? ? $ adb push Hello.dex /sdcard/
    ? ? ? ? $ adb shell
    ? ? ? ? root@maguro:/ # dalvikvm -cp /sdcard/Hello.dex Hello

    4. 重要說明

    (1) 測試環(huán)境使用真機(jī)和 Android 虛擬機(jī)都可以的 。核心的命令是
    dalvikvm -cp /sdcard/Hello.dex Hello
    -cp 是 class path 的縮寫 ,后面的 Hello 是要運(yùn)行的 Class 的名稱 。網(wǎng)上有描述說輸入 dalvikvm –help
    可以看到 dalvikvm 的幫助文檔 ,但是在 Android4.4 的官方模擬器和自己的手機(jī)上測試都提示找不到
    Class 路徑 ,在Android 老的版本 ( 4.3 ) 上測試還是有輸出的 。

    (2) 因?yàn)槊钤趫?zhí)行時(shí) , dalvikvm 會(huì)在 /data/dalvik-cache/ 目錄下創(chuàng)建 .dex 文件 ,因此要求 ADB 的
    執(zhí)行 Shell 對(duì)目錄 /data/dalvik-cache/ 有讀、寫和執(zhí)行的權(quán)限 ,否則無法達(dá)到預(yù)期效果 。

    ?

    這時(shí),我們需要下載一個(gè)十六進(jìn)位文本編輯器,因?yàn)橛盟梢越馕龆M(jìn)制文件,我們用它打開 dex 文件就會(huì)全部以十六進(jìn)制的數(shù)進(jìn)行展現(xiàn)了。

    這里推薦 010Editor,下載地址:https://www.sweetscape.com/010editor/(收費(fèi)軟件,可以免費(fèi)試用30天)。

    下載完成之后,我們可以用它打開dex文件了,打開之后,你的界面應(yīng)該是這樣的:

    一下子看到這些東西,是不是立馬懵逼了,正常,我剛開始看的時(shí)候也是,這什么玩意兒啊!其實(shí),這就是二進(jìn)制流文件中的內(nèi)容,010Editor把它轉(zhuǎn)化成了16進(jìn)制的內(nèi)容,以方便我們閱讀的。

    ?

    ?

    0x01■ ?DEX文件結(jié)構(gòu)總覽

    ?

    一張圖搞懂dex

    ( 可以 右鍵 ---> 在新標(biāo)簽頁中打開圖片 ,就可以看清圖片)

    不要慌,下面我跟你解釋,這些東西我們雖然看了懵逼,但是 Dalvik 虛擬機(jī)不會(huì),因?yàn)樗褪墙馕鲞@些東西的,這些東西雖然看起來頭大,但是它是有自己的格式標(biāo)準(zhǔn)的。dex文件的結(jié)構(gòu)如下圖所示:

    這就是 dex 的文件格式了,下面我們從最上面的 Header 說起,Header 中存儲(chǔ)了什么內(nèi)容呢?下面我們還得來一張圖:

    從宏觀上來說 dex 的文件結(jié)果很簡單,實(shí)際上是由多個(gè)不同結(jié)構(gòu)的數(shù)據(jù)體以首尾相接的方式拼接而成。如下圖:

    數(shù)據(jù)名稱解釋
    headerdex文件頭部,記錄整個(gè)dex文件的相關(guān)屬性
    string_ids字符串?dāng)?shù)據(jù)索引,記錄了每個(gè)字符串在數(shù)據(jù)區(qū)的偏移量
    type_ids類似數(shù)據(jù)索引,記錄了每個(gè)類型的字符串索引
    proto_ids原型數(shù)據(jù)索引,記錄了方法聲明的字符串,返回類型字符串,參數(shù)列表
    field_ids字段數(shù)據(jù)索引,記錄了所屬類,類型以及方法名
    method_ids類方法索引,記錄方法所屬類名,方法聲明以及方法名等信息
    class_defs類定義數(shù)據(jù)索引,記錄指定類各類信息,包括接口,超類,類數(shù)據(jù)偏移量
    data數(shù)據(jù)區(qū),保存了各個(gè)類的真是數(shù)據(jù)
    link_data連接數(shù)據(jù)區(qū)

    /dalvik/libdex/DexFile.h? 定義如下:

    struct DexFile {const DexHeader* pHeader;const DexStringId* pStringIds;const DexTypeId* pTypeIds;const DexFieldId* pFieldIds;const DexMethodId* pMethodIds;const DexProtoId* pProtoIds;const DexClassDef* pClassDefs;const DexLink* pLinkData; }

    注意:其中一些定義的字段是在內(nèi)存中并沒有存到真實(shí)的 dex 文件中

    header 簡單記錄了dex文件的一些基本信息,以及大致的數(shù)據(jù)分布。長度固定為0x70,其中每一項(xiàng)信息所占用的內(nèi)存空間也是固定的,好處是虛擬機(jī)在處理 dex 時(shí)不用考慮 dex 文件的多樣性

    字段名稱偏移值長度說明
    magic0x08魔數(shù)字段,值為"dex\n035\0"
    checksum0x84校驗(yàn)碼
    signature0xc20sha-1簽名
    file_size0x204dex文件總長度
    header_size0x244文件頭長度,009版本=0x5c,035版本=0x70
    endian_tag0x284標(biāo)示字節(jié)順序的常量
    link_size0x2c4鏈接段的大小,如果為0就是靜態(tài)鏈接
    link_off0x304鏈接段的開始位置
    map_off0x344map數(shù)據(jù)基址
    string_ids_size0x384字符串列表中字符串個(gè)數(shù)
    string_ids_off0x3c4字符串列表基址
    type_ids_size0x404類列表里的類型個(gè)數(shù)
    type_ids_off0x444類列表基址
    proto_ids_size0x484原型列表里面的原型個(gè)數(shù)
    proto_ids_off0x4c4原型列表基址
    field_ids_size0x504字段個(gè)數(shù)
    field_ids_off0x544字段列表基址
    method_ids_size0x584方法個(gè)數(shù)
    method_ids_off0x5c4方法列表基址
    class_defs_size0x604類定義標(biāo)中類的個(gè)數(shù)
    class_defs_off0x644類定義列表基址
    data_size0x684數(shù)據(jù)段的大小,必須4k對(duì)齊
    data_off0x6c4數(shù)據(jù)段基址

    /dalvik/libdex/DexFile.h? 定義如下:

    struct DexHeader {u1 magic[8]; /* includes version number */u4 checksum; /* adler32 checksum */u1 signature[kSHA1DigestLen]; /* SHA-1 hash */u4 fileSize; /* length of entire file */u4 headerSize; /* offset to start of next section */u4 endianTag;u4 linkSize;u4 linkOff;u4 mapOff;u4 stringIdsSize;u4 stringIdsOff;u4 typeIdsSize;u4 typeIdsOff;u4 protoIdsSize;u4 protoIdsOff;u4 fieldIdsSize;u4 fieldIdsOff;u4 methodIdsSize;u4 methodIdsOff;u4 classDefsSize;u4 classDefsOff;u4 dataSize;u4 dataOff; };

    我們可以用:hexdump -c classes.dex 查看 dex 單字節(jié)顯示的結(jié)果,如下:

    0000000 d e x \n 0 3 5 \0 022 217 ? w z ? 031 221 0000010 ? \f ? ? ? ? ? ? 217 235 200 z ? 030 I ? 0000020 ? 003 \0 \0 p \0 \0 \0 x V 4 022 \0 \0 \0 \0 0000030 \0 \0 \0 \0 ? 002 \0 \0 024 \0 \0 \0 p \0 \0 \0 0000040 \b \0 \0 \0 ? \0 \0 \0 005 \0 \0 \0 ? \0 \0 \0 0000050 001 \0 \0 \0 034 001 \0 \0 005 \0 \0 \0 $ 001 \0 \0 0000060 001 \0 \0 \0 L 001 \0 \0 8 002 \0 \0 l 001 \0 \0 0000070 l 001 \0 \0 t 001 \0 \0 201 001 \0 \0 204 001 \0 \0 0000080 222 001 \0 \0 226 001 \0 \0 ? 001 \0 \0 ? 001 \0 \0 0000090 ? 001 \0 \0 ? 001 \0 \0 004 002 \0 \0 \a 002 \0 \0 00000a0 \v 002 \0 \0 002 \0 \0 ( 002 \0 \0 . 002 \0 \0 00000b0 4 002 \0 \0 9 002 \0 \0 B 002 \0 \0 L 002 \0 \0 00000c0 003 \0 \0 \0 005 \0 \0 \0 006 \0 \0 \0 \a \0 \0 \0 00000d0 \b \0 \0 \0 \t \0 \0 \0 \n \0 \0 \0 \f \0 \0 \0 00000e0 002 \0 \0 \0 003 \0 \0 \0 \0 \0 \0 \0 004 \0 \0 \0 00000f0 004 \0 \0 \0 x 002 \0 \0 \n \0 \0 \0 006 \0 \0 \0 0000100 \0 \0 \0 \0 \v \0 \0 \0 006 \0 \0 \0 x 002 \0 \0 0000110 \v \0 \0 \0 006 \0 \0 \0 p 002 \0 \0 005 \0 001 \0 0000120 020 \0 \0 \0 \0 \0 004 \0 017 \0 \0 \0 001 \0 003 \0 0000130 021 \0 \0 \0 004 \0 002 \0 \0 \0 \0 \0 004 \0 001 \0 0000140 \r \0 \0 \0 004 \0 \0 \0 022 \0 \0 \0 \0 \0 \0 \0 0000150 001 \0 \0 \0 002 \0 \0 \0 \0 \0 \0 \0 ? ? ? ? 0000160 \0 \0 \0 \0 ? 002 \0 \0 \0 \0 \0 \0 006 < i n 0000170 i t > \0 \v H e l l o W o r l d 0000180 \0 001 L \0 \f L H e l l o W o r l d 0000190 ; \0 002 L L \0 025 L j a v a / i o / 00001a0 P r i n t S t r e a m ; \0 022 L j 00001b0 a v a / l a n g / O b j e c t ; 00001c0 \0 022 L j a v a / l a n g / S t r 00001d0 i n g ; \0 031 L j a v a / l a n g 00001e0 / S t r i n g B u i l d e r ; \0 00001f0 022 L j a v a / l a n g / S y s t 0000200 e m ; \0 001 V \0 002 V L \0 023 [ L j a 0000210 v a / l a n g / S t r i n g ; \0 0000220 006 a p p e n d \0 004 a r g s \0 004 m 0000230 a i n \0 003 o u t \0 \a p r i n t l 0000240 n \0 \b t o S t r i n g \0 016 ? ? 231 0000250 ? 230 ? ? ? 200 ? ? ? ? 211 213 ? 206 231 ? 0000260 232 204 s m a l i ? ? 236 ? ? 213 \0 \0 \0 0000270 001 \0 \0 \0 \a \0 \0 \0 001 \0 \0 \0 003 \0 \0 \0 0000280 \0 \0 \0 \0 \0 \0 \0 \0 \0 001 017 \a \0 \0 \0 \0 0000290 \v \0 001 \0 002 \0 \0 \0 210 002 \0 \0 ( \0 \0 \0 00002a0 b \0 \0 \0 \0 \0 \0 \0 \0 \0 022 2 023 003 ? ? 00002b0 030 004 \0 \0 001 \0 \0 \0 \0 \0 034 005 003 \0 001 & 00002c0 " \a 004 \0 p 020 002 \0 \a \0 032 \b 023 \0 n 00002d0 003 \0 207 \0 \f \a n 020 004 \0 \a \0 \f \t n 00002e0 001 \0 220 \0 032 001 001 \0 n 001 \0 020 \0 016 \0 00002f0 \0 \0 001 \0 \0 \t 220 005 016 \0 \0 \0 \0 \0 \0 \0 0000300 001 \0 \0 \0 \0 \0 \0 \0 001 \0 \0 \0 024 \0 \0 \0 0000310 p \0 \0 \0 002 \0 \0 \0 \b \0 \0 \0 ? \0 \0 \0 0000320 003 \0 \0 \0 005 \0 \0 \0 ? \0 \0 \0 004 \0 \0 \0 0000330 001 \0 \0 \0 034 001 \0 \0 005 \0 \0 \0 005 \0 \0 \0 0000340 $ 001 \0 \0 006 \0 \0 \0 001 \0 \0 \0 L 001 \0 \0 0000350 002 \0 \0 024 \0 \0 \0 l 001 \0 \0 001 020 \0 \0 0000360 002 \0 \0 \0 p 002 \0 \0 003 020 \0 \0 002 \0 \0 \0 0000370 200 002 \0 \0 003 \0 \0 001 \0 \0 \0 210 002 \0 \0 0000380 001 \0 \0 001 \0 \0 \0 220 002 \0 \0 \0 \0 \0 0000390 001 \0 \0 \0 ? 002 \0 \0 \0 020 \0 \0 001 \0 \0 \0 00003a0 ? 002 \0 \0 00003a4

    還可以用 -C 顯示 16 進(jìn)制 和 ASCII碼:hexdump -C classes.dex

    00000000 64 65 78 0a 30 33 35 00 12 8f b1 77 7a e9 19 91 |dex.035....wz...| 00000010 f2 0c ff ce a0 ce aa cd 8f 9d 80 7a ac 18 49 bf |...........z..I.| 00000020 a4 03 00 00 70 00 00 00 78 56 34 12 00 00 00 00 |....p...xV4.....| 00000030 00 00 00 00 f8 02 00 00 14 00 00 00 70 00 00 00 |............p...| 00000040 08 00 00 00 c0 00 00 00 05 00 00 00 e0 00 00 00 |................| 00000050 01 00 00 00 1c 01 00 00 05 00 00 00 24 01 00 00 |............$...| 00000060 01 00 00 00 4c 01 00 00 38 02 00 00 6c 01 00 00 |....L...8...l...| 00000070 6c 01 00 00 74 01 00 00 81 01 00 00 84 01 00 00 |l...t...........| 00000080 92 01 00 00 96 01 00 00 ad 01 00 00 c1 01 00 00 |................| 00000090 d5 01 00 00 f0 01 00 00 04 02 00 00 07 02 00 00 |................| 000000a0 0b 02 00 00 20 02 00 00 28 02 00 00 2e 02 00 00 |.... ...(.......| 000000b0 34 02 00 00 39 02 00 00 42 02 00 00 4c 02 00 00 |4...9...B...L...| 000000c0 03 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 |................| 000000d0 08 00 00 00 09 00 00 00 0a 00 00 00 0c 00 00 00 |................| 000000e0 02 00 00 00 03 00 00 00 00 00 00 00 04 00 00 00 |................| 000000f0 04 00 00 00 78 02 00 00 0a 00 00 00 06 00 00 00 |....x...........| 00000100 00 00 00 00 0b 00 00 00 06 00 00 00 78 02 00 00 |............x...| 00000110 0b 00 00 00 06 00 00 00 70 02 00 00 05 00 01 00 |........p.......| 00000120 10 00 00 00 00 00 04 00 0f 00 00 00 01 00 03 00 |................| 00000130 11 00 00 00 04 00 02 00 00 00 00 00 04 00 01 00 |................| 00000140 0d 00 00 00 04 00 00 00 12 00 00 00 00 00 00 00 |................| 00000150 01 00 00 00 02 00 00 00 00 00 00 00 ff ff ff ff |................| 00000160 00 00 00 00 f0 02 00 00 00 00 00 00 06 3c 69 6e |.............<in| 00000170 69 74 3e 00 0b 48 65 6c 6c 6f 20 57 6f 72 6c 64 |it>..Hello World| 00000180 00 01 4c 00 0c 4c 48 65 6c 6c 6f 57 6f 72 6c 64 |..L..LHelloWorld| 00000190 3b 00 02 4c 4c 00 15 4c 6a 61 76 61 2f 69 6f 2f |;..LL..Ljava/io/| 000001a0 50 72 69 6e 74 53 74 72 65 61 6d 3b 00 12 4c 6a |PrintStream;..Lj| 000001b0 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b |ava/lang/Object;| 000001c0 00 12 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 |..Ljava/lang/Str| 000001d0 69 6e 67 3b 00 19 4c 6a 61 76 61 2f 6c 61 6e 67 |ing;..Ljava/lang| 000001e0 2f 53 74 72 69 6e 67 42 75 69 6c 64 65 72 3b 00 |/StringBuilder;.| 000001f0 12 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 |.Ljava/lang/Syst| 00000200 65 6d 3b 00 01 56 00 02 56 4c 00 13 5b 4c 6a 61 |em;..V..VL..[Lja| 00000210 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 00 |va/lang/String;.| 00000220 06 61 70 70 65 6e 64 00 04 61 72 67 73 00 04 6d |.append..args..m| 00000230 61 69 6e 00 03 6f 75 74 00 07 70 72 69 6e 74 6c |ain..out..printl| 00000240 6e 00 08 74 6f 53 74 72 69 6e 67 00 0e e8 bf 99 |n..toString.....| 00000250 e6 98 af e4 b8 80 e4 b8 aa e6 89 8b e5 86 99 e7 |................| 00000260 9a 84 73 6d 61 6c 69 e5 ae 9e e4 be 8b 00 00 00 |..smali.........| 00000270 01 00 00 00 07 00 00 00 01 00 00 00 03 00 00 00 |................| 00000280 00 00 00 00 00 00 00 00 00 01 0f 07 00 00 00 00 |................| 00000290 0b 00 01 00 02 00 00 00 88 02 00 00 28 00 00 00 |............(...| 000002a0 62 00 00 00 00 00 00 00 00 00 12 32 13 03 ff ff |b..........2....| 000002b0 18 04 00 00 01 00 00 00 00 00 1c 05 03 00 01 26 |...............&| 000002c0 22 07 04 00 70 10 02 00 07 00 1a 08 13 00 6e 20 |"...p.........n | 000002d0 03 00 87 00 0c 07 6e 10 04 00 07 00 0c 09 6e 20 |......n.......n | 000002e0 01 00 90 00 1a 01 01 00 6e 20 01 00 10 00 0e 00 |........n ......| 000002f0 00 00 01 00 00 09 90 05 0e 00 00 00 00 00 00 00 |................| 00000300 01 00 00 00 00 00 00 00 01 00 00 00 14 00 00 00 |................| 00000310 70 00 00 00 02 00 00 00 08 00 00 00 c0 00 00 00 |p...............| 00000320 03 00 00 00 05 00 00 00 e0 00 00 00 04 00 00 00 |................| 00000330 01 00 00 00 1c 01 00 00 05 00 00 00 05 00 00 00 |................| 00000340 24 01 00 00 06 00 00 00 01 00 00 00 4c 01 00 00 |$...........L...| 00000350 02 20 00 00 14 00 00 00 6c 01 00 00 01 10 00 00 |. ......l.......| 00000360 02 00 00 00 70 02 00 00 03 10 00 00 02 00 00 00 |....p...........| 00000370 80 02 00 00 03 20 00 00 01 00 00 00 88 02 00 00 |..... ..........| 00000380 01 20 00 00 01 00 00 00 90 02 00 00 00 20 00 00 |. ........... ..| 00000390 01 00 00 00 f0 02 00 00 00 10 00 00 01 00 00 00 |................| 000003a0 f8 02 00 00 |....| 000003a4

    ?

    ?

    0x02■ ?DEX文件結(jié)構(gòu)解析

    先看下就行,不用著急,下面我們一步一步來,首先點(diǎn)擊你的010Editor的這里:

    對(duì),就是箭頭指的那里,點(diǎn)擊之后,你會(huì)發(fā)現(xiàn)上面的有一片區(qū)域成了選中的顏色,這部分里面存儲(chǔ)的就是Header中的數(shù)據(jù)了,下面我們根據(jù)Header的數(shù)據(jù)圖以此來進(jìn)行分析。

    首先,我們看到DexHeader中每個(gè)數(shù)據(jù)前面有個(gè)u1或者u4,這個(gè)是什么意思呢?它們其實(shí)就是代表1個(gè)或者4個(gè)字節(jié)的無符號(hào)數(shù)。下面我們依次根據(jù)Header中的數(shù)據(jù)段進(jìn)行解釋。

    ?

    1. 從第一個(gè)看起,magic[8];它代表dex中的文件標(biāo)識(shí),一般被稱為魔數(shù)。是用來識(shí)別dex這種文件的,它可以判斷當(dāng)前的dex文件是否有效,可以看到它用了8個(gè)1字節(jié)的無符號(hào)數(shù)來表示,我們?cè)?10Editor中可以看到也就是“64 65 78 0A 30 33 35 00 ”這8個(gè)字節(jié),這些字節(jié)都是用16進(jìn)制表示的,用16進(jìn)制表示的話,兩個(gè)數(shù)代表一個(gè)字節(jié)(一個(gè)字節(jié)等于8位,一個(gè)16進(jìn)制的數(shù)能表示4位)。這8個(gè)字節(jié)用ASCII碼表轉(zhuǎn)化一下可以轉(zhuǎn)化為:dex.035(點(diǎn)擊這里可以進(jìn)行十六進(jìn)制轉(zhuǎn)ASCII,你可以試試:其中,'.' 不是轉(zhuǎn)化來的)。目前,dex的魔數(shù)固定為dex.035。

    ?

    2.?第二個(gè)是,checksum; ?它是dex文件的校驗(yàn)和,通過它可以判斷dex文件是否被損壞或者被篡改。它占用4個(gè)字節(jié),也就是“5D 9D F9 59”。這里提醒一下,在010Editor中,其實(shí)可以分別識(shí)別我們?cè)贒exHeader中看到的這些字段的,你可以點(diǎn)一下這里:

    你可以看到這個(gè)header列表展開了,其實(shí)我們分析下來就和它這個(gè)結(jié)構(gòu)是一樣的,你可以先看下,我們現(xiàn)在分析到了checksum中了,你可以看到后面對(duì)應(yīng)的值是“59 F9 9D 5D”。咦?這好像和上面的字節(jié)不是一一對(duì)應(yīng)的啊。對(duì)的,你可以發(fā)現(xiàn)它是反著寫的。這是由于dex文件中采用的是小字節(jié)序的編碼方式,也就是低位上存儲(chǔ)的就是低字節(jié)內(nèi)容,所以它們應(yīng)該要反一下。

    ?

    3.?第三個(gè)到了 signature[kSHA1DigestLen] 了,signature字段用于檢驗(yàn)dex文件,其實(shí)就是把整個(gè)dex文件用SHA-1簽名得到的一個(gè)值。這里占用20個(gè)字節(jié),你可以自己點(diǎn)010Editor看一看。

    ?

    4.?第四個(gè) fileSize ;表示整個(gè)文件的大小,占用4個(gè)字節(jié)。

    ?

    5.?第五個(gè) headerSize ;表示 DexHeader 頭結(jié)構(gòu)的大小,占用4個(gè)字節(jié)。

    可以看到它一共占用了112個(gè)字節(jié),112對(duì)應(yīng)的16進(jìn)制數(shù)為70h。

    ?

    ?6. 第6個(gè)是 endianTag ;代表 字節(jié)序標(biāo)記,用于指定dex運(yùn)行環(huán)境的cpu,預(yù)設(shè)值為0x12345678,對(duì)應(yīng)在101Editor中為“78 56 34 12”(小字節(jié)序)。

    ?

    7.?接下來兩個(gè)分別是 linkSize 和 u4 ?linkOff ;這兩個(gè)字段,它們分別指定了鏈接段的大小和文件偏移,通常情況下它們都為0。linkSize 為 0 的話表示靜態(tài)鏈接。

    ?

    8.?再下來就是 mapOff 字段了,它指定了DexMapList的文件偏移,這里我們先不過多介紹它,你可以看一下它的值為“14 04 00 00”,它其實(shí)對(duì)應(yīng)的16進(jìn)制數(shù)就是414h(別忘了小字節(jié)序),我們可以在414h的位置看一下它在哪里:

    其實(shí)就是dex文件最后一部分內(nèi)容。關(guān)于這部分內(nèi)容里面是什么,我們先不說,繼續(xù)往下看。

    ?

    9.?stringIdsSize stringIdsOff 字段:這兩個(gè)字段指定了dex文件中所有用到的字符串的個(gè)數(shù)和位置偏移,我們先看stringIdsSize,它的值為:“1C 00 00 00”,16進(jìn)制的1C也就是十進(jìn)制的28,也就是說我們這個(gè)dex文件中一共有28個(gè)字符串,然后stringIdsOff為:“70 00 00 00”,代表字符串的偏移位置為70h,這下我們找到70h的地方:

    這下我們就要先介紹一下DexStringId這個(gè)結(jié)構(gòu)了,圖中從70h開始,所有被選中的都是DexStringId這種數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,DexStringId代表的是字符串的位置偏移,每個(gè)DexStringId占用4個(gè)字節(jié),也就是說它里面存的還不是真正的字符串,它們只是存儲(chǔ)了真正字符串的偏移位置。

    下面我們先分析幾個(gè)看看,

    ① 取第一個(gè)“B2 02 00 00”,它代表的位置偏移是2B2h,我們先找到這個(gè)位置: ? ?

    可以發(fā)現(xiàn)我一共選中了10個(gè)字節(jié),這10個(gè)字節(jié)就表示了一個(gè)字符串。下面我們看一下dex文件中的字符串是如何表示的。dex中的字符串采用了一種叫做MUTF-8這樣的編碼,它是經(jīng)過傳統(tǒng)的UTF-8編碼修改的。在MTUF-8中,它的頭部存放的是由uleb128編碼的字符的個(gè)數(shù)。(至于uleb128編碼是什么編碼,這里我不詳細(xì)展開說,有興趣的可以搜索看看。)

    也就是說在“08 3C 63 6C 69 6E 69 74 3E 00”這些字節(jié)中,第一個(gè)08指定的是后面需要用到的編碼的個(gè)數(shù),也就是8個(gè),即“ 3C 63 6C 69 6E 69 74 3E”這8個(gè),但是我們?yōu)槭裁匆还策x中了10個(gè)字節(jié)呢,因?yàn)樽詈笠粋€(gè)空字符“0”表示的是字符串的結(jié)尾,字符個(gè)數(shù)沒有把它算進(jìn)去。下面我們來看看“ 3C 63 6C 69 6E 69 74 3E”這8個(gè)字符代表了什么字符串:

    依舊可以點(diǎn)這里查詢ASCII (?http://www.ab126.com/goju/1711.html )。(要說明的一點(diǎn)是,這里湊巧這幾個(gè)uleb128編碼的字符都用了1個(gè)字節(jié),所以我們可以這樣進(jìn)行查詢,uleb128編碼標(biāo)準(zhǔn)用的是1~5個(gè)字節(jié), 這里只是恰好都是一個(gè)字節(jié))。也就是說上面的70h開始的第一個(gè)DexStringId指向的其實(shí)是字符串“<clinit>”(但是貌似我們的代碼中沒有用到這個(gè)字符串啊,先不用管,我們接著分析)。再看到這里:

    ② 剛剛我們分析到“B2 02 00 00”所指向的真實(shí)字符串了,下面我們接著再分析一個(gè),我們直接分析第三個(gè),不分析第二個(gè)了。第三個(gè)為“C4 02 00 00”,對(duì)應(yīng)的位置也就是2C4h,我們找到它:

    看這里,這就是2C4h的位置了。我們首先看第一個(gè)字符,它的值為0Bh,也就是十進(jìn)制的11,也就是說接下來的11個(gè)字符代表了它的字符串,我們依舊是查看接下來11個(gè)字符代表的是什么,經(jīng)過查詢整理: ??

    依舊可以點(diǎn)這里查詢ASCII (?http://www.ab126.com/goju/1711.html )。上面就是“HelloDalvik”這個(gè)字符串,可以看看我們的代碼,我們確實(shí)用了一個(gè)這樣的字符串,bingo。下面剩下的字符串就不分析了。經(jīng)過整理,可以整理出我們一共用到的28個(gè)字符串為:

    ok,字符串這里告一段落,下面我們繼續(xù)看DexHeader的下面的字段。頭好暈~乎乎

    ?噢,讀了,還不能結(jié)束呢,你現(xiàn)在可以看一下最開始發(fā)的那張dex結(jié)構(gòu)圖了:

    看到了吧,我們這半天分析的stringIdsSize 和 stringIdsOff字段指向的位置就是上面那個(gè)箭頭指向的位置,它們里面存儲(chǔ)的是真實(shí)字符串的位置偏移,它們都存儲(chǔ)在data區(qū)域。(先透露一下,后面我們要分析的幾個(gè)也和stringIdsSize 與stringIdsOff字段類似,它們里面存儲(chǔ)的基本都是位置偏移,并不是真正的數(shù)據(jù),真正的數(shù)據(jù)都在data區(qū)域)

    好,我們繼續(xù)。

    ?

    10. 繼續(xù)看DexHeader圖,我們現(xiàn)在該typeIdsSizetypeIdsOff了。它們代表什么呢?它們代表的是類的類型的數(shù)量和位置偏移,也是都占4個(gè)字節(jié),下面我們看它們的值

    可以看到,typeIdsSize的值為9h,也就是我們dex文件中用到的類的類型一共有9個(gè),位置偏移在E0h位置,下面我們找到這個(gè)位置

    看到了吧,我選中的位置就是了。這里我們又得介紹一種數(shù)據(jù)結(jié)構(gòu)了,因?yàn)檫@里的數(shù)據(jù)也是一種數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)組成的。那就是DexTypeId,也就是說選中的內(nèi)容都是DexTypeId這種數(shù)據(jù),這種數(shù)據(jù)結(jié)構(gòu)中只有一個(gè)變量,如下所示:

    struct DexTypeId{u4 descriptorIdx; /*指向DexStringId列表的索引*/ }

    看到了吧,這就是DexTypeId數(shù)據(jù)結(jié)構(gòu),它里面只有一個(gè)數(shù)據(jù)descriptorIdx,它的值的內(nèi)容是DexStringId列表的索引。還記得DexStringId是什么嗎?在上面我們分析字符串時(shí),字符串的偏移位置就是由DexStringId這種數(shù)據(jù)結(jié)構(gòu)描述的,也就是說descriptorIdx指向的是所有的DexStringId組成的列表的索引。上面我們整理出了所有的字符串,你可以翻上去看看圖。然后我們看這里一共是9個(gè)類的類型代表的都是什么。先看第一個(gè)“05 00 00 00”,也就是05h,即十進(jìn)位的5。然后我們?cè)谏厦嫠姓沓龅淖址纯?索引的是什么?翻上去可以看到是“I”。接下來我們依次整理這些類的類型,也可以得到類的類型的列表

    看到了吧,這就是我們dex文件中所有用到的類的類型。比如“I”代表的就是int,LHelloWorld代表的就是HelloWorld,Ljava/io/PrintStream代表的就是java.io.PrintStream。后面的幾個(gè)先就不說了。我們接著往下分析。

    ?

    11. 這下到了protoIdsSizeprotoIdsOff了,它們代表的是dex文件中方法原型的個(gè)數(shù)和位置偏移。我們先看它們的值

    如上圖就是它們的值了,protoIdsSize的值為十進(jìn)制的7,說明有7個(gè)方法原型,然后位置偏移為104h,我們找到這個(gè)位置

    看到了吧,這里就是了。對(duì),下面又有新的數(shù)據(jù)結(jié)構(gòu)了。這下一個(gè)數(shù)據(jù)結(jié)構(gòu)不能滿足這塊的內(nèi)容了,我們先看第一個(gè)數(shù)據(jù)結(jié)構(gòu),DexProtoId

    struct DexProtoId{u4 shortyIdx; /*指向DexStringId列表的索引*/u4 returnTypeIdx; /*指向DexTypeId列表的索引*/u4 parametersOff; /*指向DexTypeList的位置偏移*/ }

    可以看到,這個(gè)數(shù)據(jù)結(jié)構(gòu)由三個(gè)變量組成。第一個(gè)shortyIdx它指向的是我們上面分析的DexStringId列表的索引,代表的是方法聲明字符串。第二個(gè)returnTypeIdx它指向的是 我們上邊分析的DexTypeId列表的索引,代表的是方法返回類型字符串。第三個(gè)parametersOff指向的是DexTypeList的位置索引,這又是一個(gè)新的數(shù)據(jù)結(jié)構(gòu)了,先說一下這里面 存儲(chǔ)的是方法的參數(shù)列表。可以看到這三個(gè)參數(shù),有方法聲明字符串,有返回類型,有方法的參數(shù)列表,這基本上就確定了我們一個(gè)方法的大體內(nèi)容。

    我們接著看看DexTypeList這個(gè)數(shù)據(jù)結(jié)構(gòu),看看參數(shù)列表是如何存儲(chǔ)的。

    struct DexTypeList{u4 size; /*DexTypeItem的個(gè)數(shù)*/DexTypeItem list[1]; /*DexTypeItem結(jié)構(gòu)*/ }

    看到了嘛,它有兩個(gè)參數(shù),其中第一個(gè)size說的是DexTypeItem的個(gè)數(shù),那DexTypeItem又是啥咧?它又是一種數(shù)據(jù)結(jié)構(gòu)。我們繼續(xù)看看

    struct DexTypeItem{u2 typeIdx; /*指向DexTypeId列表的索引*/ }

    恩,還好,里面就一個(gè)參數(shù)。也比較簡單,就是一個(gè)指向DexTypeId列表的索引,也就是代表參數(shù)列表中某一個(gè)具體的參數(shù)的位置。

    分析完這幾個(gè)數(shù)據(jù)結(jié)構(gòu)了,下面我們具體地分析一個(gè)類吧。別走神,我們?cè)搹纳蠄D的104h開始了。

    在104h這里,由于 都是DexProtoId這種數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù),一個(gè)DexProtoId一共占用12個(gè)字節(jié)。所以,我們?nèi)∏?2個(gè)字節(jié)進(jìn)行分析。“06 00 00 00,00 00 00 00,94 02 00 00”,這就是那12個(gè)字節(jié)了。首先“06 00 00 00”代表的是shortyIdx,它的值是指向DexStringId列表的索引,我們找到DexStringId列表中第6個(gè)對(duì)應(yīng)的值,也就是III,說明這個(gè)方法中聲明字符串為三個(gè)int。接著,“00 00 00 00”代表的是returnTypeIdx,它的值指向的是DexTypeId列表的索引,我們找到對(duì)應(yīng)的值,也就是I,說明這個(gè)方法的返回值是int類型的。最后,我們看“94 02 00 00”,它代表的是DexTypeList的位置偏移,它的值為294h,我們找到這個(gè)位置

    這里是DexTypeList結(jié)構(gòu),首先看前4個(gè)字節(jié),代表的是DexTypeItem的個(gè)數(shù),“02 00 00 00 ”也就是2,說明接下來有2個(gè)DexTypeItem的數(shù)據(jù),每個(gè)DexTypeItem占用2個(gè)字節(jié),也就是兩個(gè)都是“00 00”,它們的值是DexTypeId列表的索引,我們?nèi)フ乙幌?#xff0c;發(fā)現(xiàn)0對(duì)應(yīng)的是I,也就是說它的兩個(gè)參數(shù)都是int型的。因此這個(gè)方法的聲明我們也就確定了。也就是int(int,int),可以看看我們的源代碼,getNumber方法確實(shí)是這樣的。好,第一個(gè)方法就這樣分析完了,下面我們依舊是將這些方法的聲明整理成列表,后面可能有數(shù)據(jù)會(huì)指向它們的索引。

    終于又完了一個(gè)。我們準(zhǔn)備繼續(xù)下面的。累了就先去聽聽歌吧,歇一歇再看 -_-

    ?

    12.?fieldIdsSizefieldIdsOff字段。這兩個(gè)字段指向的是dex文件中字段名的信息。我們看到這里

    可以看到,fieldIdsSize為3h,說明共有3個(gè)字段。fieldIdsOff為158h,說明偏移為158h,我們繼續(xù)看到158h這里

    咳咳,又該新的數(shù)據(jù)結(jié)構(gòu)了,再忍一忍,接下來的數(shù)據(jù)結(jié)構(gòu)是DexFieldId,我們看下

    struct DexFieldId{u2 classIdx; /*類的類型,指向DexTypeId列表的索引*/u2 typeIdx; /*字段類型,指向DexTypeId列表的索引*/u4 nameIdx; /*字段名,指向DexStringId列表的索引*/ }

    可以看到,這三個(gè)數(shù)據(jù)都是指向的索引值,具體的就不說了,看后面的備注就是。我們依舊是分析一下第一個(gè)字段,“01 00 ,00 00,13 00 00 00”,類的類型為DexTypeId列表的索引1,也就是HelloWorld,字段的類型為DexTypeId列表中的索引0,也就是int,字段名為DexStringId列表中的索引13h,即十進(jìn)制的19,找一下,是a,也就是說我們這個(gè)字段就確認(rèn)了,即int HelloWorld.a。這不就是我們?cè)贖elloWorld.java文件里定義的變量a嘛。然后我們依次把我們所有的3個(gè)字段都列出來:

    〇int HelloWorld.a , ①java.lang.String HelloWorld.b ,②java.io.PrintStream java.lang.System.out

    ok,先告一段落。繼續(xù)分析下一個(gè)

    ?

    13.?methodIdsSizemethodIdsOff字段。這倆字段指明了方法所在的類、方法的聲明以及方法名。我們看看

    先是,methodIdsSize,為Ah,即十進(jìn)制的10,說明共有10個(gè)方法。methodIdsOff,為170h,說明它們的位置偏移在170h。我們看到這里

    對(duì)對(duì)對(duì),又是新的數(shù)據(jù)結(jié)構(gòu),不過這個(gè)和上個(gè)一樣簡單,請(qǐng)看DexMethodId

    struct DexMethodId{u2 classIdx; /*類的類型,指向DexTypeId列表的索引*/u2 protoIdx; /*聲明類型,指向DexProtoId列表的索引*/u4 nameIdx; /*方法名,指向DexStringId列表的索引*/ }

    對(duì)吧,這個(gè)也簡單,三個(gè)數(shù)據(jù)也都是指向?qū)?yīng)的結(jié)構(gòu)的索引值。我們直接分析一下第一個(gè)數(shù)據(jù),“01 00, 04 00, 00 00 00 00”,首先,classIdx,為1,對(duì)應(yīng)DexTypeId列表的索引1,也就是HelloWorld;其次,protoIdx,為4,對(duì)應(yīng)DexProtoId列表中的索引4,也就是void();最后,nameIdx,為0,對(duì)應(yīng)DexStringId列表中的索引0,也就是<clinit>。因此,第一個(gè)數(shù)據(jù)就出來了,即void HelloWorld.<clinit>() 。后面的不進(jìn)行分析了,我們依舊是把其余的9個(gè)方法列出來

    好了,這個(gè)就算分析完了。下面真正開始我們的重頭戲了。先緩一緩再繼續(xù)吧。

    ?

    14.?classDefsSizeclassDefsOff字段。這兩個(gè)字段指明的是dex文件中類的定義的相關(guān)信息。我們先找到它們的位置。

    classDefsSize字段,為1,也就是只有一個(gè)類定義,classDefsOff,為1C0h,我們找到它的偏移位置。

    這里就是了,到了這里,你現(xiàn)在應(yīng)該也知道又有新的數(shù)據(jù)結(jié)構(gòu)了。對(duì)的,接下來的數(shù)據(jù)結(jié)構(gòu)是DexClassDef,請(qǐng)看

    struct DexClassDef{u4 classIdx; /*類的類型,指向DexTypeId列表的索引*/u4 accessFlags; /*訪問標(biāo)志*/u4 superclassIdx; /*父類類型,指向DexTypeId列表的索引*/u4 interfacesOff; /*接口,指向DexTypeList的偏移*/u4 sourceFileIdx; /*源文件名,指向DexStringId列表的索引*/u4 annotationsOff; /*注解,指向DexAnnotationsDirectoryItem結(jié)構(gòu)*/u4 classDataOff; /*指向DexClassData結(jié)構(gòu)的偏移*/u4 staticValuesOff; /*指向DexEncodedArray結(jié)構(gòu)的偏移*/ }

    不多說了,我們直接根據(jù)結(jié)構(gòu)開始分析吧,反正就只有一個(gè)類定義。classIdx為1,對(duì)應(yīng)DexTypeId列表的索引1,找到是HelloWorld,確實(shí)是我們?cè)闯绦蛑械念惖念愋汀ccessFlags為1,它是類的訪問標(biāo)志,對(duì)應(yīng)的值是一個(gè)以ACC_開頭的枚舉值,1對(duì)應(yīng)的是 ACC_PUBLIC,你可以在010Editor中看一下,說明我們的類是public的。superclassIdx的值為3,找到DexTypeId列表中的索引3,對(duì)應(yīng)的是java.lang.object,說明我們的類的父類類型是Object的。interfaceOff指向的是DexTypeList結(jié)構(gòu),我們這里是0說明沒有接口。如果有接口的話直接對(duì)應(yīng)到DexTypeList,就和之前我們分析的一樣了,這里不多解釋,有興趣的可以寫一個(gè)有接口的類驗(yàn)證下。再下來sourceFileIdx指向的是DexStringId列表的索引,代表源文件名,我們這里位4,找一下對(duì)應(yīng)到了字符串"HelloWorld.java",說明我們類程序的源文件名為HelloWorld.java。annotationsOff字段指向注解目錄接口,根據(jù)類型不同會(huì)有注解類、注解方法、注解字段與注解參數(shù),我們這里的值為0,說明沒有注解,這里也不過多解釋,有興趣可以自己試試。

    接下來是classDataOff了,它指向的是DexClassData結(jié)構(gòu)的位置偏移,DexClassData中存儲(chǔ)的是類的數(shù)據(jù)部分,我們開始詳細(xì)分析一下它,首先,還是先找到偏移位置3F8h

    接著,我們看看DexClassData數(shù)據(jù)結(jié)構(gòu)

    struct DexClassData{DexClassDataHeader header; /*指定字段與方法的個(gè)數(shù)*/DexField* staticFields; /*靜態(tài)字段,DexField結(jié)構(gòu)*/DexField* instanceFields; /*實(shí)例字段,DexField結(jié)構(gòu)*/DexMethod* directMethods; /*直接方法,DexMethod結(jié)構(gòu)*/DexMethod* virtualMethods; /*虛方法,DexMethod結(jié)構(gòu)*/ }

    可以看到,在DexClassData結(jié)構(gòu)中又引入了三種結(jié)構(gòu),我們一起寫出來看一下吧

    struct DexClassDataHeader{u4 staticFieldsSize; /*靜態(tài)字段個(gè)數(shù)*/u4 instanceFieldsSize; /*實(shí)例字段個(gè)數(shù)*/u4 directMethodsSize; /*直接方法個(gè)數(shù)*/u4 virtualMethodsSize; /*虛方法個(gè)數(shù)*/ }struct DexField{u4 fieldIdx; /*指向DexFieldId的索引*/u4 accessFlags; /*訪問標(biāo)志*/ }struct DexMethod{u4 methodIdx; /*指向DexMethodId的索引*/u4 accessFlags; /*訪問標(biāo)志*/u4 codeOff; /*指向DexCode結(jié)構(gòu)的偏移*/ }/*指向DexFieldId的索引*/u4 accessFlags; /*訪問標(biāo)志*/ }struct DexMethod{u4 methodIdx; /*指向DexMethodId的索引*/u4 accessFlags; /*訪問標(biāo)志*/u4 codeOff; /*指向DexCode結(jié)構(gòu)的偏移*/ }

    代碼中的注釋寫的也都很清楚了,我們就不多說了。但是請(qǐng)注意,在這些結(jié)構(gòu)中的u4不是指的占用4個(gè)字節(jié),而是指它們是uleb128類型(占用1~5個(gè)字節(jié))的數(shù)據(jù)。關(guān)于uleb128還是不多說,想了解的可以自己查查看。

    好,接下來開始分析,對(duì)于DexClassData,第一個(gè)為DexClassDataHeader,我們找到相應(yīng)的位置,第一個(gè)staticFieldsSize其實(shí)只占用了一個(gè)字節(jié),即01h就是它的值,也就是說共有一個(gè)靜態(tài)字段,接下來instanceFieldsSize,directMethodsSize,virtualMethodsSize也都是只占用了一個(gè)字節(jié),即實(shí)例字段的個(gè)數(shù)為1,直接方法的個(gè)數(shù)為3,虛方法的個(gè)數(shù)為1。(這里只是湊巧它們幾個(gè)都占用一個(gè)字節(jié),并不一定是只占用一個(gè)字節(jié),這關(guān)于到uleb128數(shù)據(jù)類型,具體可以自己了解下)。

    然后接下來就是staticFields了,它對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)為DexField,可以看到,第一個(gè)fieldIdx,是指向DexFieldId的索引,值為1,找到對(duì)應(yīng)的索引值為java.lang.String HelloWorld.b。第二個(gè)accessFlags,值為8,對(duì)應(yīng)的ACC_開頭的數(shù)據(jù)為ACC_STATIC(可以在010Editor中對(duì)應(yīng)查看一下),說明我們這個(gè)靜態(tài)字段為:static java.lang.String HelloWorld.b。可以對(duì)應(yīng)我們的源代碼看一下,我們確實(shí)定義了一個(gè)static的b變量。

    接著看instanceFields,它和staticFields對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)是一樣的,我們直接分析,第一個(gè)fieldIdx,值為0,對(duì)應(yīng)的DexField的索引值為int HelloWorld.a。第二個(gè)accessFlags,值為0,對(duì)應(yīng)的ACC_開頭的數(shù)據(jù)為空,就是什么也沒有。說明我們這個(gè)實(shí)例字段為:int HelloWorld.a。可以對(duì)應(yīng)我們的源碼 看看,我們確實(shí)定義了一個(gè)a實(shí)例變量。

    再接著,根據(jù)directMethodsSize,有3個(gè)直接方法,我們先看第一個(gè),它對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)是DexMethod,首先methodIdx指向的是DexMethodId的索引,值為0,找到對(duì)應(yīng)的索引值為void HelloWorld.<clinit>()。然后accessFlages為......為......為....我的個(gè)天!我以為就這樣能蒙混過關(guān)了,沒想到還真碰到一個(gè)uleb128數(shù)據(jù)不是占用一個(gè)字節(jié)的,這個(gè)accessFlags對(duì)應(yīng)的值占用了三個(gè)字節(jié),“88 80 04”,為什么?因?yàn)槭前凑誹leb128格式的數(shù)據(jù)讀出來的(還是自己去查查吧,這個(gè)坑先不填了,其實(shí)這種數(shù)據(jù)也不麻煩,就是前面字節(jié)上的最高位指定了是否需要下一個(gè)字節(jié)上的內(nèi)容)。“88 80 04”對(duì)應(yīng)的ACC_開頭的數(shù)據(jù)為 ACC_STATIC ACC_CONSTRUCTOR,表明這個(gè)方法是靜態(tài)的,并且是構(gòu)造方法。最后,看看codeOff,它對(duì)應(yīng)了DexCode結(jié)構(gòu)的偏移,DexCode中存放了方法的指令集等信息,也就是真正的代碼了。我們暫且不分析DexCode,就先看看它的偏移位置為“E0 03”,這個(gè)等于多少呢?uleb128轉(zhuǎn)化為16進(jìn)制數(shù)結(jié)果為:1E0h。也就是DexCode存放在偏移位置1E0h的位置上。

    具體的DexCode我們就先不分析了,因?yàn)樗锩娲娣诺囊恍┲噶罹中枰鶕?jù)相關(guān)資料一一查找,有興趣的自己可以找資料看看。剩下的兩個(gè)直接方法我們也不分析了。

    接下來,我們看根據(jù)virtualMethodsSize,有1個(gè)虛方法,我們直接看。首先methodIdx的值為2,對(duì)應(yīng)的DexMethodId的索引值為int HelloWorld.getNumber(int, int)。然后accessFlags為1,對(duì)應(yīng)的值為ACC_PUBLIC,表明這是一個(gè)public類。codeOff為“FC 04”,對(duì)應(yīng)的位置為27Ch,這里就不上圖了,自己找找吧。

    好了,我們整個(gè)DEX文件的結(jié)構(gòu)就這樣從DexHeader開始基本分析完了,好累啊,不過這樣分析一遍,對(duì)DEX文件的格式會(huì)有更深刻的認(rèn)識(shí)。總是看別人的真不如自己來一遍來的實(shí)在!

    ?

    ?

    0x03■ ?參考資料


    參考資料:

    《Android軟件安全與逆向分析》.非蟲

    ?

    ?

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的一篇文章带你搞懂 DEX 文件的结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    日韩中文字幕免费在线播放 | 美女精品在线观看 | 精品久久久久久久久亚洲 | 中文字幕在线看人 | 婷婷六月天在线 | 日韩特黄一级欧美毛片特黄 | 国产成人精品一区二区三区福利 | 欧洲高潮三级做爰 | 国产精品99精品 | 一区二区理论片 | 五月婷婷综合激情网 | 婷婷精品进入 | 成人午夜精品 | 国产中文字幕国产 | 99久在线精品99re8热视频 | 96精品视频 | 99精品黄色片免费大全 | 不卡视频一区二区三区 | 欧美精品天堂 | 精品国产理论片 | 久久久久久久久久久综合 | 午夜视频在线观看欧美 | 五月天色中色 | 91一区二区三区在线观看 | 国产二区视频在线观看 | 手机av片| 亚洲视频,欧洲视频 | 亚洲午夜精品一区二区三区电影院 | 国产视频久久 | 日韩中出在线 | 97精品国产aⅴ | 黄色www | 九九热1| 国内精品久久影院 | 国内丰满少妇猛烈精品播 | 天天操天天射天天插 | 国产又黄又猛又粗 | 婷婷色资源 | 国产成人精品一区二区三区网站观看 | 狠狠干2018 | 日本久久免费电影 | 丰满少妇在线观看网站 | 国产精品免费视频久久久 | 中文在线资源 | 午夜视频色 | 天堂久久电影网 | 欧美一级片在线播放 | 91精品区| 日韩精品欧美视频 | 四虎成人精品永久免费av | 日本精品在线 | 天天综合操 | va视频在线 | 在线直播av | 中国一级片在线观看 | 亚洲国产高清视频 | 婷婷久久丁香 | 亚洲精品乱码久久久久久按摩 | 黄色小说网站在线 | 天天干天天搞天天射 | 国产成人精品一区二区三区福利 | 久久精品三级 | 欧美激情精品久久久久久免费印度 | 国产午夜精品免费一区二区三区视频 | 中文字幕888| 国产高清精 | 丝袜美女在线 | 中文字幕xxxx | 欧美一区二区日韩一区二区 | 正在播放 久久 | 999视频在线播放 | 又黄又爽又色无遮挡免费 | 国产精品美女久久久久久网站 | 丁香激情综合 | 国产福利a | 亚洲高清在线精品 | 激情五月播播久久久精品 | 麻豆视频免费入口 | 欧美日韩中 | 极品久久久久久久 | 九九热精品视频在线观看 | 成人午夜影院在线观看 | 激情综合网五月 | 天天综合网在线 | 国产成人免费精品 | 欧美夫妻生活视频 | av中文字幕在线观看网站 | 81精品国产乱码久久久久久 | 成人三级av | 国产区免费 | 国产成人精品综合 | 欧美另类tv | 337p欧美 | 亚洲精品黄色片 | 欧美日韩一区二区三区免费视频 | 伊人首页 | 干综合网 | 九九免费在线视频 | 国产第一福利 | 免费在线观看不卡av | 免费观看国产视频 | 五月开心六月伊人色婷婷 | 国产探花| 正在播放 国产精品 | 五月丁香 | 日韩精品视频免费 | 久久99精品久久久久婷婷 | 四虎国产免费 | 天天爱天天舔 | 高清美女视频 | 在线免费观看黄网站 | 色综久久 | 日本在线观看一区二区 | 国产小视频91 | 亚洲va综合va国产va中文 | 国产麻豆精品在线观看 | 亚洲成人在线免费 | 色偷偷网站视频 | www.神马久久 | 四虎在线观看视频 | 国产在线毛片 | 99久久网站 | 久久婷婷精品视频 | 极品国产91在线网站 | 激情五月在线观看 | 免费av看片| 玖玖999| 91在线国产观看 | 天天艹天天 | adc在线观看 | 日韩电影一区二区三区在线观看 | 亚洲国产综合在线 | 久草在线视频首页 | 亚洲一区美女视频在线观看免费 | 亚洲精品在线观看av | 在线久草视频 | 婷婷 综合 色 | 亚洲午夜精品久久久久久久久 | 久草国产在线 | 91毛片视频| 日韩免费在线播放 | 成在人线av | 一本一道久久a久久精品蜜桃 | 97精品视频在线播放 | 日韩大片在线播放 | 伊人久久影视 | 色婷婷av在线 | 亚洲成人av电影 | 激情影音 | 免费观看91 | 永久免费的av电影 | www.eeuss影院av撸| 久久精品国产99 | 麻豆av一区二区三区在线观看 | 久久精品五月 | 久久精品国产免费看久久精品 | 中文电影网 | 在线视频 你懂得 | 一级黄视频| 久草青青在线观看 | www夜夜操| 中字幕视频在线永久在线观看免费 | 久久久综合色 | 久久高清精品 | 国产在线观看a | 色天天 | 国产精品入口麻豆www | 亚洲精品久久久久www | 亚洲免费专区 | 日韩av一区二区三区四区 | 综合色综合色 | 久久婷婷精品视频 | 国产日韩欧美视频在线观看 | 亚洲高清不卡av | 肉色欧美久久久久久久免费看 | 成片视频免费观看 | 91免费视频网站在线观看 | 免费黄色看片 | 日韩精品中文字幕久久臀 | 国产欧美日韩一区 | 婷婷四房综合激情五月 | 亚洲小视频在线 | 欧美视频一区二 | 国产精品自在欧美一区 | 97在线视频网站 | 91av网址 | 久久婷婷国产 | 夜夜爱av | 色开心| 精品亚洲国产视频 | 韩国精品视频在线观看 | 久久久91精品国产一区二区精品 | 美女免费视频一区 | 日本中文字幕系列 | av电影av在线 | 视频一区视频二区在线观看 | 精品电影一区二区 | 九九99 | 国产一区不卡在线 | 天堂av影院 | 国产精品一级在线 | 成片人卡1卡2卡3手机免费看 | 天天干天天玩天天操 | 精品一区精品二区高清 | 久久久99国产精品免费 | 日本在线视频一区二区三区 | 97超碰国产精品女人人人爽 | 国产97在线观看 | 91高清免费| 日韩视频在线不卡 | 久草网在线视频 | 一色av | 成人一区二区三区在线观看 | 成人91在线 | 亚洲欧洲一区二区在线观看 | 色婷婷 亚洲 | 欧美久久久久久久久 | 久久综合久久八八 | 99r精品视频在线观看 | 国产无遮挡猛进猛出免费软件 | 国产成人a亚洲精品v | 天天做综合网 | a视频免费| 不卡视频一区二区三区 | 五月天综合在线 | 色姑娘综合网 | 久久精品欧美 | 国产一级二级在线播放 | 九九电影在线 | 亚洲精品在线视频观看 | 欧美午夜精品久久久久久浪潮 | 成年人视频免费在线 | 国产黄在线播放 | 免费裸体视频网 | 国产999 | 麻豆精品传媒视频 | 中文字幕亚洲欧美 | 97超碰超碰久久福利超碰 | 国产美腿白丝袜足在线av | 一级黄色免费网站 | 国产成人精品久久久 | 天堂在线视频中文网 | 日韩电影中文字幕在线 | 999久久国产精品免费观看网站 | 免费看的黄色的网站 | 激情久久久久久久久久久久久久久久 | 日日碰狠狠添天天爽超碰97久久 | 久久成人人人人精品欧 | 国产一级免费视频 | 国产视频一区二区在线播放 | 日韩免费视频一区二区 | 亚洲国产剧情av | 中文字幕欧美激情 | 国产一区二区久久久久 | 全黄网站 | 国产女人18毛片水真多18精品 | 欧美在线一 | 国产一区视频免费在线观看 | 综合在线色 | 国产精品久久久久久久99 | 国产精品99蜜臀久久不卡二区 | 91看片麻豆 | 在线一二三区 | 精品国产片 | 五月视频 | 国产综合久久 | 毛片网站在线观看 | 日本不卡一区二区三区在线观看 | 欧美一性一交一乱 | 麻花传媒mv免费观看 | 91麻豆国产| av大全在线 | 日日干网| 天天干天天操天天操 | 久久精品久久精品久久精品 | www亚洲国产 | 亚洲少妇xxxx | 久久午夜影视 | 激情久久小说 | 午夜精品久久久 | 99精品视频在线免费观看 | 在线视频 一区二区 | 精品人人人 | 欧美福利片在线观看 | 欧美日韩三区二区 | 成人免费影院 | 射久久久| 成人禁用看黄a在线 | 99精品国产一区二区三区不卡 | 亚洲精品视频在线观看免费视频 | 成人永久在线 | 中文字幕制服丝袜av久久 | a黄色一级片 | 视频在线观看亚洲 | 国产精品自产拍在线观看网站 | 欧美精品一区二区三区四区在线 | 伊人国产在线播放 | 亚洲一二三区精品 | 九九电影在线 | 成人免费观看电影 | 伊人久久av | 久久99免费 | 婷婷六月网 | 97在线观看免费 | 久久这里只精品 | 婷婷激情影院 | 日韩欧美国产视频 | 99夜色| 九九免费在线观看视频 | 久久99久久99精品中文字幕 | 久久999久久 | 中文字幕亚洲精品日韩 | 亚洲国产成人精品电影在线观看 | 精品一区二区电影 | 天天草天天操 | 久久精品在线免费观看 | 亚洲国产免费看 | 久久久久久久网 | www.超碰 | 国内精品久久久久久久久久清纯 | 欧美一级免费黄色片 | 国产精品一区二区三区观看 | 人人澡人人爱 | 操一草 | 国产精品久久久久久久久久了 | 99草在线视频 | 国产96在线视频 | 免费看国产曰批40分钟 | 精品欧美一区二区精品久久 | 国产精品综合久久 | 激情久久久久久久久久久久久久久久 | 五月开心婷婷网 | 丁香婷婷综合网 | 色网站免费在线看 | 日韩爱爱片 | 欧美日本一区 | 日韩高清在线一区二区 | 欧洲av在线 | 欧美色综合天天久久综合精品 | 国产一区在线视频观看 | 成人在线电影观看 | 一级a毛片高清视频 | 亚洲综合色丁香婷婷六月图片 | 国产精品免费高清 | 五月婷婷中文网 | 一色屋精品视频在线观看 | 国产999视频在线观看 | 国产精品久久久久婷婷 | 麻豆传媒视频观看 | 国产色视频一区二区三区qq号 | 国产剧情一区二区在线观看 | 免费av成人在线 | 成年人免费电影在线观看 | 欧美成人播放 | 国产999精品久久久久久绿帽 | 国产精品青草综合久久久久99 | 久久久精品在线观看 | 久久精选 | 精品久久网站 | 久久久久国产一区二区三区四区 | 久久国产一二区 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产精品乱码久久久久久1区2区 | 日批在线观看 | 精品久久久久亚洲 | 免费看一级 | 国产精品久久久久久久久久久不卡 | 天天操夜夜叫 | 欧美人人爱 | 亚洲精品乱码久久久久久写真 | 亚洲国产中文在线观看 | 久久9999久久 | 美女视频黄频大全免费 | 午夜91在线| 久久9视频 | 欧美一级黄色片 | 性色大片在线观看 | 久久久久99精品成人片三人毛片 | 97超碰在线久草超碰在线观看 | 日韩字幕在线 | 99人成在线观看视频 | 亚洲人成影院在线 | 中文字幕一二 | 国产在线va| 在线99热 | 精品久久久久久久久久岛国gif | 久久精品一区二区三区四区 | www.五月激情.com | 免费看成人a| 久久久激情视频 | 天天射天天爽 | 免费黄色av片 | 国产成人一区二区三区影院在线 | 国产男女爽爽爽免费视频 | 在线观看视频97 | 亚洲精品乱码久久久久v最新版 | 欧美久久久久 | 麻豆传媒在线视频 | 国产成人精品一二三区 | 久久草 | 手机成人av | 中文字幕一区二区三 | 色婷婷狠 | 国产精品免费观看网站 | 波多在线视频 | 国产成人99av超碰超爽 | 欧美日韩在线网站 | 欧美日韩国产精品久久 | 亚洲婷婷综合色高清在线 | 毛片黄色一级 | 性色大片在线观看 | 奇米网777 | 国产精品电影一区 | 国产精品成人av在线 | 99热在线免费观看 | 色婷婷av一区二 | 超碰免费97 | 久久影视中文字幕 | 一级黄色片毛片 | 成人av中文字幕 | 久久经典国产视频 | 国产精品久久久久一区二区 | 一本一道久久a久久精品蜜桃 | 一区三区在线欧 | 亚州欧美精品 | 国内小视频在线观看 | 欧美 日韩 性 | 久久视频在线观看免费 | 国际av在线| 国产午夜三级一区二区三桃花影视 | 久久免费观看少妇a级毛片 久久久久成人免费 | 最新动作电影 | 日韩欧美高清一区二区 | 国产精品99久久久久久小说 | 成人av观看 | 欧美成年黄网站色视频 | 粉嫩高清一区二区三区 | 国内一级片在线观看 | 亚洲综合婷婷 | 国产精品国产三级国产aⅴ无密码 | 国产麻豆剧果冻传媒视频播放量 | 日韩av片无码一区二区不卡电影 | 国产精品久久久久亚洲影视 | 在线精品亚洲一区二区 | 999精品视频| 欧美大片第1页 | 日韩精品一区二区三区在线视频 | 色狠狠综合| 特级西西www44高清大胆图片 | 亚洲男女精品 | 色噜噜日韩精品一区二区三区视频 | 欧美a级成人淫片免费看 | 五月综合婷 | 亚洲精品国产精品国自产在线 | 日本电影久久 | 亚洲黄网址| 亚洲五月激情 | 国产精品欧美一区二区 | 久久久久www | 久久免费看视频 | 亚洲精品免费观看视频 | 免费看色的网站 | 91av资源网 | 国产精品久久久久久久免费大片 | 欧美激情一区不卡 | 国产在线毛片 | 97精品超碰一区二区三区 | 国产日韩欧美视频 | 三级在线播放视频 | 欧美a级在线 | 久久久免费电影 | 九九一级片 | 国产精品人人做人人爽人人添 | 久久精品波多野结衣 | 久草免费在线视频 | 国产手机视频在线播放 | 国产精品久久久久久久久久久不卡 | 国产一级黄色av | 久久久久国产精品厨房 | 五月天中文字幕 | 天天操操操操操 | www免费看片com | 国产亚洲精品成人av久久ww | 97精品视频在线播放 | 日韩av成人在线观看 | 99精品视频在线看 | 最新国产在线观看 | 在线成人一区二区 | 中文永久字幕 | 久久免费成人精品视频 | 91桃色在线观看视频 | 亚洲2019精品 | av手机版| 久久人人爽视频 | 久久99久久99精品中文字幕 | www欧美色 | 手机av电影在线观看 | 少妇视频在线播放 | 亚洲免费av在线播放 | 亚洲春色成人 | 国产伦精品一区二区三区四区视频 | 最近中文字幕视频网 | 黄色网址中文字幕 | 久黄色 | 亚洲国产精品成人女人久久 | 夜夜爽88888免费视频4848 | 国产精品免费久久久久 | 国产一级视频在线免费观看 | 亚洲免费婷婷 | 91在线免费观看国产 | 天天干,天天干 | 成人影片免费 | 中文字幕在线观看第二页 | 中文字幕免费中文 | 午夜免费视频网站 | 黄色av大片 | 天天久久夜夜 | 欧美aa在线 | 91插插影库 | 狠狠躁夜夜躁人人爽超碰91 | 国产精品久久在线观看 | 国产一区欧美二区 | 久久香蕉国产精品麻豆粉嫩av | 久久欧美综合 | 少妇搡bbbb搡bbb搡忠贞 | 97在线视频免费播放 | 精品一区二三区 | 97在线观看视频免费 | 久久久久久久久久久久久影院 | 99精品视频在线观看 | 夜夜爽天天爽 | 天天操天天操天天操天天 | 高清一区二区 | 亚洲一级影院 | av888av.com| 香蕉蜜桃视频 | 中文字幕av影院 | 久久综合狠狠综合久久综合88 | 日日碰狠狠添天天爽超碰97久久 | 99视频在线观看一区三区 | 免费看v片网站 | 国产精品久久久久久久久久 | 国产色小视频 | 最近日韩中文字幕中文 | 欧美夫妻生活视频 | 日韩精品1区2区 | 天堂在线免费视频 | 婷婷网站天天婷婷网站 | 天天操天天添 | 亚洲成人精品在线 | 亚洲高清av在线 | 天天操天天操天天操天天操天天操 | 首页av在线 | 色干综合| 亚洲视频免费视频 | 久草在线免费在线观看 | 色播五月婷婷 | www.国产毛片| 激情丁香婷婷 | 2018好看的中文在线观看 | 黄色免费电影网站 | 偷拍精品一区二区三区 | 欧美亚洲一区二区在线 | 精品99在线观看 | 中文字幕在线观看你懂的 | 91网站在线视频 | 亚洲精品美女在线观看 | 日本精品一区二区在线观看 | 欧美一区二区三区四区夜夜大片 | 日韩午夜网站 | 国产香蕉视频 | 欧美精品网站 | 国语麻豆 | 久久久综合九色合综国产精品 | 欧美一级特黄aaaaaa大片在线观看 | 国产一区自拍视频 | 在线你懂 | 国产专区第一页 | 草樱av| www91在线 | 欧美日韩精品在线观看视频 | 精品久久久久国产免费第一页 | 24小时日本在线www免费的 | 中文字幕之中文字幕 | 国产精品成人一区 | 激情五月看片 | 国产美女免费视频 | 久久伦理 | 黄色毛片电影 | 天天草综合网 | 婷婷在线色 | 日韩一二三在线 | 国产第一页精品 | 国产黄在线 | 国产亚洲精品久久久久动 | 91精品国自产在线观看欧美 | 日韩精品中文字幕在线 | 亚洲精品视频免费观看 | 亚洲成免费| 九九免费观看全部免费视频 | 国内视频在线观看 | 国产精品99久久久久久大便 | 成年人精品 | 午夜精品久久久久久久久久久久 | 精品中文字幕视频 | 亚洲精品久久久久久久不卡四虎 | 久久精品91视频 | 欧美日韩精品在线观看 | 日本性视频 | 久久久久在线观看 | 欧美日韩国产综合一区二区 | 视频在线观看亚洲 | 久草香蕉在线 | 国产精品亚洲精品 | 中文字幕av电影下载 | 国产免费不卡 | 国产成人精品在线观看 | 日韩电影一区二区三区 | 国产福利在线不卡 | 免费中文字幕视频 | 日韩在线不卡av | 尤物九九久久国产精品的分类 | 国产色视频网站 | 精品美女视频 | 日韩av在线免费播放 | 国产一区二区在线免费 | 97爱 | 国产免费观看高清完整版 | 日韩午夜在线 | 欧美福利片在线观看 | 伊人伊成久久人综合网站 | 亚洲 欧美日韩 国产 中文 | 亚洲成人黄色在线观看 | 成人免费影院 | 久久国语 | 亚洲成人av一区二区 | 91亚洲精品久久久蜜桃网站 | 天天干,天天操 | 97电影在线看视频 | av资源网在线播放 | 亚洲精品网页 | 日本中文字幕在线电影 | 亚洲丝袜中文 | 天堂在线一区二区三区 | 日韩中文字幕亚洲一区二区va在线 | 人人插人人 | 99热这里是精品 | 中文永久字幕 | 午夜在线观看 | 99精品视频精品精品视频 | 免费观看一级成人毛片 | 插综合网 | 日韩高清 一区 | 欧美了一区在线观看 | 色婷婷狠狠五月综合天色拍 | 国产欧美综合在线观看 | 欧美日韩一二三四区 | 国产精品porn | 手机av观看 | 国产视频999| 美女视频久久黄 | 99视频在线精品 | 伊人伊成久久人综合网站 | 国产精品97| 午夜视频在线观看一区二区 | 日日成人网 | 91精品视频在线观看免费 | 久久99热精品 | 国产成人免费精品 | 国产日韩中文字幕 | 国产精品欧美久久 | 中文字幕在线乱 | 超碰日韩 | 国产69精品久久久久久久久久 | 成人h动漫精品一区二 | 国产精品入口传媒 | 狠狠色丁香久久综合网 | 国产三级久久久 | 国产精品24小时在线观看 | 成人av片在线观看 | 天天摸天天操天天爽 | 亚洲综合成人婷婷小说 | 亚洲精品黄色在线观看 | 婷婷丁香社区 | 丰满少妇在线观看 | 久久99久久99精品免观看软件 | 97精品欧美91久久久久久 | 国产青青青 | 久久99久久久久 | 久草在线视频首页 | 国产免费观看久久黄 | 丁香婷婷综合网 | 久久成人一区 | 97热久久免费频精品99 | 最新国产一区二区三区 | 天天爽夜夜爽精品视频婷婷 | 久在线观看视频 | 成年人在线观看免费视频 | 亚洲精品1区2区3区 超碰成人网 | 午夜精品99久久免费 | 欧美精品三级 | 日本中文字幕在线一区 | 黄a在线看 | 欧美一级大片在线观看 | 亚洲精品美女在线 | 久草在线手机观看 | 中文字幕999 | 麻豆视频在线免费看 | 成人久久久电影 | 久要激情网 | 中文字幕免费一区二区 | av大片免费在线观看 | 欧美成人精品欧美一级乱黄 | 国产精品久久久久久a | 人人插人人插 | 色噜噜狠狠狠狠色综合久不 | 免费看的黄色的网站 | 国产高清视频在线播放一区 | 亚洲精品在 | 一级欧美黄 | 午夜精品视频免费在线观看 | 成人一区二区三区在线观看 | 国产黄色精品在线 | 久久精品资源 | 色综合久久五月天 | 久久精品中文字幕一区二区三区 | 亚洲国产日韩一区 | 亚州av网站大全 | 久草视频网 | 久久成人一区二区 | 综合网伊人 | 亚洲精品视频偷拍 | 欧美日视频 | 色97在线 | 91视频xxxx| 西西44人体做爰大胆视频 | 综合天天色 | 国产视频 亚洲视频 | 亚洲综合成人婷婷小说 | av免费电影网站 | 久久精品久久精品 | 五月天六月丁香 | 亚洲区另类春色综合小说校园片 | 久草视频免费看 | 国产黄色大片 | 精品一区二区在线看 | 999超碰| 国产精品成人av久久 | wwwww.国产 | 夜色.com| 成人福利在线观看 | 成人午夜免费福利 | 婷婷综合久久 | 免费在线视频一区二区 | 99久久综合国产精品二区 | 国产精品高潮呻吟久久av无 | 国产一区电影在线观看 | 能在线观看的日韩av | 国产精品久久久久久久午夜片 | 国产精品门事件 | 91精品国自产在线观看 | 在线免费精品视频 | 911香蕉视频 | 国产精品一区在线观看 | 免费高清av在线看 | 日韩黄色一级电影 | 69国产成人综合久久精品欧美 | 18久久久久| www.福利视频 | 午夜国产影院 | 国产一级做a爱片久久毛片a | 又黄又爽又刺激的视频 | 国产精品免费观看国产网曝瓜 | 国产一区二区在线免费 | 亚洲国产成人精品在线观看 | 天天操天天怕 | 欧美性生活久久 | 婷婷在线不卡 | 国产视频 久久久 | 日本精品一区二区在线观看 | 99久久精品免费看国产四区 | 一区二区亚洲精品 | 在线观看av片| 色综合色综合久久综合频道88 | 久久天天操 | 亚洲精品视频一二三 | 欧美极品久久 | 美女福利视频一区二区 | av中文字幕网 | 色吊丝在线永久观看最新版本 | 欧美精品久久久久久久久久 | 天天透天天插 | 欧美一区二区三区在线 | 天天操狠狠操夜夜操 | 免费国产在线精品 | av电影不卡 | 天天操天天干天天玩 | 日韩精品一区二区三区水蜜桃 | 国产精品黄色 | 国产精品99久久免费黑人 | 色网站在线免费观看 | 国产精品久久久久永久免费观看 | 一级免费看视频 | 中文字幕一区2区3区 | 国产精品美女久久久久aⅴ 干干夜夜 | 日韩在线视频免费播放 | 91看片成人| 国内久久视频 | 日韩精品国产一区 | 在线看成人 | 伊人天天综合 | 欧美国产日韩一区二区三区 | 亚洲国产中文字幕在线观看 | 国产视频二区三区 | 国产精品激情偷乱一区二区∴ | www五月天婷婷 | 999热线在线观看 | www99精品 | av大全免费在线观看 | 在线日韩视频 | 91色吧 | 精品一区精品二区高清 | 精品在线小视频 | 视频在线观看国产 | 尤物一区二区三区 | 在线视频 国产 日韩 | 三级黄色在线 | 成人在线视频免费 | 欧美在线观看视频免费 | 国产视频九色蝌蚪 | 六月丁香在线视频 | 黄色成人影视 | 中文字幕欧美日韩va免费视频 | 国产91成人在在线播放 | 黄色三级网站 | 在线欧美日韩 | 蜜臀av夜夜澡人人爽人人 | 99久久精品电影 | 日韩在线观看电影 | 久久伦理影院 | 国产aaa免费视频 | 免费成人结看片 | 亚洲免费av电影 | 黄色av一级 | 黄色视屏免费在线观看 | 久久久久在线视频 | 亚洲www天堂com | 五月婷婷六月综合 | 婷婷国产视频 | 久久综合综合久久综合 | 一区二区 不卡 | 精品视频资源站 | 蜜臀久久99精品久久久酒店新书 | 中文资源在线观看 | 日韩影片在线观看 | 成人高清在线 | 日韩一区二区三免费高清在线观看 | 成人一级在线 | a色网站| 成人丁香花 | 黄色一级片视频 | 亚洲a网 | 天堂av影院| 色吊丝在线永久观看最新版本 | 国产小视频国产精品 | 在线观看日韩国产 | 日韩欧美在线综合网 | 久久综合9988久久爱 | 国内三级在线观看 | 日本精品视频免费观看 | 五月色丁香 | 久久首页 | 久久高清免费观看 | 欧美日韩免费视频 | 日韩黄色一区 | 97精品国产97久久久久久春色 | 91av电影在线观看 | 97超碰人人| 日韩国产精品一区 | 在线观看麻豆av | 天天操天天色天天射 | 怡红院av久久久久久久 | 69欧美视频 | 成人一级黄色片 | 五月天亚洲婷婷 | 亚洲一区二区观看 | 免费男女网站 | 日韩视频在线不卡 | 手机看国产毛片 | 久久综合色影院 | 日韩一区在线免费观看 | 免费亚洲成人 | 日韩中文字幕电影 | 91一区一区三区 | 日本久久久久久久久 | 五月婷婷视频在线观看 | 日批在线观看 | 久久综合色影院 | 亚洲精品在线电影 | 911亚洲精品第一 | 高清av网| 国产精品视频免费在线观看 | 一级性视频 | 九九热.com| 国产成人av电影在线观看 | 美女免费网视频 | 欧美精品午夜 | 在线观看国产成人av片 | 91丨九色丨勾搭 | 国产精品久久久网站 | 黄色片网站 | 国产伦精品一区二区三区在线 | 999久久久免费视频 午夜国产在线观看 | 久久狠狠亚洲综合 | 一本—道久久a久久精品蜜桃 | 久产久精国产品 | 亚洲 欧美日韩 国产 中文 | 日韩色爱 | 九九久久久久久久久激情 | 东方av免费在线观看 | 久久伊人精品天天 | 久久精品视频免费播放 | 在线观看免费观看在线91 | 久久在线视频精品 | 中国一级片在线观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 天天摸天天操天天舔 | 在线激情小视频 | 天天摸夜夜操 | 欧美色图狠狠干 | 午夜色性片 | 国产96av | 亚洲午夜精品久久久 | 久久人人添人人爽添人人88v | 草久在线播放 | 成年人免费电影 | 日本高清久久久 | 欧美精品久久久久久久久免 | 亚洲黄色影院 | 亚洲人成人天堂h久久 | 激情黄色一级片 | 一区二区三区在线观看免费 | 91中文字幕永久在线 | 天天色棕合合合合合合 | 日韩欧美视频免费观看 | 91av九色| 亚洲国产视频直播 | 欧美日韩精品电影 | 亚洲精品在线免费看 | 日韩在线观看视频免费 | 国产精品久久久久久久久久白浆 | 日韩在线一区二区免费 | 亚洲免费av一区二区 | 国产高清视频免费最新在线 | 在线观看精品国产 | 欧美日韩在线视频观看 | 国产高清综合 | 亚洲精品一区二区三区在线观看 | 欧美日韩高清国产 | www.夜夜骑.com | 久久黄色网页 | www久久精品 | 999久久久免费视频 午夜国产在线观看 | 日p在线观看 | 激情五月在线视频 | av一区二区三区在线观看 | 91人人爽人人爽人人精88v | 黄色99视频 | 中文字幕永久 | 亚洲精品一区二区三区高潮 | 国产精品一区二区三区在线看 | 国产对白av| 99热这里只有精品国产首页 | 国产成人久久精品亚洲 | 在线黄色国产 | 在线亚洲精品 | 51久久夜色精品国产麻豆 | 国产成人精品午夜在线播放 | 国产精品久久久久久久久毛片 | 蜜臀av免费一区二区三区 | 精品久久久久一区二区国产 | 日日夜夜天天操 | 激情综合网在线观看 | 免费看片网页 | 国产一区电影在线观看 | 色综合久久88色综合天天人守婷 | 国产一级黄色电影 | 日日综合 | 欧美黑人性猛交 | 国产欧美日韩一区 | 91成人在线观看高潮 | 欧美一二三区在线观看 | 五月婷婷在线视频观看 | 国产黄色片免费在线观看 | 97超碰在线免费 | 国产免费一区二区三区网站免费 | 久草.com| 色综合久久88色综合天天6 |