diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-04-24 10:16:17 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-04-24 10:16:17 (GMT) |
commit | e56b4db3aae87f0458319019635dea4968a5c529 (patch) | |
tree | bbbbbca3921dca2add25f74d73096900254fe301 /src/format/java/java_def.h | |
parent | fb12cfc1727ba949b70a48ee042a2aec9ebbb407 (diff) |
Updated a little bit the Java part (welcome back).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@154 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/java/java_def.h')
-rwxr-xr-x | src/format/java/java_def.h | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/src/format/java/java_def.h b/src/format/java/java_def.h new file mode 100755 index 0000000..fb700a0 --- /dev/null +++ b/src/format/java/java_def.h @@ -0,0 +1,418 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * java_def.h - liste des structures et constantes utilisées par le format Java + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA 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. + * + * OpenIDA 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 Foobar. 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 */ |