《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動(dòng)態(tài) > 網(wǎng)絡(luò)安全編程:開發(fā)Dex文件格式解析工具

網(wǎng)絡(luò)安全編程:開發(fā)Dex文件格式解析工具

2021-07-30
來源:計(jì)算機(jī)與網(wǎng)絡(luò)安全
關(guān)鍵詞: 安全 編程 Dex文件

  解析Dex文件的工作應(yīng)該是自動(dòng)化的,由工具去完成。本文通過VS2012來新建一個(gè)控制臺(tái)的工程,然后完成一個(gè)Dex文件的解析工具。

  對(duì)于解析Dex文件而言,需要準(zhǔn)備一些頭文件,這些頭文件都可以從安卓系統(tǒng)的源代碼中獲取到,首先要有common.h、uleb128.h,因?yàn)閏ommon.h中存放了相應(yīng)的數(shù)據(jù)類型(這里所說的數(shù)據(jù)類型是u1、u2),uleb128.h中存放了讀取uleb128數(shù)據(jù)類型的相關(guān)函數(shù)。接著要準(zhǔn)備的是DexFile.h、DexFile.cpp、DexClass.h和DexClass.cpp 4個(gè)文件。

  為了使用方便,將這4個(gè)文件中的代碼都復(fù)制到了DexParse.h中,為了能夠編譯通過,在函數(shù)的定義部分進(jìn)行了刪除,或者對(duì)某些函數(shù)的參數(shù)進(jìn)行了修改,對(duì)函數(shù)體的一些內(nèi)容也進(jìn)行了刪減。

  在自己準(zhǔn)備相關(guān)內(nèi)容時(shí),可以在編譯時(shí)通過報(bào)錯(cuò)信息自己進(jìn)行修改。在這里,將DexParse.h文件添加到了新建的控制臺(tái)工程當(dāng)中。

  解析Dex文件也按照Dex的格式逐步進(jìn)行即可,當(dāng)然在解析文件前請(qǐng)不要忘記,對(duì)文件的操作首先是要打開文件。

  1. 打開與關(guān)閉文件

  打開與關(guān)閉文件的代碼如下:

  int _tmain(int argc, _TCHAR* argv[])

  {

  HANDLE hFile = CreateFile(DEX_FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_

  EXISTING, FILE_ACTION_ADDED, NULL);

  HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);

  LPVOID hView = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);

  UnmapViewOfFile(hView);

  CloseHandle(hMap);

  CloseHandle(hFile);

  return 0;

  }

  在上面的代碼中,首先要打開文件,然后創(chuàng)建文件映射,在MapViewOfFile函數(shù)和UnmapViewOfFile函數(shù)之間,來添加關(guān)于解析DEX文件的代碼。

  2. Dex文件頭部

  在解析Dex文件時(shí),需要對(duì)Dex文件的頭部進(jìn)行解析,解析Dex文件的頭部時(shí),安卓系統(tǒng)提供了一個(gè)函數(shù),函數(shù)定義如下:

  DexFile* dexFileParse(const u1* data, size_t length, int flags);

  該函數(shù)有3個(gè)參數(shù),第一個(gè)參數(shù)是Dex文件數(shù)據(jù)的起始位置,第二個(gè)參數(shù)是Dex文件的長(zhǎng)度,第三個(gè)參數(shù)是用來告訴dexFileParse函數(shù)是否需要進(jìn)行驗(yàn)證的。對(duì)于目前階段而言,我們不需要第三個(gè)參數(shù),因此將該函數(shù)進(jìn)行刪減后的代碼如下:

  DexFile* dexFileParse(const u1* data, size_t length)

  {

  DexFile* pDexFile = NULL;

  const DexHeader* pHeader;

  const u1* magic;

  int result = -1;

  pDexFile = (DexFile*) malloc(sizeof(DexFile));

  if (pDexFile == NULL)

  goto bail;

  memset(pDexFile, 0, sizeof(DexFile));

  /*

  * 去掉優(yōu)化的頭部

  */

  if (memcmp(data, DEX_OPT_MAGIC, 4) == 0) {

  magic = data;

  if (memcmp(magic+4, DEX_OPT_MAGIC_VERS, 4) != 0) {

  goto bail;

  }

  /* 忽略可選的頭部和在這里追加的數(shù)據(jù)

  data += pDexFile->pOptHeader->dexOffset;

  length -= pDexFile->pOptHeader->dexOffset;

  if (pDexFile->pOptHeader->dexLength > length) {

  goto bail;

  }

  length = pDexFile->pOptHeader->dexLength;

  }

  dexFileSetupBasicPointers(pDexFile, data);

  pHeader = pDexFile->pHeader;

  /*

  * Success!

  */

  result = 0;

  bail:

  if (result != 0 && pDexFile != NULL) {

  dexFileFree(pDexFile);

  pDexFile = NULL;

  }

  return pDexFile;

  }

  該函數(shù)首先判斷Dex文件的合法性,然后將Dex文件的一些基礎(chǔ)的指針進(jìn)行了初始化,在dexFileParse函數(shù)中調(diào)用了另外一個(gè)函數(shù),即dexFileSetupBasicPointers函數(shù),該函數(shù)的函數(shù)體如下:

  void dexFileSetupBasicPointers(DexFile* pDexFile, const u1* data) {

  DexHeader *pHeader = (DexHeader*) data;

  pDexFile->baseAddr = data;

  pDexFile->pHeader = pHeader;

  pDexFile->pStringIds = (const DexStringId*) (data + pHeader->stringIdsOff);

  pDexFile->pTypeIds = (const DexTypeId*) (data + pHeader->typeIdsOff);

  pDexFile->pFieldIds = (const DexFieldId*) (data + pHeader->fieldIdsOff);

  pDexFile->pMethodIds = (const DexMethodId*) (data + pHeader->methodIdsOff);

  pDexFile->pProtoIds = (const DexProtoId*) (data + pHeader->protoIdsOff);

  pDexFile->pClassDefs = (const DexClassDef*) (data + pHeader->classDefsOff);

  pDexFile->pLinkData = (const DexLink*) (data + pHeader->linkOff);

  }

  從dexFileSetupBasicPointers函數(shù)中可以看出,對(duì)于其他各個(gè)結(jié)構(gòu)體的索引及數(shù)量已經(jīng)在這里全部讀取出來,在后面具體解析其他數(shù)據(jù)結(jié)構(gòu)時(shí),它會(huì)很方便地被使用。

  在dexFileParse中使用malloc函數(shù)申請(qǐng)了一塊空間,這塊空間在解析完成以后需要手動(dòng)地進(jìn)行釋放,在安卓系統(tǒng)的源碼中也定義了一個(gè)函數(shù)以方便使用,函數(shù)名是dexFileFree,函數(shù)的定義如下:

  void dexFileFree(DexFile* pDexFile)

  {

  if (pDexFile == NULL)

  return;

  free(pDexFile);

  }

  很簡(jiǎn)單的函數(shù),判斷指針是否為NULL,不為NULL則直接調(diào)用free函數(shù)釋放空間。

  有了上面的代碼,那么就可以完成解析Dex文件的第一步了,具體代碼如下:

  DWORD dwSize = GetFileSize(hFile, NULL);

  DexFile *pDexFile = dexFileParse((const u1 *)hView, (size_t)dwSize);

  dexFileFree(pDexFile);

  這樣就得到了指向DexFile結(jié)構(gòu)體的指針pDexFile,DexFile結(jié)構(gòu)體的定義如下:

  struct DexFile {

  /* 直接映射的“opt”頭部 */

  const DexOptHeader* pOptHeader;

  /* 指向基礎(chǔ) DEX 中直接映射的結(jié)構(gòu)體和數(shù)組的指針 */

  const DexHeader* pHeader;

  const DexStringId* pStringIds;

  const DexTypeId* pTypeIds;

  const DexFieldId* pFieldIds;

  const DexMethodId* pMethodIds;

  const DexProtoId* pProtoIds;

  const DexClassDef* pClassDefs;

  const DexLink* pLinkData;

  /*

  * 這些不映射到“auxillary”部分,可能不包含在該文件中

  */

  const DexClassLookup* pClassLookup;

  const void* pRegisterMapPool; // RegisterMapClassPool

  /* 指向 DEX 文件開始的指針 */

  const u1* baseAddr;

  /* 跟蹤輔助結(jié)構(gòu)的內(nèi)存開銷 */

  int overhead;

  /* 與 DEX 相關(guān)聯(lián)的其他數(shù)據(jù)結(jié)構(gòu) */

  //void* auxData;

  };

  對(duì)于我們而言,在寫程序時(shí)只需要關(guān)心結(jié)構(gòu)體中DexHeader到DexClassDef之間的字段即可。

  之后解析的代碼中都會(huì)使用到返回的pDexFile指針,因此之后縮寫的代碼都必須寫在調(diào)用dexFileFree函數(shù)之前。

  3. 解析DexMapList相關(guān)數(shù)據(jù)

  DexMapList是在DexHeader的mapOff給出的,不過在程序中不用直接從DexHeader結(jié)構(gòu)體中去取,因?yàn)樵诎沧肯到y(tǒng)中已經(jīng)給出了相關(guān)的函數(shù),函數(shù)代碼如下:

  DEX_INLINE const DexMapList* dexGetMap(const DexFile* pDexFile) {

  u4 mapOff = pDexFile->pHeader->mapOff;

  if (mapOff == 0) {

  return NULL;

  } else {

  return (const DexMapList*) (pDexFile->baseAddr + mapOff);

  }

  }

  dexGetMap函數(shù)通過前面返回的DexFile指針來定位DexMapList在文件中的偏移位置。

  在實(shí)際的代碼中,我們需要將DEX_INLINE宏刪掉,或者按照安卓系統(tǒng)的源代碼中的定義去定義一下。

  通過dexGetMap函數(shù)獲得了DexMapList的指針,那么接下來就可以對(duì)DexMapList進(jìn)行遍歷了,這里定義一個(gè)自定義函數(shù)來進(jìn)行遍歷,代碼如下:

  void PrintDexMapList(DexFile *pDexFile)

  {

  const DexMapList *pDexMapList = dexGetMap(pDexFile);

  printf(“DexMapList:\r\n”);

  printf(“TypeDesc\t\t type unused size offset\r\n”);

  for ( u4 i = 0; i < pDexMapList->size; i ++ )

  {

  switch (pDexMapList->list[i].type)

  {

  case 0x0000:printf(“kDexTypeHeaderItem”);break;

  case 0x0001:printf(“kDexTypeStringIdItem”);break;

  case 0x0002:printf(“kDexTypeTypeIdItem”);break;

  case 0x0003:printf(“kDexTypeProtoIdItem”);break;

  case 0x0004:printf(“kDexTypeFieldIdItem”);break;

  case 0x0005:printf(“kDexTypeMethodIdItem”);break;

  case 0x0006:printf(“kDexTypeClassDefItem”);break;

  case 0x1000:printf(“kDexTypeMapList”);break;

  case 0x1001:printf(“kDexTypeTypeList”);break;

  case 0x1002:printf(“kDexTypeAnnotationSetRefList”);break;

  case 0x1003:printf(“kDexTypeAnnotationSetItem”);break;

  case 0x2000:printf(“kDexTypeClassDataItem”);break;

  case 0x2001:printf(“kDexTypeCodeItem”);break;

  case 0x2002:printf(“kDexTypeStringDataItem”);break;

  case 0x2003:printf(“kDexTypeDebugInfoItem”);break;

  case 0x2004:printf(“kDexTypeAnnotationItem”);break;

  case 0x2005:printf(“kDexTypeEncodedArrayItem”);break;

  case 0x2006:printf(“kDexTypeAnnotationsDirectoryItem”);break;

  }

  printf(“\t %04X %04X %08X %08X\r\n”,

  pDexMapList->list[i].type,

  pDexMapList->list[i].unused,

  pDexMapList->list[i].size,

  pDexMapList->list[i].offset);

  }

  }

  在main函數(shù)中調(diào)用該函數(shù)時(shí),只要將前面得到的指向DexFile結(jié)構(gòu)體的指針傳給該函數(shù)即可。查看該部分解析的輸出,如圖1所示。

  圖1  DexMapList解析后的輸出

  4. 解析StringIds相關(guān)數(shù)據(jù)

  對(duì)于StringIds的解析也非常簡(jiǎn)單,這里直接給出一個(gè)自定義函數(shù),代碼如下:

  void PrintStringIds(DexFile *pDexFile)

  {

  printf(“DexStringIds:\r\n”);

  for ( u4 i = 0; i < pDexFile->pHeader->stringIdsSize; i ++ )

  {

  printf(“%d.%s \r\n”, i, dexStringById(pDexFile, i));

  }

  }

  在該自定義函數(shù)中,它調(diào)用了dexStringById函數(shù),也就是通過索引值來得到字符串,該函數(shù)的定義如下:

  /* 通過特定的 string_id index 返回 UIF-8 編碼的字符串 */

  DEX_INLINE const char* dexStringById(const DexFile* pDexFile, u4 idx) {

  const DexStringId* pStringId = dexGetStringId(pDexFile, idx);

  return dexGetStringData(pDexFile, pStringId);

  }

  在dexStringById函數(shù)中又調(diào)用了兩個(gè)其他的函數(shù),分別是dexGetStringId和dexGetStringData,大家可以自行查看。

  在main函數(shù)中調(diào)用筆者的自定義函數(shù),輸出如圖2所示。

  圖2  StringIds解析后的輸出

  5. 解析TypeIds相關(guān)數(shù)據(jù)

  解析TypeIds也是非常簡(jiǎn)單的,直接上代碼即可,代碼如下:

  void PrintTypeIds(DexFile *pDexFile)

  {

  printf(“DexTypeIds:\r\n”);

  for ( u4 i = 0; i < pDexFile->pHeader->typeIdsSize; i ++ )

  {

  printf(“%d %s \r\n”, i, dexStringByTypeIdx(pDexFile, i));

  }

  }

  代碼中調(diào)用了一個(gè)關(guān)鍵的函數(shù)dexStringByTypeIdx,該函數(shù)也是安卓系統(tǒng)源碼中提供的函數(shù),該函數(shù)的實(shí)現(xiàn)如下:

  /*

  * 獲取與指定的類型索引相關(guān)聯(lián)的描述符字符串

  * 調(diào)用者不能釋放返回的字符串

  */

  DEX_INLINE const char* dexStringByTypeIdx(const DexFile* pDexFile, u4 idx) {

  const DexTypeId* typeId = dexGetTypeId(pDexFile, idx);

  return dexStringById(pDexFile, typeId->descriptorIdx);

  }

  在dexStringByTypeIdx函數(shù)中調(diào)用了dexGetTypeId和dexStringById兩個(gè)函數(shù),請(qǐng)大家自行在源碼中查看。

  在main函數(shù)中調(diào)用自定義函數(shù),輸出如圖3所示。

  圖3  TypeIds解析后的輸出

  6. 解析ProtoIds相關(guān)數(shù)據(jù)

  Proto是方法的原型或方法的聲明,也就是提供了方法的返回值類型、參數(shù)個(gè)數(shù),以及參數(shù)的類型。對(duì)于ProtoIds的解析,首先是對(duì)原始數(shù)據(jù)的解析,然后再將它簡(jiǎn)單地還原為可以直接閱讀的方法原型。

  先來看一下代碼,代碼如下:

  void PrintProtoIds(DexFile *pDexFile)

  {

  printf(“DexProtoIds:\r\n”);

  // 對(duì)數(shù)據(jù)的解析

  for ( u4 i = 0; i < pDexFile->pHeader->protoIdsSize; i ++ )

  {

  const DexProtoId *pDexProtoId = dexGetProtoId(pDexFile, i);

  // 輸出原始數(shù)據(jù)

  printf(“%08X %08X %08X \r\n”, pDexProtoId->shortyIdx, pDexProtoId->returnTy

  peIdx, pDexProtoId->parametersOff);

  // 輸出對(duì)應(yīng)的 TypeId

  printf(“%s %s\r\n”,

  dexStringById(pDexFile, pDexProtoId->shortyIdx),

  dexStringByTypeIdx(pDexFile, pDexProtoId->returnTypeIdx));

  // 獲得參數(shù)列表

  const DexTypeList *pDexTypeList = dexGetProtoParameters(pDexFile, pDexProtoId);

  u4 num = pDexTypeList != NULL ? pDexTypeList->size : 0;

  // 輸出參數(shù)

  for ( u4 j = 0; j < num; j ++ )

  {

  printf(“%s ”, dexStringByTypeIdx(pDexFile, pDexTypeList->list[j].typeIdx));

  }

  printf(“\r\n”);

  }

  printf(“\r\n”);

  // 對(duì)解析數(shù)據(jù)的簡(jiǎn)單還原

  for ( u4 i = 0; i < pDexFile->pHeader->protoIdsSize; i ++ )

  {

  const DexProtoId *pDexProtoId = dexGetProtoId(pDexFile, i);

  printf(“%s”, dexStringByTypeIdx(pDexFile, pDexProtoId->returnTypeIdx));

  printf(“(”);

  // 獲得參數(shù)列表

  const DexTypeList *pDexTypeList = dexGetProtoParameters(pDexFile, pDexProtoId);

  u4 num = pDexTypeList != NULL ? pDexTypeList->size : 0;

  // 輸出參數(shù)

  for ( u4 j = 0; j < num; j ++ )

  {

  printf(“%s\b, ”, dexStringByTypeIdx(pDexFile, pDexTypeList->list[j].typeIdx));

  }

  if ( num == 0 )

  {

  printf(“);\r\n”);

  }

  else

  {

  printf(“\b\b);\r\n”);

  }

  }

  }

  在該自定義函數(shù)中有兩個(gè)for循環(huán),其內(nèi)容基本一致。第一個(gè)循環(huán)完成了數(shù)據(jù)的解析,第二個(gè)循環(huán)是將數(shù)據(jù)簡(jiǎn)單地解析成了方法的原型。

  這里只對(duì)第一個(gè)for循環(huán)進(jìn)行說明。ProtoIds是方法的原型,看一下DexProtoId的定義,定義如下:

  /*

  * Direct-mapped “proto_id_item”.

  */

  struct DexProtoId {

  u4 shortyIdx; /* index into stringIds for shorty descriptor */

  u4 returnTypeIdx; /* index into typeIds list for return type */

  u4 parametersOff; /* file offset to type_list for parameter types */

  };

  第一個(gè)字段是方法原型的短描述,第二個(gè)字段是方法原型的返回值,第三個(gè)字段是指向參數(shù)列表的。因此,可以看到,在兩個(gè)for循環(huán)中,仍然嵌套著一個(gè)for循環(huán),外層的循環(huán)是用來解析方法原型的,內(nèi)層的循環(huán)是用來解析方法原型中的參數(shù)的。

  首先,通過dexGetProtoId函數(shù)來獲得ProtoIds,然后通過dexGetProtoParameters函數(shù)來得到相應(yīng)ProtoIds的參數(shù)。

  在main函數(shù)中調(diào)用自定義函數(shù),輸出如圖4所示。

  圖4  ProtoIds解析后的輸出

  從圖4中可以看出,該Dex文件中有3個(gè)方法原型,這里來說一下ProtoIds中的shortyIdx這個(gè)簡(jiǎn)短描述的意思,用第二個(gè)方法原型來說明。

  第二個(gè)方法原型是V(Ljava/lang/String);這種形式,它的簡(jiǎn)短描述是VL。V表示返回值類型,就是V,而L就是第一個(gè)參數(shù)的類型。再舉個(gè)例子,如果簡(jiǎn)短描述是VII,那么返回值類型是V,然后有兩個(gè)參數(shù),第一個(gè)參數(shù)是I類型,第二個(gè)參數(shù)也是I類型。

  7. 解析FieldIds相關(guān)數(shù)據(jù)

  FieldIds的解析相對(duì)于ProtoIds的解析就簡(jiǎn)單了,直接上代碼:

  void PrintFieldIds(DexFile *pDexFile)

  {

  printf(“DexFieldIds:\r\n”);

  for ( u4 i = 0; i < pDexFile->pHeader->fieldIdsSize; i ++ )

  {

  const DexFieldId *pDexFieldId = dexGetFieldId(pDexFile, i);

  printf(“%04X %04X %08X \r\n”, pDexFieldId->classIdx, pDexFieldId->typeIdx,

  pDexFieldId->nameIdx);

  printf(“%s %s %s\r\n”,

  dexStringByTypeIdx(pDexFile, pDexFieldId->classIdx),

  dexStringByTypeIdx(pDexFile, pDexFieldId->typeIdx),

  dexStringById(pDexFile, pDexFieldId->nameIdx));

  }

  }

  Field是類中的屬性,在DexFieldId中對(duì)于類屬性有3個(gè)字段,分別是屬性所屬的類、屬性的類型和屬性的名稱。

  在main函數(shù)中調(diào)用自定義函數(shù),輸出如圖5所示。

  圖5  FieldIds解析后的輸出

  8. 解析MethodIds相關(guān)數(shù)據(jù)

  MethodIds的解析也分為兩部分,第一部分是解析數(shù)據(jù),第二部分是簡(jiǎn)單的還原方法。在DexMethodId中給出了方法所屬的類、方法對(duì)應(yīng)的原型,以及方法的名稱。在解析ProtoIds的時(shí)候,只是方法的原型,并沒有給出方法的所屬的類,還有方法的名稱。在還原方法時(shí),就要借助ProtoIds才能完整地還原方法。

  解析MethodIds的代碼如下:

  void PrintMethodIds(DexFile *pDexFile)

  {

  printf(“DexMethodIds:\r\n”);

  // 對(duì)數(shù)據(jù)的解析

  for ( u4 i = 0; i < pDexFile->pHeader->methodIdsSize; i ++ )

  {

  const DexMethodId *pDexMethodId = dexGetMethodId(pDexFile, i);

  printf(“%04X %04X %08X \r\n”, pDexMethodId->classIdx, pDexMethodId->protoIdx,

  pDexMethodId->nameIdx);

  printf(“%s %s \r\n”,

  dexStringByTypeIdx(pDexFile, pDexMethodId->classIdx),

  dexStringById(pDexFile, pDexMethodId->nameIdx));

  }

  printf(“\r\n”);

  // 根據(jù) protoIds 來簡(jiǎn)單還原方法

  for ( u4 i = 0; i < pDexFile->pHeader->methodIdsSize; i ++ )

  {

  const DexMethodId *pDexMethodId = dexGetMethodId(pDexFile, i);

  const DexProtoId *pDexProtoId = dexGetProtoId(pDexFile, pDexMethodId->protoIdx);

  printf(“%s ”, dexStringByTypeIdx(pDexFile, pDexProtoId->returnTypeIdx));

  printf(“%s\b.”, dexStringByTypeIdx(pDexFile, pDexMethodId->classIdx));

  printf(“%s”, dexStringById(pDexFile, pDexMethodId->nameIdx));

  printf(“(”);

  // 獲得參數(shù)列表

  const DexTypeList *pDexTypeList = dexGetProtoParameters(pDexFile, pDexProtoId);

  u4 num = pDexTypeList != NULL ? pDexTypeList->size : 0;

  // 輸出參數(shù)

  for ( u4 j = 0; j < num; j ++ )

  {

  printf(“%s\b, ”, dexStringByTypeIdx(pDexFile, pDexTypeList->list[j].typeIdx));

  }

  if ( num == 0 )

  {

  printf(“);”);

  }

  else

  {

  printf(“\b\b);”);

  }

  printf(“\r\n”);

  }

  }

  在解析數(shù)據(jù)時(shí),只是將數(shù)據(jù)對(duì)應(yīng)的字符串進(jìn)行了輸出,而還原方法時(shí),則是借助ProtoIds來完整地還原了方法。

  同樣,在main函數(shù)中調(diào)用自定義函數(shù),輸出如圖6所示。

  圖6  MethodIds解析后的輸出

  在解析ProtoIds的時(shí)候是有3個(gè)方法原型,在解析方法時(shí)是4個(gè)方法,第一個(gè)方法與第四個(gè)方法的方法原型是相同的。

  用第二個(gè)方法來進(jìn)行一個(gè)簡(jiǎn)單說明,V LHelloWorld.main([Ljava/lang/String]);。V表示方法的返回值類型,LHelloWorld是方法所在的類,main是方法的名稱,Ljava/lang/String是該方法參數(shù)的類型。

  9. 解析DexClassDef相關(guān)數(shù)據(jù)

  解析DexClassDef是最復(fù)雜的部分了,因?yàn)樗鼤?huì)先解析類相關(guān)的內(nèi)容,類相關(guān)的內(nèi)容包含類所屬的文件、類中的屬性、類中的方法、方法中的字節(jié)碼等內(nèi)容。雖然復(fù)雜,但是它只是前面每個(gè)部分和其余部分的組成,因此只是代碼比較多,沒有什么特別難的地方,具體代碼如下:

  void PrintClassDef(DexFile *pDexFile)

  {

  for ( u4 i =0; i < pDexFile->pHeader->classDefsSize; i ++ )

  {

  const DexClassDef *pDexClassDef = dexGetClassDef(pDexFile, i);

  // 類所屬的源文件

  printf(“SourceFile : %s\r\n”, dexGetSourceFile(pDexFile, pDexClassDef));

  // 類和父類

  // 因?yàn)槲覀兊?Dex 文件沒有接口所以這里就沒寫

  // 具體解析的時(shí)候需要根據(jù)實(shí)際情況而定

  printf(“class %s\b externs %s\b { \r\n”,

  dexGetClassDescriptor(pDexFile, pDexClassDef),

  dexGetSuperClassDescriptor(pDexFile, pDexClassDef));

  const u1 *pu1 = dexGetClassData(pDexFile, pDexClassDef);

  DexClassData *pDexClassData = dexReadAndVerifyClassData(&pu1, NULL);

  // 類中的屬性

  for ( u4 z = 0; z < pDexClassData->header.instanceFieldsSize; z ++ )

  {

  const DexFieldId *pDexField = dexGetFieldId(pDexFile, pDexClassData->

  instanceFields[z].fieldIdx);

  printf(“%s %s\r\n”,

  dexStringByTypeIdx(pDexFile, pDexField->typeIdx),

  dexStringById(pDexFile, pDexField->nameIdx));

  }

  // 類中的方法

  for ( u4 z = 0; z < pDexClassData->header.directMethodsSize; z ++ )

  {

  const DexMethodId *pDexMethod = dexGetMethodId(pDexFile, pDexClassData->

  directMethods[z].methodIdx);

  const DexProtoId *pDexProtoId = dexGetProtoId(pDexFile, pDexMethod->

  protoIdx);

  printf(“\t%s ”, dexStringByTypeIdx(pDexFile, pDexProtoId->returnTypeIdx));

  printf(“%s\b.”, dexStringByTypeIdx(pDexFile, pDexMethod->classIdx));

  printf(“%s”, dexStringById(pDexFile, pDexMethod->nameIdx));

  printf(“(”);

  // 獲得參數(shù)列表

  const DexTypeList *pDexTypeList = dexGetProtoParameters(pDexFile, pDexProtoId);

  u4 num = pDexTypeList != NULL ? pDexTypeList->size : 0;

  // 輸出參數(shù)

  for ( u4 k = 0; k < num; k ++ )

  {

  printf(“%s\b v%d, ”, dexStringByTypeIdx(pDexFile, pDexTypeList->

  list[k].typeIdx), k);

  }

  if ( num == 0 )

  {

  printf(“)”);

  }

  else

  {

  printf(“\b\b)”);

  }

  printf(“{\r\n”);

  // 方法中具體的數(shù)據(jù)

  const DexCode *pDexCode = dexGetCode(pDexFile, (const DexMethod *)&pDex

  ClassData->directMethods[z]);

  printf(“\t\tregister:%d \r\n”, pDexCode->registersSize);

  printf(“\t\tinsnsSize:%d \r\n”, pDexCode->insSize);

  printf(“\t\tinsSize:%d \r\n”, pDexCode->outsSize);

  // 方法的字節(jié)碼

  printf(“\t\t// ByteCode …\r\n\r\n”);

  printf(“\t\t//”);

  for ( u2 x = 0; x < pDexCode->insnsSize; x ++ )

  {

  printf(“%04X ”, pDexCode->insns[x]);

  }

  printf(“\r\n”);

  printf(“\t}\r\n\r\n”);

  }

  printf(“}\r\n”);

  }

  }

  在代碼中逐步地對(duì)類進(jìn)行了解析,從類所屬的源文件、類的名稱、類的父類、類的屬性,到類的方法以及類的字節(jié)碼。除了方法中的數(shù)據(jù)在前面的代碼中沒有,其余的代碼在前面都有過介紹了。對(duì)于類方法中的數(shù)據(jù)只要按照DexCode進(jìn)行解析即可,這里請(qǐng)參考前面給出的DexCode結(jié)構(gòu)體即可。

  最后,在main函數(shù)中調(diào)用自定義函數(shù),輸出如圖7所示。

  圖7  DexClassDef解析后的輸出




電子技術(shù)圖片.png

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 激情内射人妻1区2区3区 | 91精品啪在线观看国产手机 | 精品综合在线 | 亚洲日本va中文字幕 | 国产亚洲成av人片在线观黄桃 | 无码专区无码专区视频网址 | 特黄少妇60分钟在线观看播放 | 日韩一区二区三区在线播放 | 凹凸日日摸日日碰夜夜 | 日韩精品黄 | 中文字幕在线不卡视频 | 国产精品多久久久久久情趣酒店 | 亚洲va欧美va人人爽春色影视 | 高h禁伦餐桌上的肉伦 | 午夜秋霞网 | 性欧美高清come | 日韩精品免费一区二区三区 | a级毛片黄色 | 成在人线av无码免费 | 懂色av一区二区三区免费 | 国产女主播在线喷水呻吟 | 中文字幕一区二区三区不卡 | 欧美成人精品一区二区男人小说 | 三级色网站 | 狂野欧美性猛xxxx乱大交 | 夜夜爽夜夜操 | 精品国产九九 | tube国产麻豆 | 青草精品视频 | 久久狠狠一本精品综合网 | 国产精品7777cos | 免费一区二区 | 亚洲精品视频在线免费 | 国产精品一区二区无线 | 亚洲成人网在线播放 | 国产精品一区二区性色av | 日本视频网站在线观看 | 国产亚洲精品久久yy50 | 我想看一级黄色毛片 | 国产人妻777人伦精品hd | 激情欧美一区二区免费视频 | 天天躁夜夜躁天干天干200 | 香蕉中文网 | 亚洲天堂av在线播放 | 欧美久久网 | 免费网站看av片 | 欧美另类变人与禽xxxxx | 黄色片免费视频 | 国产精品av久久久久久网址 | 日韩视频 中文字幕 | 日韩性插| 精品久久久久久久中文字幕 | 4hu四虎永久免费地址ww416 | h视频网站在线观看 | 欧美大屁股xxxxhd黑色 | 国产精品久久久久久婷婷天堂 | 久久偷看各类wc女厕嘘嘘偷窃 | 欧美亚洲激情视频 | 久久九九热视频 | 日韩福利视频一区 | 日韩最新| 日韩精品 欧美 | 中文字幕国产在线 | 午夜视频| 久久人人爽人人爽人人片 | 激情六月天 | 国产成人av手机在线观看 | 欧美体内谢she精2性欧美 | 国产免费一区二区三区在线能观看 | 天天插日日插 | 人妖av在线 | 成人深夜视频在线观看 | 久久久网页| 精品免费国产一区二区三区四区介绍 | 欧美成人三级伦在线观看 | 91一二区 | 国产熟女一区二区三区五月婷 | 亚洲h在线观看 | 欧美性受xxxx狂喷水 | 色偷偷人人澡人人爽人人模 | 国产4区| 黑人邻居太猛中文字幕hd | 福利cosplayh裸体の福利 | 国产精品久久久久毛片 | 亚洲成成品牛牛 | 国产真实乱免费高清视频 | 亚洲精品视频91 | 女人抽搐喷水高潮国产精品 | 国产欧美精品日韩区二区麻豆天美 | 免费人成视频网站在线观看18 | 国产精品农村妇女bbw | 日韩欧美猛交xxxxx无码 | 久久综合视频网 | 精品人妻少妇一区二区三区 | 毛片网| 成人av一区二区免费播放 | 噼里啪啦在线看免费观看视频 | hd国产人妖ts另类视频 | 国产精品久线在线观看 | 国产黄色一区 | 亚洲最大中文字幕无码网站 | 特级特黄刘亦菲aaa级 | 丰满少妇被猛男猛烈进入久久 | 超乳在线| 成人在线精品 | 国产精品久久久久久久久久久久人四虎 | 国产精品videosex极品 | 欧美一区二区三区在线视频 | 欧美精品videos另类日本 | 女同久久另类99精品蜜臀 | 黄色a网| 国模无码大尺度一区二区三区 | 亚洲欧美国产毛片在线 | 日韩高清亚洲日韩精品一区 | www在线视频 | 人妻无码久久一区二区三区免费 | 巨爆乳无码视频在线观看 | 国产a免费| 亚洲视频在线一区 | 天天干天天舔天天射 | 天天天干干干 | 日本久久久久久 | 日韩黄色在线观看 | 夜夜嗨av一区二区三区四区 | 噜噜噜久久亚洲精品国产品 | 懂色av一区在线播放 | 少妇做爰免费视频网站 | 99精品欧美一区二区 | 青青草97国产精品免费观看 | 一级黄色片毛片 | 国产精品久久无码一区二区三区网 | 色哟哟—国产精品 | 五月婷影院| 99久久精| 色肉色伦交国产69精品 | 亚洲国产精品视频 | 国产香蕉视频在线 | 香蕉大久久 | 日本熟妇大屁股人妻 | 51精品国产人成在线观看 | 亚洲免费一级视频 | 极品少妇网站 | 国产目拍亚洲精品区一区 | 国内精产品∪v | ass亚洲熟妇毛耸耸pics | 精品国精品自拍自在线 | 国产又粗又爽又猛又大的动漫片 | 久久不见久久见免费影院视频 | 无码中文av波多野吉衣迅雷下载 | 国产无套粉嫩白浆内谢网站 | 中文字幕xxx | 青青草视频国产 | 精品一区二区三区四区五区六区 | 亚洲成熟少妇 | 亚洲人成网站777色婷婷 | 永久免费的啪啪网站免费观看浪潮 | 网色网站 | 天天草天天草 | 国产成人av网 | 亚洲在线一区 | 乱码av麻豆丝袜熟女系列 | 老司机成人永久免费视频 | 九九热精品在线视频 | 国产毛片一区二区三区 | 久久久久成人免费看a含羞草久色 | 激情偷乱人伦小说视频在线 | 日本69精品久久久久999小说 | 天堂资源站 | 免费人成视频在线播放 | 日本特黄特黄刺激大片 | 日韩一本在线 | 天堂av在线资源 | 国产成人精品必看 | 91免费大片网站 | 亚洲精品乱码久久久久久国产主播 | 石原莉奈一区二区三区在线观看 | 欧美性生交xxxxx | 91九色在线播放 | 国产日韩欧美精品在线观看 | 蜜月va乱码一区二区三区 | 欧美综合自拍亚洲综合图 | 色婷婷综合久久久久中文 | 18禁黄网站男男禁片免费观看 | 亚洲成a人v欧美综合天堂麻豆 | 无线日本视频精品 | 日韩av影片在线观看 | 国产精品不卡一区 | 精品一区二区三区四区视频 | 欧美午夜理伦三级在线观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 99热6这里只有精品 99热99re6国产在线播放 | 超清av| 亚洲黄色片免费看 | 中文字幕日韩一级 | 久久夜色精品国产欧美一区麻豆 | 天堂中文在线资源 | 国产精品久久久久久久妇 | 91精品国产综合久久久蜜臀粉嫩 | 无套内谢大学处破女福利 | a国产在线 | 在线а√天堂中文官网 | 日韩小视频在线 | 最近最好的中文字幕2019免费 | 亚洲xxxx丝按摩袜 | 无码日韩精品一区二区免费暖暖 | 全部免费毛片在线播放一个 | аⅴ天堂中文在线网 | 日本一区免费视频 | 一区二区三区四区亚洲 | 亚洲人成伊人成综合网久久久 | 91精品综合久久久久m3u8 | 午夜嘿嘿嘿影院 | 98婷婷狠狠成人免费视频 | 熟妇高潮喷沈阳45熟妇高潮喷 | 神马午夜一区二区 | 黄色毛片一级 | 欧美性感美女二区 | 天天影视色香欲综合久久 | 一级免费看视频 | 女人张开腿让男人桶个爽 | 欧美黑人一级爽快片淫片高清 | 天天看片天天爽 | 久久人人做 | 密臀av在线 | 亚洲午夜精品 | 中文字幕日韩亚洲 | 亚洲影院丰满少妇中文字幕无码 | 亚洲色成人一区二区三区小说 | 中文在线а√天堂 | videosex抽搐痉挛高潮 | 一本色道久久88综合亚洲精品ⅰ | 免看一级片 | 中文无码熟妇人妻av在线 | 中文字幕乱人伦高清视频 | xnxx国产精品hd | 免费无码专区毛片高潮喷水 | 香蕉视频在线观看视频 | 国产亚洲精品久久久久久国模美 | 欧美福利视频在线 | 日韩欧美中文字幕一区 | 精品欧美一区二区三区精品久久 | 色婷婷激情一区二区三区 | 成人小视频免费在线观看 | 精品成人av一区二区三区 | 欧美jizzhd精品欧美巨大 | av最新网| 欧美在线视频你懂的 | 久久久久99精品 | 亚洲精品有限公司 | 国产精品一区二区不卡 | 日韩av片在线看 | 白嫩日本少妇做爰 | 6080yy午夜一二三区久久 | 国产精品国产三级国产av剧情 | 国产成人精品亚洲男人的天堂 | 国产精品久久久久久久午夜片 | 精品久久久久久人妻无码中文字幕 | 天堂久久精品忘忧草 | 欧美高清一区二区三区四区 | 国产xxxxxx| 十八女人国产毛毛片视频 | 高h辣h情趣道具h黄n男一女 | 久久亚洲男人天堂 | 麻豆精品a∨在线观看 | 手机成人在线 | 免费人妻无码不卡中文字幕系 | 国产精品爽爽久久久久久 | 欧美交换 | 乱色欧美 | 伊人色综合一区二区三区 | 欧美 亚洲 国产 另类 | 99精品视频在线观看免费播放 | 蜜桃av在线免费观看 | 国产高清在线不卡 | 俄罗斯伦理精品a级 | 噼里啪啦在线播放 | 无码精品a∨在线观看中文 亚洲熟妇自偷自拍另欧美 无码少妇a片一区二区三区 | 午夜精品久久久久久久99樱桃 | 91成人国产综合久久精品 | 日本无码人妻精品一区二区蜜桃 | 狠狠色丁香婷婷综合最新地址 | 人人爽人人爽人人片av | 征服少妇柔佳系列 | 国产精品第二页 | 欧美xxxx在线 | 香蕉视频免费网站 | 91免费版黄色 | 性欧美1819性猛交 | 成人av日韩 | 天堂资源| 国产一区二区三区视频播放 | 成人国产片女人爽到高潮 | 久久久午夜精品理论片中文字幕 | 五月天激情国产综合婷婷婷 | 中文永久有效幕中文永久 | 把少妇弄高潮了www麻豆 | 亚洲性少妇性猛交wwww乱大交 | 精品国产_亚洲人成在线 | 天堂av中文在线 | 99精品久久精品一区二区 | 国产一卡二卡在线播放 | 欧美牲交40_50a欧美牲交aⅴ | 青青99 | 亚洲精品无码久久久久 | 国产精品久久久久77777按摩 | 一个人看的www片免费高清视频 | 91狠狠综合 | 性综合网 | 色婷婷久久久亚洲一区二区三区 | 免费观看av网址 | 成人精品在线观看视频 | 伊人88| 人妻夜夜爽天天爽三区麻豆av网站 | 麻豆视频免费网站 | 成人国内精品久久久久一区 | 成人做爰www看视频软件 | 女同一区 | 蜜桃无码一区二区三区 | 一级持黄录像免费观看 | 日韩中文字幕在线一区二区三区 | 粉嫩小箩莉奶水四溅在线观看 | 六月丁香av | 主播av在线 | 亚洲国产精品999久久久婷婷 | 欧美日韩一级特黄 | 91一区二区三区四区 | 污网站在线观看免费 | 特级黄aaaaaaaaa毛片 | 久久久久爽爽爽爽一区老女人 | 特黄一区二区 | 国产小视频免费观看 | 欧美性生交xxxxx久久久 | 天天操天天操天天操天天操 | 黄色免费毛片 | 中文字幕一区av | 波多野结衣不卡 | 国产av无码久久精品 | 又紧又大又爽精品一区二区 | 午夜精品国产精品大乳美女 | 在线观看免费观看av | 亚洲精品无码久久久久 | 国产小精品 | 日韩毛片免费在线观看 | 国产露脸国语对白在线 | 丁香婷婷激情国产高清秒播 | 少妇与公做了夜伦理 | 激情五月婷婷综合网 | 欧美精品小视频 | 国产精品久久久久久免费免熟 | 十八禁视频网站在线观看 | 污污的网站在线免费观看 | 亚洲国产日韩在线视频 | 五月婷婷狠狠干 | 欧美阿v高清资源不卡在线播放 | 天天干狠狠干 | 日韩中文网 | 色妞综合网 | 美女视频黄频a美女大全 | 久久这里只精品 | 亚洲gv2023| 超碰在线最新 | 久久综合成人 | 日本精品免费视频 | 欧美久久网| 亚洲毛片网站 | 96久久精品 | 一级黄色片一级黄色片 | 久久精品香蕉 | 色拍拍欧美视频在线看 | 欧美女优在线 | 亚洲五月激情 | www.com操| 天干夜天干天天天爽视频 | 亚洲精品久久久久久久久久久 | 亚洲精品少妇一区二区 | 成人免费视频网站 | 国语自产拍91在线a拍拍 | 欧美成人不卡视频 | 亚洲激情在线视频 | 日韩看片 | 四虎av在线播放 | 久久久久久国产精品免费免费男同 | 久久久久se色偷偷亚洲精品av | 国产性猛交普通话对白 | 久久精品中文字幕大胸 | 成人免费视频网站在线观看 | 日本不卡高字幕在线2019 | 91黄色免费观看 | 国产传媒一级片 | 成人免费版 | 国产精品欧美久久久久天天影视 | 偷窥四川少妇野外啪啪 | 女人14毛片毛片毛片毛片区二 | 免费看男女做爰爽爽视频 | 国产精品视频免费看人鲁 | 亚洲高清视频一区二区 | 久久久久久久久久久91 | 国产精品亚洲欧美 | 国产成人三级 | 中文字幕黄色片 | 亚洲视频一区二区三区四区 | 色哟哟av| 国产一区二区三区乱码在线观看 | 日批免费网站 | 亚洲成av人片天堂网无码】 | 日韩一卡2卡3卡4卡新区亚洲 | 久久夜夜操妹子 | 又污又爽又黄的网站 | 中出乱码av亚洲精品久久天堂 | 午夜精品一区二区三区在线观看 | 国产香港明星裸体xxxx视频 | 999亚洲国产精华液 99av海角社区 | 国产成人av免费观看 | 三级视频在线观看 | 黑人巨大跨种族video | 国产精品一区二区免费 | 欧美三级免费看 | 操欧美美女 | 欧美v成 人在线观看 | 青青青在线视频 | 亚洲成a人v在线蜜臀 | av天堂久久天堂色综合 | 一女三黑人理论片在线 | 国产精成人品 | 日本少妇激三级做爰在线 | 网址你懂的在线 | 久久99国产乱子伦精品免费 | 亚洲综合色小说 | 大桥未久女教师在线观看bd22 | 天天视频国产 | 九色porny丨首页入口网页 | 99国产精品自在自在久久 | 亚州av在线播放 | 亚洲综合一 | 羞羞视频在线免费 | 97久久超碰国产精品2021 | 亚洲欧美高清一区二区三区 | 777奇米888色狠狠俺也去 | 亚洲激情二区 | 免费观看a视频 | 一区二区三区亚洲欧美 | 一本一本久久a久久精品综合不卡 | 免费国产羞羞网站视频 | 理论片高清免费理论片毛毛片 | 少妇性bbb搡bbb爽爽爽 | 香蕉视频久久久 | 草草视频在线播放 | 曰本无码人妻丰满熟妇啪啪 | 色婷婷激情一区二区三区 | 九月婷婷人人澡人人添人人爽 | 欧美视频日韩 | 中日韩精品视频在线观看 | 中文字幕日本免费毛片全过程 | 成人高清视频在线 | 免费在线观看日韩 | 精品欧美在线 | av片一区二区三区 | 91精品国产色综合久久不卡98 | 久久αv | 成人亚洲欧美 | 欧美日韩一级大片 | 成人综合婷婷国产精品久久蜜臀 | 小鲜肉自慰网站 | 日日碰狠狠躁久久躁 | 久操福利在线 | 亚洲一区二区色 | 成年女人毛片免费视频 | 国产女同疯狂作爱系列 | 成人自拍视频在线 | 国产一级一级va | 少妇学院在线观看 | 国产肥臀一区二区福利视频 | 色综合天天射 | 国产精品丝袜 | 日韩欧美国产成人 | 亚洲一区二区在线免费观看 | 亚洲区小说区 | 麻豆精品在线视频 | 日本熟女毛茸茸 | 超污视频在线观看 | 国产精品久久久久久久久妇女 | 青青草超碰| 精品一二区 | 女人抽搐喷水高潮国产精品 | 国产精品久久久久久久 | 亚洲熟妇中文字幕五十中出 | 日韩精品免费一区二区三区竹菊 | 绯色av一区二区三区在线观看 | 体内谢xxxxx视少妇频 | 日韩人妻无码中文字幕视频 | 亚洲成人黄色在线 | 国产综合影院 | 制服丝袜另类专区制服 | 成人国产精品视频 | 国产99久一区二区三区a片 | 色婷婷色丁香 | 日韩av一区二区精品不卡 | 四虎成人精品国产永久免费无码 | 精品久久久久久国产 | 华人永久免费 | 高h全肉老汉嫩草文 | 美女裸体自慰在线观看 | 少妇被躁爽到高潮无码文 | 久久久看 | 欧美大肥婆大肥bbbbb | 国产亲子私乱av | 无码国产精品一区二区免费16 | 久久久精品免费 | 久久国产中文 | 国产精品一区二区人人爽79欧美 | 在线观看午夜视频 | 精品一区二区三区在线播放 | 国产又粗又猛又爽视频上高潮69 | 四虎影库永久在线 | 欣赏asian国模裸体pics | 日本亚洲高清 | 特级做a爰片毛片免费看 | 成年人福利视频 | 伊人情人色综合网站 | 国产大片一区 | 羞羞影院午夜男女爽爽 | 九九少妇| 3344久久日韩精品一区二区 | 成人a级黄色片 | 欧美色图亚洲色 | 4438xx亚洲最大五色丁香一 | 极品福利在线 | 精品成人佐山爱一区二区 | 天天色官网 | 成人在线欧美 | 日日碰狠狠躁久久躁综合小说 | 丁香在线视频 | 国产欧美二区 | 日产精品高潮呻吟av久久 | 91成人国产综合久久精品 | 揄拍自拍| 黑人巨大猛烈捣出白浆 | 国产精品亚洲精品日韩已方 | 国产一卡在线 | 亚洲人av在线| 精品不卡一区二区 | 无码人妻丰满熟妇区bbbbxxxx | 国产精品黄在线观看免费软件 | 国产在线观看h | 国产成人av一区二区三区不卡 | 国产黄色片av | 亚洲天堂va | 精品国产乱码久久久久久影片 | 美女黄频视频大全免费的国内 | 大色综合色综合网站 | 中文字幕www | 日本55丰满熟妇厨房伦 | 久久国产劲暴∨内射 | 另类激情综合网 | 欧美日本一二三区 | 免费a级毛片18以上观看精品 | 国产精品 视频一区 二区三区 | 欧美精品videosbestsex日本 | 欧美人吸奶水吃奶水 | 在线观看免费视频a | 91在线视频导航 | 免费网站看av | 色av色婷婷 | 一本在线免费视频 | 欧美久久综合 | 男人在线网站 | 精品无码一区二区三区爱欲 | 国产精欧美一区二区三区 | 亚洲一区二区三区av无码 | 五月婷婷免费视频 | 日韩黄色片免费看 | 欧美性猛交乱大交 | 毛片24种姿势无遮无拦 | 国产精品噜噜噜66网站 | 久久一线| 亚洲成av人片一区二区密柚 | 99热精品在线观看 | 亚洲精品av久久久久久久影院 | 亚洲图片在线 | jizz日韩| 97国产色呦呦呦夜嗨嗨 | 韩国三级免费 | 天天色欧美 | 国产色多传媒网站 | 久热精品在线观看视频 | 毛片网特黄| 亚洲一区av无码专区在线观看 | 国产精品久久久天天影视 | 亚洲乱码国产乱码精品天美传媒 | 亚洲第一精品在线 | 欧美激情一区二区三区 | 亚洲精品久久久久久国产精华液 | 99久久免费国产精精品 | 98成人网| 国产乱对白刺激视频 | 亚洲国产精品久久艾草 | 99热在线只有精品 | 国产一区视频在线免费观看 | 999久久久精品视频 999久久久久 | 亚洲国产精品久久人人爱 | 欧美xxxxhd| 中文字幕乱码一区av久久不卡 | 国产在线欧美日韩 | 日韩欧美视频在线播放 | 欧美成人精品一区二区三区在线看 | 久久久网址 | 叼嘿视频在线免费观看 | 国产在线精品一区二区在线看 | 精国产品一区二区三区a片 日韩av在线观看免费 | 91在线免费视频 | 成人性生交大片免费看视频hd | 免费观看全黄做爰的视在线观看 | 好吊视频一区二区三区 | 老女人毛片 | 午夜大片网 |