/* Chrysalide - Outil d'analyse de fichiers binaires * list.c - ensemble des jeux de commandes de JDWP * * Copyright (C) 2010-2012 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 Foobar. If not, see . */ #include "list.h" #include #include "thread.h" #include "vm.h" /* Consitue un contenu binaire à partir d'une charge utile. */ typedef bool (* set_jdwp_payload_fc) (const jdwp_payload *, const jdwp_cmd_vm_id_sizes_reply *, bin_t *, off_t *); /* Reconstitue une charge utile à partir d'un contenu binaire. */ typedef bool (* get_jdwp_payload_fc) (const bin_t *, off_t, const jdwp_cmd_vm_id_sizes_reply *, jdwp_payload *); /* Libère le contenu d'une charge utile. */ typedef void (* free_jdwp_payload_fc) (jdwp_payload *); /* Commandes JDWP */ typedef struct _jdwp_command { set_jdwp_payload_fc set_payload; /* Constitution du binaire */ free_jdwp_payload_fc free_set_payload; /* Libération de la mémoire */ get_jdwp_payload_fc get_payload; /* Constitution de la charge */ free_jdwp_payload_fc free_got_payload; /* Libération de la mémoire */ } jdwp_command; /* Energistrement des différents jeux */ static jdwp_command _commands[][256] = { [JDWP_CST_VIRTUAL_MACHINE] = { [JDWP_CMD_VM_VERSION] = { .set_payload = (set_jdwp_payload_fc)NULL, .free_set_payload = (free_jdwp_payload_fc)NULL, .get_payload = (get_jdwp_payload_fc)get_jdwp_vm_version, .free_got_payload = (free_jdwp_payload_fc)free_jdwp_vm_version }, [JDWP_CMD_VM_ALL_THREADS] = { .set_payload = (set_jdwp_payload_fc)NULL, .free_set_payload = (free_jdwp_payload_fc)NULL, .get_payload = (get_jdwp_payload_fc)get_jdwp_vm_all_threads, .free_got_payload = (free_jdwp_payload_fc)free_jdwp_all_threads }, [JDWP_CMD_VM_ID_SIZES] = { .set_payload = (set_jdwp_payload_fc)NULL, .free_set_payload = (free_jdwp_payload_fc)NULL, .get_payload = (get_jdwp_payload_fc)get_jdwp_vm_id_sizes, .free_got_payload = (free_jdwp_payload_fc)NULL } }, [JDWP_CST_THREAD_REFERENCE] = { [JDWP_CMD_THREAD_NAME] = { .set_payload = (set_jdwp_payload_fc)set_jdwp_thread_name, .free_set_payload = (free_jdwp_payload_fc)NULL, .get_payload = (get_jdwp_payload_fc)get_jdwp_thread_name, .free_got_payload = (free_jdwp_payload_fc)free_jdwp_thread_name_reply }, [JDWP_CMD_THREAD_FRAMES] = { .set_payload = (set_jdwp_payload_fc)set_jdwp_thread_frames, .free_set_payload = (free_jdwp_payload_fc)NULL, .get_payload = (get_jdwp_payload_fc)get_jdwp_thread_frames, .free_got_payload = (free_jdwp_payload_fc)free_jdwp_thread_frames_reply } } }; /****************************************************************************** * * * Paramètres : payload = charge utile à transcrire. * * set = jeu de commandes concerné. * * cmd = identifiant d'une commande donnée. * * sizes = références pour la valeur des tailles dynamiques. * * blob = futures données binaires brutes. [OUT] * * len = quantité de données valides. [OUT] * * * * Description : Reconstitue un contenu binaire à partir d'une charge utile. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool set_jdwp_payload(const jdwp_payload *payload, uint8_t set, uint8_t cmd, const jdwp_cmd_vm_id_sizes_reply *sizes, bin_t *blob, off_t *len) { bool result; /* Bilan à retourner */ if (_commands[set][cmd].set_payload == NULL) result = false; else result = _commands[set][cmd].set_payload(payload, sizes, blob, len); return result; } /****************************************************************************** * * * Paramètres : blob = ensemble de données binaires brutes. * * len = quantité de données valides. * * set = jeu de commandes concerné. * * cmd = identifiant d'une commande donnée. * * sizes = références pour la valeur des tailles dynamiques. * * payload = charge utile à reconstituer. [OUT] * * * * Description : Reconstitue une charge utile à partir d'un contenu binaire. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool get_jdwp_payload(const bin_t *blob, off_t len, uint8_t set, uint8_t cmd, const jdwp_cmd_vm_id_sizes_reply *sizes, jdwp_payload *payload) { bool result; /* Bilan à retourner */ if (_commands[set][cmd].get_payload == NULL) result = false; else result = _commands[set][cmd].get_payload(blob, len, sizes, payload); return result; } /****************************************************************************** * * * Paramètres : payload = charge utile à supprimer de la mémoire. * * got = type de charge utile à traiter. * * set = jeu de commandes concerné. * * cmd = identifiant d'une commande donnée. * * * * Description : Libère le contenu d'une charge utile. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void free_jdwp_payload(jdwp_payload *payload, bool got, uint8_t set, uint8_t cmd) { if (got) { if (_commands[set][cmd].free_got_payload != NULL) _commands[set][cmd].free_got_payload(payload); } else { if (_commands[set][cmd].free_set_payload != NULL) _commands[set][cmd].free_set_payload(payload); } }