disassembler_dex.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COMPONENTS_ZUCCHINI_DISASSEMBLER_DEX_H_
  5. #define COMPONENTS_ZUCCHINI_DISASSEMBLER_DEX_H_
  6. #include <stdint.h>
  7. #include <map>
  8. #include <memory>
  9. #include <string>
  10. #include <vector>
  11. #include "base/memory/raw_ptr.h"
  12. #include "components/zucchini/disassembler.h"
  13. #include "components/zucchini/image_utils.h"
  14. #include "components/zucchini/type_dex.h"
  15. namespace zucchini {
  16. // For consistency, let "canonical order" of DEX data types be the order defined
  17. // in https://source.android.com/devices/tech/dalvik/dex-format "Type Codes"
  18. // section.
  19. class DisassemblerDex : public Disassembler {
  20. public:
  21. static constexpr uint16_t kVersion = 1;
  22. // Pools follow canonical order.
  23. enum ReferencePool : uint8_t {
  24. kStringId,
  25. kTypeId,
  26. kProtoId,
  27. kFieldId,
  28. kMethodId,
  29. // kClassDef, // Unused
  30. kCallSiteId,
  31. kMethodHandle,
  32. kTypeList,
  33. kAnnotationSetRefList,
  34. kAnnotionSet,
  35. kClassData,
  36. kCode,
  37. kStringData,
  38. kAnnotation,
  39. kEncodedArray,
  40. kAnnotationsDirectory,
  41. kCallSite,
  42. kNumPools
  43. };
  44. // Types are grouped and ordered by target ReferencePool. This is required by
  45. // Zucchini-apply, which visits references by type order and sequentially
  46. // handles pools in the same order. Type-pool association is established in
  47. // MakeReferenceGroups(), and verified by a unit test.
  48. enum ReferenceType : uint8_t {
  49. kTypeIdToDescriptorStringId, // kStringId
  50. kProtoIdToShortyStringId,
  51. kFieldIdToNameStringId,
  52. kMethodIdToNameStringId,
  53. kClassDefToSourceFileStringId,
  54. kCodeToStringId16,
  55. kCodeToStringId32,
  56. kProtoIdToReturnTypeId, // kTypeId
  57. kFieldIdToClassTypeId,
  58. kFieldIdToTypeId,
  59. kMethodIdToClassTypeId,
  60. kClassDefToClassTypeId,
  61. kClassDefToSuperClassTypeId,
  62. kTypeListToTypeId,
  63. kCodeToTypeId,
  64. kCodeToProtoId, // kProtoId
  65. kMethodIdToProtoId,
  66. kCodeToFieldId, // kFieldId
  67. kMethodHandleToFieldId,
  68. kAnnotationsDirectoryToFieldId,
  69. kCodeToMethodId, // kMethodId
  70. kMethodHandleToMethodId,
  71. kAnnotationsDirectoryToMethodId,
  72. kAnnotationsDirectoryToParameterMethodId,
  73. kCodeToCallSiteId, // kCallSiteId
  74. kCodeToMethodHandle, // kMethodHandle
  75. kProtoIdToParametersTypeList, // kTypeList
  76. kClassDefToInterfacesTypeList,
  77. kAnnotationsDirectoryToParameterAnnotationSetRef, // kAnnotationSetRef,
  78. kAnnotationSetRefListToAnnotationSet, // kAnnotationSet,
  79. kAnnotationsDirectoryToClassAnnotationSet,
  80. kAnnotationsDirectoryToFieldAnnotationSet,
  81. kAnnotationsDirectoryToMethodAnnotationSet,
  82. kClassDefToClassData, // kClassData
  83. kCodeToRelCode8, // kCode
  84. kCodeToRelCode16,
  85. kCodeToRelCode32,
  86. kStringIdToStringData, // kStringData
  87. kAnnotationSetToAnnotation, // kAnnotation
  88. kClassDefToStaticValuesEncodedArray, // kEncodedArrayItem
  89. kClassDefToAnnotationDirectory, // kAnnotationsDirectory
  90. kCallSiteIdToCallSite, // kCallSite
  91. kNumTypes
  92. };
  93. DisassemblerDex();
  94. DisassemblerDex(const DisassemblerDex&) = delete;
  95. const DisassemblerDex& operator=(const DisassemblerDex&) = delete;
  96. ~DisassemblerDex() override;
  97. // Applies quick checks to determine if |image| *may* point to the start of an
  98. // executable. Returns true on success.
  99. static bool QuickDetect(ConstBufferView image);
  100. // Disassembler:
  101. ExecutableType GetExeType() const override;
  102. std::string GetExeTypeString() const override;
  103. std::vector<ReferenceGroup> MakeReferenceGroups() const override;
  104. // Functions that return reference readers. These follow canonical order of
  105. // *locations* (unlike targets for ReferenceType). This allows functions with
  106. // similar parsing logic to appear togeter.
  107. std::unique_ptr<ReferenceReader> MakeReadStringIdToStringData(offset_t lo,
  108. offset_t hi);
  109. std::unique_ptr<ReferenceReader> MakeReadTypeIdToDescriptorStringId32(
  110. offset_t lo,
  111. offset_t hi);
  112. std::unique_ptr<ReferenceReader> MakeReadProtoIdToShortyStringId32(
  113. offset_t lo,
  114. offset_t hi);
  115. std::unique_ptr<ReferenceReader> MakeReadProtoIdToReturnTypeId32(offset_t lo,
  116. offset_t hi);
  117. std::unique_ptr<ReferenceReader> MakeReadProtoIdToParametersTypeList(
  118. offset_t lo,
  119. offset_t hi);
  120. std::unique_ptr<ReferenceReader> MakeReadFieldToClassTypeId16(offset_t lo,
  121. offset_t hi);
  122. std::unique_ptr<ReferenceReader> MakeReadFieldToTypeId16(offset_t lo,
  123. offset_t hi);
  124. std::unique_ptr<ReferenceReader> MakeReadFieldToNameStringId32(offset_t lo,
  125. offset_t hi);
  126. std::unique_ptr<ReferenceReader> MakeReadMethodIdToClassTypeId16(offset_t lo,
  127. offset_t hi);
  128. std::unique_ptr<ReferenceReader> MakeReadMethodIdToProtoId16(offset_t lo,
  129. offset_t hi);
  130. std::unique_ptr<ReferenceReader> MakeReadMethodIdToNameStringId32(
  131. offset_t lo,
  132. offset_t hi);
  133. std::unique_ptr<ReferenceReader> MakeReadClassDefToClassTypeId32(offset_t lo,
  134. offset_t hi);
  135. std::unique_ptr<ReferenceReader> MakeReadClassDefToSuperClassTypeId32(
  136. offset_t lo,
  137. offset_t hi);
  138. std::unique_ptr<ReferenceReader> MakeReadClassDefToInterfacesTypeList(
  139. offset_t lo,
  140. offset_t hi);
  141. std::unique_ptr<ReferenceReader> MakeReadClassDefToSourceFileStringId32(
  142. offset_t lo,
  143. offset_t hi);
  144. std::unique_ptr<ReferenceReader> MakeReadClassDefToAnnotationDirectory(
  145. offset_t lo,
  146. offset_t hi);
  147. std::unique_ptr<ReferenceReader> MakeReadClassDefToClassData(offset_t lo,
  148. offset_t hi);
  149. std::unique_ptr<ReferenceReader> MakeReadClassDefToStaticValuesEncodedArray(
  150. offset_t lo,
  151. offset_t hi);
  152. std::unique_ptr<ReferenceReader> MakeReadCallSiteIdToCallSite32(offset_t lo,
  153. offset_t hi);
  154. std::unique_ptr<ReferenceReader> MakeReadMethodHandleToFieldId16(offset_t lo,
  155. offset_t hi);
  156. std::unique_ptr<ReferenceReader> MakeReadMethodHandleToMethodId16(
  157. offset_t lo,
  158. offset_t hi);
  159. std::unique_ptr<ReferenceReader> MakeReadTypeListToTypeId16(offset_t lo,
  160. offset_t hi);
  161. std::unique_ptr<ReferenceReader> MakeReadAnnotationSetToAnnotation(
  162. offset_t lo,
  163. offset_t hi);
  164. std::unique_ptr<ReferenceReader> MakeReadAnnotationSetRefListToAnnotationSet(
  165. offset_t lo,
  166. offset_t hi);
  167. std::unique_ptr<ReferenceReader>
  168. MakeReadAnnotationsDirectoryToClassAnnotationSet(offset_t lo, offset_t hi);
  169. std::unique_ptr<ReferenceReader> MakeReadAnnotationsDirectoryToFieldId32(
  170. offset_t lo,
  171. offset_t hi);
  172. std::unique_ptr<ReferenceReader>
  173. MakeReadAnnotationsDirectoryToFieldAnnotationSet(offset_t lo, offset_t hi);
  174. std::unique_ptr<ReferenceReader> MakeReadAnnotationsDirectoryToMethodId32(
  175. offset_t lo,
  176. offset_t hi);
  177. std::unique_ptr<ReferenceReader>
  178. MakeReadAnnotationsDirectoryToMethodAnnotationSet(offset_t lo, offset_t hi);
  179. std::unique_ptr<ReferenceReader>
  180. MakeReadAnnotationsDirectoryToParameterMethodId32(offset_t lo, offset_t hi);
  181. std::unique_ptr<ReferenceReader>
  182. MakeReadAnnotationsDirectoryToParameterAnnotationSetRef(offset_t lo,
  183. offset_t hi);
  184. std::unique_ptr<ReferenceReader> MakeReadCodeToStringId16(offset_t lo,
  185. offset_t hi);
  186. std::unique_ptr<ReferenceReader> MakeReadCodeToStringId32(offset_t lo,
  187. offset_t hi);
  188. std::unique_ptr<ReferenceReader> MakeReadCodeToTypeId16(offset_t lo,
  189. offset_t hi);
  190. std::unique_ptr<ReferenceReader> MakeReadCodeToProtoId16(offset_t lo,
  191. offset_t hi);
  192. std::unique_ptr<ReferenceReader> MakeReadCodeToFieldId16(offset_t lo,
  193. offset_t hi);
  194. std::unique_ptr<ReferenceReader> MakeReadCodeToMethodId16(offset_t lo,
  195. offset_t hi);
  196. std::unique_ptr<ReferenceReader> MakeReadCodeToCallSiteId16(offset_t lo,
  197. offset_t hi);
  198. std::unique_ptr<ReferenceReader> MakeReadCodeToMethodHandle16(offset_t lo,
  199. offset_t hi);
  200. std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode8(offset_t lo,
  201. offset_t hi);
  202. std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode16(offset_t lo,
  203. offset_t hi);
  204. std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode32(offset_t lo,
  205. offset_t hi);
  206. // Functions that return reference writers. Different readers may share a
  207. // common writer. Therefore these loosely follow canonical order of locations,
  208. std::unique_ptr<ReferenceWriter> MakeWriteStringId16(MutableBufferView image);
  209. std::unique_ptr<ReferenceWriter> MakeWriteStringId32(MutableBufferView image);
  210. std::unique_ptr<ReferenceWriter> MakeWriteTypeId16(MutableBufferView image);
  211. std::unique_ptr<ReferenceWriter> MakeWriteTypeId32(MutableBufferView image);
  212. std::unique_ptr<ReferenceWriter> MakeWriteProtoId16(MutableBufferView image);
  213. std::unique_ptr<ReferenceWriter> MakeWriteFieldId16(MutableBufferView image);
  214. std::unique_ptr<ReferenceWriter> MakeWriteFieldId32(MutableBufferView image);
  215. std::unique_ptr<ReferenceWriter> MakeWriteMethodId16(MutableBufferView image);
  216. std::unique_ptr<ReferenceWriter> MakeWriteMethodId32(MutableBufferView image);
  217. std::unique_ptr<ReferenceWriter> MakeWriteCallSiteId16(
  218. MutableBufferView image);
  219. std::unique_ptr<ReferenceWriter> MakeWriteMethodHandle16(
  220. MutableBufferView image);
  221. std::unique_ptr<ReferenceWriter> MakeWriteRelCode8(MutableBufferView image);
  222. std::unique_ptr<ReferenceWriter> MakeWriteRelCode16(MutableBufferView image);
  223. std::unique_ptr<ReferenceWriter> MakeWriteRelCode32(MutableBufferView image);
  224. std::unique_ptr<ReferenceWriter> MakeWriteAbs32(MutableBufferView image);
  225. private:
  226. friend Disassembler;
  227. using MapItemMap = std::map<uint16_t, const dex::MapItem*>;
  228. // Disassembler:
  229. bool Parse(ConstBufferView image) override;
  230. bool ParseHeader();
  231. raw_ptr<const dex::HeaderItem> header_ = nullptr;
  232. int dex_version_ = 0;
  233. MapItemMap map_item_map_ = {};
  234. dex::MapItem string_map_item_ = {};
  235. dex::MapItem type_map_item_ = {};
  236. dex::MapItem proto_map_item_ = {};
  237. dex::MapItem field_map_item_ = {};
  238. dex::MapItem method_map_item_ = {};
  239. dex::MapItem class_def_map_item_ = {};
  240. dex::MapItem call_site_map_item_ = {};
  241. dex::MapItem method_handle_map_item_ = {};
  242. dex::MapItem type_list_map_item_ = {};
  243. dex::MapItem annotation_set_ref_list_map_item_ = {};
  244. dex::MapItem annotation_set_map_item_ = {};
  245. dex::MapItem code_map_item_ = {};
  246. dex::MapItem annotations_directory_map_item_ = {};
  247. // Sorted list of offsets of parsed items in |image_|.
  248. std::vector<offset_t> code_item_offsets_;
  249. std::vector<offset_t> type_list_offsets_;
  250. std::vector<offset_t> annotation_set_ref_list_offsets_;
  251. std::vector<offset_t> annotation_set_offsets_;
  252. std::vector<offset_t> annotations_directory_item_offsets_;
  253. std::vector<offset_t> annotations_directory_item_field_annotation_offsets_;
  254. std::vector<offset_t> annotations_directory_item_method_annotation_offsets_;
  255. std::vector<offset_t>
  256. annotations_directory_item_parameter_annotation_offsets_;
  257. };
  258. } // namespace zucchini
  259. #endif // COMPONENTS_ZUCCHINI_DISASSEMBLER_DEX_H_