summaryrefslogtreecommitdiff
path: root/plugins/java/java_def.h
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-12-07 21:04:46 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-12-07 21:04:46 (GMT)
commit648bf475951e6d588d13539441d8a0e54eab2706 (patch)
treeb654558a0c6bb4bc9d15eb9d65c124acb8a3522a /plugins/java/java_def.h
parentc980546e8bca6f1c0c340634a4c3640e14fd1228 (diff)
Moved some core features into plugins.
Diffstat (limited to 'plugins/java/java_def.h')
-rw-r--r--plugins/java/java_def.h418
1 files changed, 418 insertions, 0 deletions
diff --git a/plugins/java/java_def.h b/plugins/java/java_def.h
new file mode 100644
index 0000000..2b1da67
--- /dev/null
+++ b/plugins/java/java_def.h
@@ -0,0 +1,418 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * java_def.h - liste des structures et constantes utilisées par le format Java
+ *
+ * Copyright (C) 2010-2017 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _FORMAT_JAVA_JAVA_DEF_H
+#define _FORMAT_JAVA_JAVA_DEF_H
+
+
+#include <stdint.h>
+
+
+
+/* Description des attributs Java */
+typedef struct _java_attribute java_attribute;
+
+
+
+/* ----------------------- ELEMENTS DU RESERVOIR A CONSTANTES ----------------------- */
+
+
+/* Types de données dans le réservoir (§4.4) */
+typedef enum _ConstantPoolTag
+{
+ CONSTANT_EMPTY = 0, /* Non initialisé ou sur 2 */
+
+ CONSTANT_CLASS = 7, /* Classe ou interface */
+ CONSTANT_FIELD_REF = 9, /* Champ ou méthode */
+ CONSTANT_METHOD_REF = 10, /* Champ ou méthode */
+ CONSTANT_INTERFACE_METHOD_REF = 11, /* Champ ou méthode */
+ CONSTANT_STRING = 8, /* Chaîne constante */
+ CONSTANT_INTEGER = 3, /* Valeur entière */
+ CONSTANT_FLOAT = 4, /* Valeur flottante */
+ CONSTANT_LONG = 5, /* Valeur longue */
+ CONSTANT_DOUBLE = 6, /* Valeur double */
+ CONSTANT_NAME_AND_TYPE = 12, /* Prototype complet */
+ CONSTANT_UTF8 = 1 /* Chaîne codée en UTF8 */
+
+} ConstantPoolTag;
+
+
+/* Représentation d'une classe ou d'une interface */
+typedef struct _class_info
+{
+ uint16_t name_index; /* Indice pour le nom */
+
+} class_info;
+
+/* Représentation d'un champ ou d'une méthode */
+typedef struct _ref_info
+{
+ uint16_t class_index; /* Indice de la classe */
+ uint16_t name_and_type_index; /* Prototype associé */
+
+} ref_info;
+
+/* Représentation d'une chaîne constante */
+typedef struct _string_info
+{
+ uint16_t string_index; /* Indice de la valeur UTF8 */
+
+} string_info;
+
+/* Représentation d'une valeur 'int' */
+typedef struct _integer_info
+{
+ uint32_t val; /* Valeur au format 'int' */
+
+} integer_info;
+
+/* Représentation d'une valeur 'float' */
+typedef struct _float_info
+{
+ float val; /* Valeur au format 'float' */
+
+} float_info;
+
+/* Représentation d'une valeur 'long' */
+typedef struct _long_info
+{
+ long val; /* Valeur au format 'long' */
+
+} long_info;
+
+/* Représentation d'une valeur 'double' */
+typedef struct _double_info
+{
+ double val; /* Valeur au format 'double' */
+
+} double_info;
+
+/* Représentation brève d'un champ ou d'une méthode */
+typedef struct _name_and_type_info
+{
+ uint16_t name_index; /* Indice du nom correspondant */
+ uint16_t descriptor_index; /* Prototype associé */
+
+} name_and_type_info;
+
+/* Représentation d'une chaîne codée en UTF8 */
+typedef struct _utf8_info
+{
+ char *bytes; /* Valeur de la chaîne */
+
+} utf8_info;
+
+
+/* Entrée du réservoir */
+typedef struct _constant_pool_entry
+{
+ ConstantPoolTag tag; /* Type d'entrée présente */
+
+ union
+ {
+ class_info class;
+ ref_info ref;
+ string_info string;
+ integer_info int_val;
+ float_info float_val;
+ long_info long_val;
+ double_info double_val;
+ name_and_type_info name_type;
+ utf8_info utf8;
+
+ } info; /* Infos portées par l'entrée */
+
+} constant_pool_entry;
+
+
+
+/* ------------------------ ATTRIBUTS POUR DES ELEMENTS JAVA ------------------------ */
+
+
+/* Types des attributs reconnus */
+typedef enum _JavaAttributeType
+{
+ JAT_NONE = 0, /* Attribu non chargé */
+
+ JAT_CONSTANT_VALUE, /* Valeur constante */
+ JAT_CODE, /* Code exécutable */
+ JAT_EXCEPTIONS, /* Exceptions remontables */
+ JAT_INNER_CLASSES, /* Classes internes */
+ JAT_SYNTHETIC, /* Membre non présent */
+ JAT_SOURCE_FILE, /* Fichier source du code */
+ JAT_LINE_NUMBER, /* Correspondances de débogage */
+ JAT_LOCAL_VARIABLES, /* Variable(s) locale(s) */
+ JAT_DEPRECATED /* Elément vieillot à oublier */
+
+} JavaAttributeType;
+
+/* Représentation d'un attribut à valeur constante (§4.7.2) */
+typedef struct _const_value_attrib
+{
+ uint16_t const_value_index; /* Indice dans le réservoir */
+
+} const_value_attrib;
+
+/* Représentation d'un attribut de code (§4.7.3) */
+
+typedef struct _code_exception
+{
+ uint16_t start_pc; /* Début de la zone couverte */
+ uint16_t end_pc; /* Fin de la zone couverte */
+ uint16_t handler_pc; /* Début du gestionnaire */
+ uint16_t catch_type; /* Indice du type d'exception */
+
+} code_exception;
+
+typedef struct _code_attrib
+{
+ uint16_t max_stack; /* Taille maximale de la pile */
+ uint16_t max_locals; /* Nombre de variables (!) */
+ uint32_t code_length; /* Taille du code référencé */
+
+ off_t content; /* Début du code exécutable */
+
+ code_exception *exceptions; /* Exceptions gérées */
+ uint16_t exceptions_count; /* Nombre de ces exceptions */
+
+ java_attribute *attributes; /* Attributs liés au code */
+ uint16_t attributes_count; /* Nombre de ces attributs */
+
+} code_attrib;
+
+/* Représentation d'un attribut fixant les exceptions remontables (§4.7.4) */
+
+typedef struct _exceptions_attrib
+{
+ uint16_t *throw; /* Exceptions remontées */
+ uint16_t throw_count; /* Nombre de ces exceptions */
+
+} exceptions_attrib;
+
+/* Représentation d'un attribut présentant les classes internes (§4.7.5) */
+
+typedef enum _InnerClassAccessFlags
+{
+ ICA_PUBLIC = 0x0001, /* Elément public */
+ ICA_PRIVATE = 0x0002, /* Elément privé */
+ ICA_PROTECTED = 0x0004, /* Elément sous protection */
+ ICA_STATIC = 0x0008, /* Elément statique */
+ ICA_FINAL = 0x0010, /* Elément défini un seule fois*/
+ ICA_INTERFACE = 0x0200, /* Déclaration d'interface */
+ ICA_ABSTRACT = 0x0400 /* Déclaré comme abstrait */
+
+} InnerClassAccessFlags;
+
+typedef struct _inner_class
+{
+ uint16_t inner_class_info_index; /* Propriétés de la classe */
+ uint16_t outer_class_info_index; /* Propriétés de la parente */
+ uint16_t inner_name_index; /* Nom de la classe */
+ InnerClassAccessFlags access; /* Droits d'accès */
+
+} inner_class;
+
+typedef struct _inner_classes_attrib
+{
+ inner_class *classes; /* Classes internes */
+ uint16_t classes_count; /* Nombre de ces classe */
+
+} inner_classes_attrib;
+
+/* Représentation d'un fichier source (§4.7.7) */
+typedef struct _source_file_attrib
+{
+ uint16_t source_file_index; /* Indice dans le réservoir */
+
+} source_file_attrib;
+
+/* Représentation des correspondances entre lignes et code (§4.7.8) */
+
+typedef struct _pc_and_line
+{
+ uint16_t start_pc; /* Début de la zone visée */
+ uint16_t number; /* Numéro de ligne du code */
+
+} pc_and_line;
+
+typedef struct _line_number_attrib
+{
+ pc_and_line *lines; /* Correspondances code/source */
+ uint16_t lines_count; /* Nombre de correspondances */
+
+} line_number_attrib;
+
+/* Représentation des variables locales (§4.7.9) */
+
+typedef struct _local_variable
+{
+ uint16_t start_pc; /* Position dans le code */
+ uint16_t length; /* Taille de la variable */
+ uint16_t name_index; /* Indice nominal de réservoir */
+ uint16_t descriptor_index; /* Type de la variable */
+ uint16_t index; /* Place dans la liste complète*/
+
+} local_variable;
+
+typedef struct _local_variables_attrib
+{
+ local_variable *vars; /* Variables locales */
+ uint16_t vars_count; /* Nombre de ces variables */
+
+} local_variables_attrib;
+
+/* Description des attributs Java */
+struct _java_attribute
+{
+ JavaAttributeType type; /* Type d'attribut représenté */
+
+ union
+ {
+ const_value_attrib const_value;
+ code_attrib code;
+ exceptions_attrib exceptions;
+ inner_classes_attrib inner_classes;
+ source_file_attrib source_file;
+ line_number_attrib line_number;
+ local_variables_attrib local_vars;
+
+ } info; /* Infos portées par l'attribut*/
+
+};
+
+
+
+/* ---------------------------- CHAMPS POUR CLASSES JAVA ---------------------------- */
+
+
+/* Types d'accès aux champs (§4.5) */
+typedef enum _FieldAccessFlags
+{
+ FAC_PUBLIC = 0x0001, /* Elément public */
+ FAC_PRIVATE = 0x0002, /* Elément privé */
+ FAC_PROTECTED = 0x0004, /* Elément sous protection */
+ FAC_STATIC = 0x0008, /* Elément statique */
+ FAC_FINAL = 0x0010, /* Elément défini un seule fois*/
+ FAC_VOLATILE = 0x0040, /* Elément sans cache */
+ FAC_TRANSIENT = 0x0080 /* Elément ni lu ni écrit... */
+
+} FieldAccessFlags;
+
+/* Description d'un champ Java */
+typedef struct _java_field
+{
+ FieldAccessFlags access; /* Droits d'accès */
+
+ uint16_t name_index; /* Nom dans le réservoir */
+ uint16_t descriptor_index; /* Prototype au même endroit */
+
+ java_attribute *attributes; /* Attributs liés au champ */
+ uint16_t attributes_count; /* Nombre de ces attributs */
+
+} java_field;
+
+
+
+/* --------------------------- METHODES POUR CLASSES JAVA --------------------------- */
+
+
+/* Types d'accès aux champs (§4.6) */
+typedef enum _MethodAccessFlags
+{
+ MAC_PUBLIC = 0x0001, /* Elément public */
+ MAC_PRIVATE = 0x0002, /* Elément privé */
+ MAC_PROTECTED = 0x0004, /* Elément sous protection */
+ MAC_STATIC = 0x0008, /* Elément statique */
+ MAC_FINAL = 0x0010, /* Elément défini un seule fois*/
+ MAC_SYNCHRONIZED = 0x0020, /* Elément avec mutex natif */
+ MAC_NATIVE = 0x0100, /* Elément conçu sans Java */
+ MAC_ABSTRACT = 0x0400, /* Elément sans implantation */
+ MAC_STRICT = 0x0800 /* Elément déclaré stricte FP */
+
+} MethodAccessFlags;
+
+/* Description d'une méthode Java */
+typedef struct _java_method
+{
+ MethodAccessFlags access; /* Droits d'accès */
+
+ uint16_t name_index; /* Nom dans le réservoir */
+ uint16_t descriptor_index; /* Prototype au même endroit */
+
+ java_attribute *attributes; /* Attributs liés à la méthode */
+ uint16_t attributes_count; /* Nombre de ces attributs */
+
+} java_method;
+
+
+
+/* ---------------------------- LISTE DES DROITS D'ACCES ---------------------------- */
+
+
+/* Types d'accès (§4.1) */
+typedef enum _ClassAccessFlags
+{
+ CAC_PUBLIC = 0x0001, /* Elément public */
+ CAC_FINAL = 0x0010, /* Déclaré comme final */
+ CAC_SUPER = 0x0020, /* Traitement spécial */
+ CAC_INTERFACE = 0x0200, /* Déclaration d'interface */
+ CAC_ABSTRACT = 0x0400 /* Déclaré comme abstrait */
+
+} ClassAccessFlags;
+
+
+
+/* --------------------------- DESCRIPTION DU FORMAT JAVA --------------------------- */
+
+
+/* En-tête de tout programe Java */
+typedef struct _java_header
+{
+ uint16_t minor_version; /* Numéro de révision mineur */
+ uint16_t major_version; /* Numéro de révision majeur */
+
+ constant_pool_entry *pool; /* Réservoir de constantes */
+ uint16_t pool_len; /* Quantité de ces éléments */
+
+ ClassAccessFlags access; /* Type de classe/interface */
+
+ uint16_t this_class; /* Infos sur la classe */
+ uint16_t super_class; /* Infos sur la classe parente */
+
+ uint16_t *interfaces; /* Interfaces intégrées */
+ uint16_t interfaces_count; /* Nombre de ces interfaces */
+
+ java_field *fields; /* Champs de la classe */
+ uint16_t fields_count; /* Nombre de champs présents */
+
+ java_method *methods; /* Méthodes de la classe */
+ uint16_t methods_count; /* Nombre de méthodes listées */
+
+ java_attribute *attributes; /* Attributs liés à la classe */
+ uint16_t attributes_count; /* Nombre de ces attributs */
+
+} java_header;
+
+
+
+#endif /* _FORMAT_JAVA_JAVA_DEF_H */