/* Chrysalide - Outil d'analyse de fichiers binaires
* java_def.h - liste des structures et constantes utilisées par le format Java
*
* Copyright (C) 2018 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 .
*/
#ifndef _FORMAT_JAVA_JAVA_DEF_H
#define _FORMAT_JAVA_JAVA_DEF_H
#include
/* 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 */