1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
|
/* Copyright 2017 R. Thomas
* Copyright 2017 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LIEF_ART_JAVA_STRUCTURES_H_
#define LIEF_ART_JAVA_STRUCTURES_H_
#include <cstring>
#include <tuple>
#include "LIEF/types.hpp"
#include "LIEF/ART/enums.hpp"
#include "LIEF/ART/type_traits.hpp"
namespace LIEF {
//! @brief Namespace related to the LIEF's ART module
namespace ART {
struct no_brooks_read_barrier_t {};
// ======================
// Android 6.0.1 - ART 17
// ======================
namespace ART_17 {
//! @brief Namespace related to the Java part of ART 17
namespace Java {
using heap_reference_t = uint32_t;
struct brooks_read_barrier_t {
uint32_t x_rb_ptr;
uint32_t x_xpadding;
};
template<class T>
struct jobject_t {
heap_reference_t klass;
uint32_t monitor;
T brooks_read_barrier;
};
template<>
struct jobject_t<no_brooks_read_barrier_t> {
heap_reference_t klass;
uint32_t monitor;
};
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jarray_t {
jobject_t<T> object;
int32_t length;
uint32_t* elements;
};
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jclass_t {
jobject_t<T> object;
heap_reference_t class_loader;
heap_reference_t component_type;
heap_reference_t dex_cache;
heap_reference_t dex_cache_strings;
heap_reference_t iftable;
heap_reference_t name;
heap_reference_t super_class;
heap_reference_t verify_error_class;
heap_reference_t vtable;
uint32_t access_flags;
uint64_t direct_methods;
uint64_t ifields;
uint64_t sfields;
uint64_t virtual_methods;
uint32_t class_size;
uint32_t clinit_thread_id;
int32_t dex_class_def_idx;
int32_t dex_type_idx;
uint32_t num_direct_methods;
uint32_t num_instance_fields;
uint32_t num_reference_instance_fields;
uint32_t num_reference_static_fields;
uint32_t num_static_fields;
uint32_t num_virtual_methods;
uint32_t object_size;
uint32_t primitive_type;
uint32_t reference_instance_offsets;
int32_t status;
};
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jstring_t {
jobject_t<T> object;
int32_t count;
uint32_t hash_code;
uint16_t* value;
};
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jdex_cache_t {
jobject_t<T> object;
heap_reference_t dex;
heap_reference_t location;
heap_reference_t resolved_fields;
heap_reference_t resolved_methods;
heap_reference_t resolved_types;
heap_reference_t strings;
uint64_t dex_file;
};
} // Namespace Java
} // Namespace ART_17
// ======================
// Android 7.0.0 - ART 29
// ======================
namespace ART_29 {
//! @brief Namespace related to the Java part of ART 29
namespace Java {
using heap_reference_t = ART_17::Java::heap_reference_t;
using brooks_read_barrier_t = ART_17::Java::brooks_read_barrier_t;
template<class T = no_brooks_read_barrier_t>
using jobject_t = ART_17::Java::jobject_t<T>;
template<class T = no_brooks_read_barrier_t>
using jarray_t = ART_17::Java::jarray_t<T>;
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jclass_t {
jobject_t<T> object;
heap_reference_t annotation_type; // ADDED in ART 29
heap_reference_t class_loader;
heap_reference_t component_type;
heap_reference_t dex_cache;
// heap_reference_t dex_cache_strings; // REMOVED in ART 29
heap_reference_t iftable;
heap_reference_t name;
heap_reference_t super_class;
heap_reference_t verify_error; // Type CHANGED from Class to Object
heap_reference_t vtable;
uint32_t access_flags;
uint64_t dex_cache_strings; // direct_methods REPLACED with dex_cache_string
uint64_t ifields;
uint64_t methods; // ADDED in ART 29
uint64_t sfields;
uint32_t class_flags; // virtual_methods REPLACED with class_flags
uint32_t class_size;
uint32_t clinit_thread_id;
int32_t dex_class_def_idx;
int32_t dex_type_idx;
// uint32_t num_direct_methods; // REMOVED in ART 29
// uint32_t num_instance_fields; // REMOVED in ART 29
uint32_t num_reference_instance_fields;
uint32_t num_reference_static_fields;
// uint32_t num_static_fields; // REMOVED in ART 29
// uint32_t num_virtual_methods; // REMOVED in ART 29
uint32_t object_size;
uint32_t primitive_type;
uint32_t reference_instance_offsets;
int32_t status;
uint16_t copied_methods_offset; // ADDED in ART 29
uint16_t virtual_methods_offset; // ADDED in ART 29
};
// No changes in jstring structure
template<class T = no_brooks_read_barrier_t>
using jstring_t = ART_17::Java::jstring_t<T>;
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jdex_cache_t {
jobject_t<T> object;
heap_reference_t dex;
heap_reference_t location;
uint64_t dex_file; // LOCATION CHANGED
uint64_t resolved_fields; // TYPE CHANGED from heap_reference_t to uint64_t
uint64_t resolved_methods; // TYPE CHANGED from heap_reference_t to uint64_t
uint64_t resolved_types; // TYPE CHANGED from heap_reference_t to uint64_t
uint64_t strings; // TYPE CHANGED from heap_reference_t to uint64_t
uint32_t num_resolved_fields; // ADDED in ART 29
uint32_t num_resolved_methods; // ADDED in ART 29
uint32_t num_resolved_types; // ADDED in ART 29
uint32_t num_strings; // ADDED in ART 29
};
} // Namespace Java
} // Namespace ART_29
// ======================
// Android 7.1.X - ART 30
// ======================
namespace ART_30 {
//! @brief Namespace related to the Java part of ART 30
namespace Java {
using heap_reference_t = ART_29::Java::heap_reference_t;
using brooks_read_barrier_t = ART_29::Java::brooks_read_barrier_t;
template<class T = no_brooks_read_barrier_t>
using jobject_t = ART_29::Java::jobject_t<T>;
template<class T = no_brooks_read_barrier_t>
using jarray_t = ART_29::Java::jarray_t<T>;
template<class T = no_brooks_read_barrier_t>
using jclass_t = ART_29::Java::jclass_t<T>;
// No changes in jstring structure
template<class T = no_brooks_read_barrier_t>
using jstring_t = ART_29::Java::jstring_t<T>;
// No changes in jdex_cache structure
template<class T = no_brooks_read_barrier_t>
using jdex_cache_t = ART_29::Java::jdex_cache_t<T>;
} // Namespace Java
} // Namespace ART_30
// ======================
// Android 8.0.0 - ART 44
// ======================
namespace ART_44 {
//! @brief Namespace related to the Java part of ART 44
namespace Java {
using heap_reference_t = ART_30::Java::heap_reference_t;
using brooks_read_barrier_t = ART_30::Java::brooks_read_barrier_t;
template<class T = no_brooks_read_barrier_t>
using jobject_t = ART_30::Java::jobject_t<T>;
template<class T = no_brooks_read_barrier_t>
using jarray_t = ART_30::Java::jarray_t<T>;
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jclass_t {
jobject_t<T> object;
// heap_reference_t annotation_type; // REMOVED in ART 44
heap_reference_t class_loader;
heap_reference_t component_type;
heap_reference_t dex_cache;
heap_reference_t ext_data; // ADDED in ART 44
heap_reference_t iftable;
heap_reference_t name;
heap_reference_t super_class;
// heap_reference_t verify_error; // REMOVED in ART 44
heap_reference_t vtable;
// uint32_t access_flags; // REMOVED in ART 44
// uint64_t dex_cache_strings; // REMOVED in ART 44
uint64_t ifields;
uint64_t methods;
uint64_t sfields;
uint32_t access_flags; // ADDED in ART 44
uint32_t class_flags;
uint32_t class_size;
uint32_t clinit_thread_id;
int32_t dex_class_def_idx;
int32_t dex_type_idx;
uint32_t num_reference_instance_fields;
uint32_t num_reference_static_fields;
uint32_t object_size;
uint32_t object_size_alloc_fast_path; // ADDED in ART 44
uint32_t primitive_type;
uint32_t reference_instance_offsets;
int32_t status;
uint16_t copied_methods_offset;
uint16_t virtual_methods_offset;
};
// No changes in jstring structure but string can be
// encoded as as char16_t or char (compressed)
// count[0] (LSB) == 1 ----> compressed
// count[0] (LSB) == 0 ----> chat16_t
template<class T = no_brooks_read_barrier_t>
using jstring_t = ART_30::Java::jstring_t<T>;
template<class T = no_brooks_read_barrier_t>
struct ALIGNED_(4) jdex_cache_t {
jobject_t<T> object;
// heap_reference_t dex; // REMOVED in ART 44
heap_reference_t location;
uint32_t num_resolved_call_sites; // ADDED in ART 44 (related to DEX38 format)
uint64_t dex_file;
uint64_t resolved_call_sites; // ADDED in ART 44 (related to DEX38 format)
uint64_t resolved_fields;
uint64_t resolved_method_types; // ADDED in ART 44
uint64_t resolved_methods;
uint64_t resolved_types;
uint64_t strings;
uint32_t num_resolved_fields;
uint32_t num_resolved_methods_types; // ADDED in ART 44
uint32_t num_resolved_methods;
uint32_t num_resolved_types;
uint32_t num_strings;
};
} // Namespace Java
} // Namespace ART_44
// ======================
// Android 8.1.X - ART 46
// ======================
namespace ART_46 {
//! @brief Namespace related to the Java part of ART 46
namespace Java {
using heap_reference_t = ART_44::Java::heap_reference_t;
using brooks_read_barrier_t = ART_44::Java::brooks_read_barrier_t;
template<class T = no_brooks_read_barrier_t>
using jobject_t = ART_44::Java::jobject_t<T>;
template<class T = no_brooks_read_barrier_t>
using jarray_t = ART_44::Java::jarray_t<T>;
template<class T = no_brooks_read_barrier_t>
using jclass_t = ART_44::Java::jclass_t<T>;
template<class T = no_brooks_read_barrier_t>
using jstring_t = ART_44::Java::jstring_t<T>;
template<class T = no_brooks_read_barrier_t>
using jdex_cache_t = ART_44::Java::jdex_cache_t<T>;
} // Namespace Java
} // Namespace ART_46
} // Namespace ART
} // Namespace LIEF
#endif
|