/* Chrysalide - Outil d'analyse de fichiers binaires
* method.c - gestion des méthodes Java
*
* Copyright (C) 2009-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 .
*/
#include "method.h"
#include
#include "attribute.h"
#include "../../common/endianness.h"
/* Charge les propriétés d'une méthode de classe. */
bool load_java_method(java_format *, java_method *, off_t *);
/* Décharge les propriétés d'une méthode de classe. */
void unload_java_method(java_format *, java_method *);
/******************************************************************************
* *
* Paramètres : format = description de l'exécutable à compléter. *
* pos = point de lecture à faire évoluer. [OUT] *
* *
* Description : Charge les méthodes d'un binaire Java. *
* *
* Retour : true si l'opération s'est bien déroulée, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
bool load_java_methods(java_format *format, off_t *pos)
{
bool result; /* Bilan à remonter */
uint16_t i; /* Boucle de parcours */
result = read_u16(&format->methods_count, EXE_FORMAT(format)->content, pos,
EXE_FORMAT(format)->length, SRE_BIG);
if (!result) return false;
if (format->methods_count > 0)
{
format->methods = (java_method *)calloc(format->methods_count, sizeof(java_method));
for (i = 0; i < format->methods_count && result; i++)
result = load_java_method(format, &format->methods[i], pos);
}
return result;
}
/******************************************************************************
* *
* Paramètres : format = description de l'exécutable à vider. *
* *
* Description : Décharge les méthodes d'un binaire Java. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void unload_java_methods(java_format *format)
{
uint16_t i; /* Boucle de parcours */
for (i = 0; i < format->methods_count; i++)
unload_java_method(format, &format->methods[i]);
free(format->methods);
}
/******************************************************************************
* *
* Paramètres : format = description de l'exécutable à compléter. *
* method = élément à spécifier. [OUT] *
* pos = point de lecture à faire évoluer. [OUT] *
* *
* Description : Charge les propriétés d'une méthode de classe. *
* *
* Retour : true si l'opération s'est bien déroulée, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
bool load_java_method(java_format *format, java_method *method, off_t *pos)
{
bool result; /* Bilan à retourner */
result = read_u16((uint16_t *)&method->access, EXE_FORMAT(format)->content,
pos, EXE_FORMAT(format)->length, SRE_BIG);
result &= read_u16(&method->name_index, EXE_FORMAT(format)->content,
pos, EXE_FORMAT(format)->length, SRE_BIG);
result &= read_u16(&method->descriptor_index, EXE_FORMAT(format)->content,
pos, EXE_FORMAT(format)->length, SRE_BIG);
result &= load_java_attributes(format, pos,
&method->attributes, &method->attributes_count);
return result;
}
/******************************************************************************
* *
* Paramètres : format = description de l'exécutable à compléter. *
* method = élément à libérer. *
* *
* Description : Décharge les propriétés d'une méthode de classe. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void unload_java_method(java_format *format, java_method *method)
{
if (method->attributes_count > 0)
unload_java_attributes(format, method->attributes, method->attributes_count);
}
/******************************************************************************
* *
* Paramètres : method = élément à traiter. *
* offset = position physique du code de la méthode. [OUT] *
* size = taille du code de la méthode. [OUT] *
* *
* Description : Retrouve le code binaire correspondant à une méthode. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool find_java_method_code_part(const java_method *method, off_t *offset, off_t *size)
{
uint16_t i; /* Boucle de parcours */
for (i = 0; i < method->attributes_count; i++)
if (method->attributes[i].type == JAT_CODE)
{
*offset = method->attributes[i].info.code.content;
*size = method->attributes[i].info.code.code_length;
break;
}
return (i < method->attributes_count);
}