KUNAI Static Analyzer
Kunai is a library for doing static binary analysis of Dalvik.
Loading...
Searching...
No Matches
dvm_types.hpp
1//--------------------------------------------------------------------*- C++ -*-
2// Kunai-static-analyzer: library for doing analysis of dalvik files
3// @author Farenain <kunai.static.analysis@gmail.com>
4// @author Ernesto Java <javaernesto@gmail.com>
5//
6// @file dvm_types.hpp
7// @brief Useful types for working with the DVM
8#ifndef KUNAI_DEX_DVM_DVM_TYPES_HPP
9#define KUNAI_DEX_DVM_DVM_TYPES_HPP
10
11#include <iostream>
12#include <unordered_map>
13
14namespace KUNAI
15{
16 namespace DEX
17 {
18 static const std::uint32_t ENDIAN_CONSTANT = 0x12345678;
19 static const std::uint32_t REVERSE_ENDIAN_CONSTANT = 0x78563412;
20 static const std::uint32_t NO_INDEX = 0xFFFFFFFF;
21
22 static const std::uint8_t dex_magic[] = {'d', 'e', 'x', '\n'};
23 static const std::uint8_t dex_magic_035[] = {'d', 'e', 'x', '\n', '0', '3', '5', '\0'};
24 static const std::uint8_t dex_magic_037[] = {'d', 'e', 'x', '\n', '0', '3', '7', '\0'};
25 static const std::uint8_t dex_magic_038[] = {'d', 'e', 'x', '\n', '0', '3', '8', '\0'};
26 static const std::uint8_t dex_magic_039[] = {'d', 'e', 'x', '\n', '0', '3', '9', '\0'};
27
28 namespace TYPES
29 {
32 enum REF_TYPE
33 {
34 REF_NEW_INSTANCE = 0x22,
35 REF_CLASS_USAGE = 0x1c,
36 INVOKE_VIRTUAL = 0x6e,
37 INVOKE_SUPER = 0x6f,
38 INVOKE_DIRECT = 0x70,
39 INVOKE_STATIC = 0x71,
40 INVOKE_INTERFACE = 0x72,
41 INVOKE_VIRTUAL_RANGE = 0x74,
42 INVOKE_SUPER_RANGE = 0x75,
43 INVOKE_DIRECT_RANGE = 0x76,
44 INVOKE_STATIC_RANGE = 0x77,
45 INVOKE_INTERFACE_RANGE = 0x78
46 };
47
50 enum class Kind
51 {
52 METH = 0,
53 STRING = 1,
54 FIELD = 2,
55 TYPE = 3,
56 PROTO = 9,
57 METH_PROTO = 10,
58 CALL_SITE = 11,
59 VARIES = 4,
60 INLINE_METHOD = 5,
61 VTABLE_OFFSET = 6,
62 FIELD_OFFSET = 7,
63 RAW_STRING = 8,
64 NONE_KIND = 99,
65 };
66
70 enum class Operation
71 {
72 CONDITIONAL_BRANCH_DVM_OPCODE = 0,
73 UNCONDITIONAL_BRANCH_DVM_OPCODE,
74 RET_BRANCH_DVM_OPCODE,
75 MULTI_BRANCH_DVM_OPCODE,
76 CALL_DVM_OPCODE,
77 DATA_MOVEMENT_DVM_OPCODE,
78 FIELD_READ_DVM_OPCODE,
79 FIELD_WRITE_DVM_OPCODE,
80 NONE_OPCODE = 99
81 };
82
84 enum class Operand
85 {
86 REGISTER = 0,
87 LITERAL = 1,
88 RAW = 2,
89 OFFSET = 3,
90
91 KIND = 0x100,
92 };
93
97 enum access_flags
98 {
99 NONE = 0x0,
100 ACC_PUBLIC = 0x1,
101 ACC_PRIVATE = 0x2,
102 ACC_PROTECTED = 0x4,
103 ACC_STATIC = 0x8,
104 ACC_FINAL = 0x10,
105 ACC_SYNCHRONIZED = 0x20,
106 ACC_VOLATILE = 0x40,
107 ACC_BRIDGE = 0x40,
108 ACC_TRANSIENT = 0x80,
109 ACC_VARARGS = 0x80,
110 ACC_NATIVE = 0x100,
111 ACC_INTERFACE = 0x200,
112 ACC_ABSTRACT = 0x400,
113 ACC_STRICT = 0x800,
114 ACC_SYNTHETIC = 0x1000,
115 ACC_ANNOTATION = 0x2000,
116 ACC_ENUM = 0x4000,
117 UNUSED = 0x8000,
118 ACC_CONSTRUCTOR = 0x10000,
119 ACC_DECLARED_SYNCHRONIZED = 0x20000
120 };
121
123 enum class value_format
124 {
125 VALUE_BYTE = 0x0,
126 VALUE_SHORT = 0x2,
127 VALUE_CHAR = 0x3,
128 VALUE_INT = 0x4,
129 VALUE_LONG = 0x6,
130 VALUE_FLOAT = 0x10,
131 VALUE_DOUBLE = 0x11,
132 VALUE_METHOD_TYPE = 0x15,
133 VALUE_METHOD_HANDLE = 0x16,
134 VALUE_STRING = 0x17,
135 VALUE_TYPE = 0x18,
136 VALUE_FIELD = 0x19,
137 VALUE_METHOD = 0x1A,
138 VALUE_ENUM = 0x1B,
139 VALUE_ARRAY = 0x1C,
140 VALUE_ANNOTATION = 0x1D,
141 VALUE_NULL = 0x1E,
142 VALUE_BOOLEAN = 0x1F
143 };
144
146 enum opcodes
147 {
148#define OPCODE(ID, VAL) \
149 ID = VAL,
150#include "Kunai/DEX/DVM/definitions/dvm_types.def"
151 };
152
154 static const std::unordered_map<Kind, std::string> KindString =
155 {
156 {Kind::METH, "METH"},
157 {Kind::STRING, "STRING"},
158 {Kind::TYPE, "TYPE"},
159 {Kind::PROTO, "PROTO"},
160 {Kind::METH_PROTO, "METH_PROTO"},
161 {Kind::CALL_SITE, "CALL_SITE"},
162 {Kind::VARIES, "VARIES"},
163 {Kind::INLINE_METHOD, "INLINE_METHOD"},
164 {Kind::VTABLE_OFFSET, "VTABLE_OFFSET"},
165 {Kind::FIELD_OFFSET, "FIELD_OFFSET"},
166 {Kind::RAW_STRING, "RAW_STRING"},
167 {Kind::NONE_KIND, "NONE"}};
168
170 static const std::unordered_map<access_flags, std::string> ACCESS_FLAGS_STR =
171 {
172 {access_flags::ACC_PUBLIC, "public"},
173 {access_flags::ACC_PRIVATE, "private"},
174 {access_flags::ACC_PROTECTED, "protected"},
175 {access_flags::ACC_STATIC, "static"},
176 {access_flags::ACC_FINAL, "final"},
177 {access_flags::ACC_SYNCHRONIZED, "synchronized"},
178 {access_flags::ACC_BRIDGE, "bridge"},
179 {access_flags::ACC_VARARGS, "varargs"},
180 {access_flags::ACC_NATIVE, "native"},
181 {access_flags::ACC_INTERFACE, "interface"},
182 {access_flags::ACC_ABSTRACT, "abstract"},
183 {access_flags::ACC_STRICT, "strictfp"},
184 {access_flags::ACC_SYNTHETIC, "synthetic"},
185 {access_flags::ACC_ENUM, "enum"},
186 {access_flags::UNUSED, "unused"},
187 {access_flags::ACC_CONSTRUCTOR, "constructor"},
188 {access_flags::ACC_DECLARED_SYNCHRONIZED, "synchronized"}};
189
191 static const std::unordered_map<char, std::string> type_descriptor_map =
192 {
193 {'V', "void"},
194 {'Z', "boolean"},
195 {'B', "byte"},
196 {'S', "short"},
197 {'C', "char"},
198 {'I', "int"},
199 {'J', "long"},
200 {'F', "float"},
201 {'D', "double"}};
202 } // namespace TYPES
203
204 } // namespace DEX
205
206} // namespace KUNAI
207
208#endif
utilities
Definition analysis.hpp:23